python 解释器中的 exit() 在重写后不工作

exit() in python interpreter not working after overriding

我正在使用本地 python 2.7 解释器来测试一些代码逻辑。 因为,关闭解释器的命令是 "exit()",我分配了一个变量,如

exit = False

在尝试了一些计算之后,当我想退出我的解释器并给出

exit()

它引发了以下错误,

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not callable

我知道可能已经覆盖了一个系统变量,但是这样做有那么容易吗?即使我这样做了,当我试图将它分配给

exit = True

它一直向我抛出 "bool object is not callable" 这样的错误 那么,这里出了什么问题?

I know have overridden a system variable maybe but is it so easy to do that?

您所做的是用全局名称隐藏内置名称。1这样做是完全合法的,事实上有时它很有用。例如:

  • 全局命名空间与模块命名空间相同。如果您不允许在模块中定义阴影 exit,则 sys 将不允许定义 sys.exitio.opencodecs.opengzip.open 也是如此。还有 numpy.minpandas.apply。等等。
  • 编写适用于 2.7 和 3.x 的双版本代码的推荐方法之一涉及使用 future 并放置 3.x 风格的 zip 等. 进入你的全局变量。
  • 有时有一些您不关心的内置函数——它们甚至可能没有记录,或者 documented as “legacy” functions that should have been deprecated back in 2.1 and removed in 2.4 but are still hanging around in 2.7。没有理由强迫你回避这些名字。特别是如果您在甚至没有这些名称的不同解释器或版本上编写代码,然后想 运行 在有的解释器或版本上编写代码。
  • 我不想鼓励的各种快速和肮脏的交互式解释器事情,但我们偶尔都会这样做。

更一般地说,用全局变量隐藏内置函数与用本地变量隐藏内置函数、全局变量或非本地变量是一样的,所以禁止一个而不禁止另一个是很奇怪的。

更一般地说,Python 是围绕“成年人同意”的想法设计的。它不会竭尽全力保护您免受任何可能用来搬起石头砸自己脚的事情的伤害。有一些东西很少有用而且通常会引起麻烦(比如重新分配 None),因此值得添加一些代码来防止它们出现,但在大多数情况下,您可以自由地做即使做这些事情并不总是一个好主意。


And even If I did, when I tried to assign it to

exit = True

it keeps throwing me error like "bool object is not callable" So, what went wrong here?

这不会撤销您所做的事情。这只是意味着内置函数现在被一个值为 True 的全局变量覆盖,而不是一个值为 False 的全局变量。 True 并不比 False.

更可调用

如果要撤消阴影,只需删除阴影全局即可:

del exit 

1. Python 有几个不同的“内置”含义,它们并不完全重叠。 exit 函数没有被编译为内置函数,甚至不是 builtins 模块的一部分,直到它被 site 猴子修补,但它可以通过内置命名空间查找访问,这就是我在这里所说的意思。