2016-06-10 72 views
3

假设我有下面的代码在Python:为什么Python在执行前没有发现错误?

a = "WelcomeToTheMachine" 
if a == "DarkSideOfTheMoon": 
    awersdfvsdvdcvd 
print "done!" 

为什么没有这个错误?它甚至如何编译?在Java或C#中,这将在编译期间被发现。

+0

这里'a!=“DarkSideOfTheMoon”',所以if条件的主体永远不会被执行。 – ytk

+0

相关信息[我如何检查Python脚本的语法而不执行它?](http://stackoverflow.com/q/4284313) –

+0

因为在执行前这不是错误。 – jonrsharpe

回答

8

Python不是一种编译语言,这就是为什么你的代码不会抛出编译错误。

Python是一种字节码解释语言。从技术上讲,源代码被“编译”为字节码,但是如果使用PyPy或Pyston,则字节码恰好在时间上(JIT)编译,否则就是逐行解释。

的工作流程如下:

Python代码 - >编译 - >.pyc文件文件 - >解释 - >你的输出

使用标准的Python运行时是什么意思?实质上,所有繁重的工作都是在运行时发生的,与使用C或C++编译时将源代码完整分析并转换为二进制文件不同。

+0

这是一个小编译,实际的语法错误实际上是在编译期间发现的。只是在Python中,运行时会在静态语言中编译阶段的许多事情发生。 – user2357112

+2

另外,Python的标准实现不会执行JIT。 PyPy做JIT,但大多数人没有使用PyPy。 – user2357112

2

在“编译”期间,python几乎只检查你的语法。由于awersdfvsdvdcvd一个有效的标识符,直到该行实际执行时才会引发错误。仅仅因为你使用的是没有定义的名称并不意味着它不能在别处被定义...如:

globals()['awersdfvsdvdcvd'] = 1 

早些时候在文件中就足以抑制NameError会发生如果带有拼写错误的名称的行被执行。

好的,所以不能只查找全局语句呢?答案是“否” - 从模块“foo”,我可以以类似的方式添加到模块“酒吧”的全局。而python无法知道哪些模块将被导入,直到它实际运行(我也可以在运行时动态导入模块)。


注意,多数认为我提到为什么Python作为一门语言无法给你这些事情的警告的原因涉及到的人做疯狂搞砸的事情。有一些工具警告你这些事情(假设你不会做那样的愚蠢的东西)。我最喜欢的是pylint,但几乎任何python linter都应该能够警告你未定义的变量。如果你将一个linter连接到你的编辑器,大部分时间你可以在你真正运行代码之前捕获这些错误。

2

因为Python是一种解释型语言。这意味着如果Python的解释器没有到达那一行,它不会产生任何错误。