为什么Python在执行之前没有发现错误?

2024-09-29 00:16:38 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在Python中有以下代码:

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

为什么这个错误?它是如何编译的?在Java或C中,这会在编译过程中被发现。在


Tags: 代码if过程错误javaprintdonedarksideofthemoon
3条回答

Python不是一种编译语言,所以你的代码不会抛出编译错误。在

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

工作流程如下:

您的Python代码->;编译器

使用标准的python运行时这意味着什么?基本上所有的繁重工作都在运行时发生,不像C或C++,在编译时,它的源代码被完整地分析和翻译成二进制。在

在“编译”期间,python几乎只检查语法。由于awersdfvsdvdcvd是一个有效的标识符,因此在该行实际执行之前不会引发错误。仅仅因为你使用了一个没有定义的名字并不意味着它不能在其他地方被定义。。。e、 g.:

globals()['awersdfvsdvdcvd'] = 1

在文件的前面就足以抑制NameError,如果执行名称拼写错误的行,则会出现这种情况。在

好吧,那么python不能也只查找全局语句吗?答案又是“no”来自模块“foo”,我可以用类似的方式添加到模块“bar”的全局变量中。而且python在实际运行之前无法知道哪些模块将被导入(我也可以在运行时动态导入模块)。在


请注意,我所提到的Python作为一种语言不能对这些事情发出警告的大多数原因都涉及到人们做了一些疯狂的混乱的事情。有很多工具会警告你这些事情(假设你不会做那样的蠢事)。我最喜欢的是^{},但是任何python linter都应该能够警告您未定义的变量。如果在编辑器上挂起一个小钩子,大多数情况下,在实际运行代码之前就可以捕捉到这些bug。在

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

相关问题 更多 >