重写后,python解释器中的exit()无法正常工作

时间:2018-08-15 17:54:18

标签: python-2.7 python-internals

我正在使用本地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

它不断抛出错误,例如“布尔对象不可调用” 那么,这里出了什么问题?

1 个答案:

答案 0 :(得分:2)

  

我知道可能已覆盖系统变量,但是这样做很容易吗?

您所做的一切都是用一个带有全局名称的内置名称遮盖的。 1 这样做是完全合法的,实际上有时它很有用。例如:

  • 全局名称空间与模块名称空间相同。如果不允许您在模块中定义阴影exit,则不允许sys定义sys.exitio.opencodecs.opengzip.open也是如此。还有numpy.minpandas.apply。依此类推。
  • 编写适用于2.7和3.x的双版本代码的推荐方法之一包括使用future并将3.x样式的zip等放入您的全局变量中。 / li>
  • 有时候,您不需要在意内置的内置程序,它们甚至可能没有文档记录,或者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),因此值得添加一些代码来防止它们发生,但是在大多数情况下,您可以自由执行即使并非总是一个好主意。


  

即使我这样做,当我尝试将其分配给

exit = True
  

它不断向我抛出“无法调用布尔对象”之类的错误,那么,这里出了什么问题?

那不会撤消您所做的事情。这只是意味着内置函数现在被值为True的全局对象而不是值为False的全局对象所遮盖。并且True的可调用性不超过False

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

del exit 

1。 Python具有“内建”的几种不同含义,并不能完全重叠。 exit函数不会编译为内置函数,甚至在builtins进行猴子修补之前,它甚至都不是site模块的一部分,但可以通过内置命名空间查找来访问,这就是我在这里所说的意思。