编译器Python,为什么一些错误的东西被忽略了



我写了一个Python例程,里面有一个错误:false而不是False。但是,在编译时没有发现它。该程序必须运行到此行以通知不法行为。

为什么会这样?在Python解释器/编译器中,是什么让它如此工作?

你有什么参考吗?

由于 Python 的动态特性,在编译时无法检测到未定义的名称。 仅检查语法;如果语法正常,编译器生成字节码,Python 开始执行代码。

在给定的示例中,您将获得对全局名称 false 的引用。 仅当字节码解释器尝试实际访问此全局名称时,才会收到错误。

为了说明这一点,这里有一个例子。 您认为以下代码执行正常吗?

globals()["snyfr".decode("rot13")] = 17
x = false

它确实如此,因为第一行动态生成一个名为 false 的变量。

你可以把这看作是解释器对何时查找名称的"懒惰":它尽可能晚地这样做,因为程序的其他位可以摆弄它的已知变量字典。

考虑该计划

>>> def foo():
...     return false
... 
>>> def bar():
...     global false
...     false = False
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
NameError: global name 'false' is not defined
>>> bar()
>>> foo()
False

请注意,对foo的第一次调用引发了一个NameError,因为在foo运行Python时不知道false是什么。但bar随后修改了全局范围,并插入false作为False的另一个名称。

这种命名空间清理在编写程序的方式上提供了极大的灵活性。当然,它也删除了许多限制性更强的语言可以为您检查的内容。

最新更新