编译Python,为什么会忽略一些错误的东西?

问题描述 投票:0回答:2

我编写了一个Python例程,其中有一个错误:

false
而不是
False
。但编译时并未发现。程序必须运行到这一行才能通知错误行为。

为什么会这样? Python 解释器/编译器中的什么因素使它能够如此工作?

有什么参考吗?

python compilation interpreter
2个回答
8
投票

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

在给定的示例中,您将获得对全局名称的引用

false
。 只有当字节码解释器尝试实际访问这个全局名称时,您才会收到错误。

为了说明这一点,这里有一个例子。 你认为下面的代码执行得好吗?

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

确实如此,因为第一行动态生成一个名为

false
的变量。


4
投票

您可以将其视为解释器对于何时查找名称“懒惰”:它尽可能晚地这样做,因为程序的其他部分可以摆弄其已知变量的字典。

考虑该计划

>>> 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
的另一个名称。

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

© www.soinside.com 2019 - 2024. All rights reserved.