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

时间:2012-09-16 14:30:29

标签: python compiler-construction compilation interpreter

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

为什么会这样? Python解释器/编译器中有什么东西可以使它工作呢?

你有参考吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

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

实际上,因为第一行动态生成名为false的变量。

答案 1 :(得分: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的另一个名称。

这种名称空间错误允许人们编写程序的方式具有极大的灵活性。当然,它也删除了许多限制性语言可以为您检查的内容。