The new REPL in Python 3.13
treyhunner.com
treyhunner.com
Adding that function to a $PYTHONSTARTUP file will make it available automatically every time you launch the REPL.
It's definitely a hack, but it's a pretty decent workaround for now. I'll likely continue to use it even after the new REPL launches because the textwrap.dedent call will auto-unindent indented code (when pasting from a markdown or reStructuredText file for example).
The actual change here is minor in code and function but Big in implication. It signals that the development finalt after decades of EVERY SINGLE NEW USER going “Why can’t it…” the first time they hit this strange behavior, the old stubborn developers finalt let go of the battle to die on this molehill and made a nano sized step towards an easier world for the end users.
Considering how much Python is valued for being easy to use, it’s incredible it took this long for this to happen.
> >>> exit
> Use exit() or Ctrl-D (i.e. EOF) to exit
If it knows we want to exit, why not just do it facepalm emoji
It's fun because `exit` alone in the REPL will return an object, and you can get the `exit.eof`, where is the message of what the keyword shortcut to call exit is, and it changes depending on the OS.
To clarify, there are two things here: why exit exists in the REPL, and why it's a function. The exit() function is available only in the REPL, and it appears built-in, but it isn't part of the built-in namespace. Instead, exit is loaded automatically by the site module.
Heres is the code with the function site.main that is doing it: https://github.com/python/cpython/blob/8af84b503d0b62a3db0d8... and more specifically here https://github.com/python/cpython/blob/8af84b503d0b62a3db0d8... on setquit
The line builtins.exit = _sitebuiltins.Quitter('exit', eof) shows that exit is set as a function. The Quitter class, which exit is an instance of, has a __call__ method, making it callable, so it as a function.
I don't believe you're wrong not understanding it; it's just that the process isn’t typically explained in detail, especially what happens when you start the REPL. This is why the message "Use exit() instead..." exists in the REPL, because of the need for clarification.
In a nutshell, exit is a function loaded into the built-ins by the site.py module, which automatically activates when the REPL starts. This automatic loading is what makes exit, help, __copyright__ and others available only in the interactive sessions.
[1] I hope it's obvious that special-casing exit in the REPL is a much more constrained special case than print being a keyword and the difference in scope makes all the difference in balancing accessibility and consistency.
I develop on Windows, Mac, and Nix