From 749ac63ac5066531c4007bbd1841bc4aa7d4e524 Mon Sep 17 00:00:00 2001 From: kimbo Date: Wed, 6 Nov 2019 17:11:08 -0700 Subject: [PATCH] raise EOFError in Lib/cmd.py The current behavior of the cmd module is to return the string 'EOF' when the program receives an EOF (e.g. when you press ctrl + d, or when the end of a file is reached). When you're writing some kind of REPL, you often want to exit when when you get an EOF (for example, python's REPL exits when you press ctrl + d). The way to achieve that functionality here is to create a function called `do_EOF` in your subclass of `cmd.Cmd`, and call `exit()` If you want some other behavior when you get an EOF, you can put that in `do_EOF` instead. This is problematic for two main reasons: 1. `EOF` shows up as an undocumented command when you type `help`. It's not that big of a deal, but it's definitely not ideal (and perhaps confusing). 2. If you type `EOF` into the terminal, it will call your `do_EOF` function. If your `do_EOF` function exits, typing `do_EOF` will exit the program. Seems rather silly. I propose the cmd class NOT catch the EOFError. That will eliminate both of the above problems. I realize this could be an issue with backwards compatibility and such, but I don't think it would require much adjustment (maybe a couple lines). See also https://bugs.python.org/issue13214 and https://github.com/python/cpython/pull/13536 --- Lib/cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/cmd.py b/Lib/cmd.py index 859e91096d8f57..a738fe1d3fdcd1 100644 --- a/Lib/cmd.py +++ b/Lib/cmd.py @@ -125,7 +125,7 @@ def cmdloop(self, intro=None): try: line = input(self.prompt) except EOFError: - line = 'EOF' + raise else: self.stdout.write(self.prompt) self.stdout.flush()