Python模块初始化顺序?

2024-10-01 17:40:36 发布

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

我是一个来自C++背景的Python新手。虽然我知道用我以前的C++知识来寻找一个匹配的概念不是Pythonic,但我认为这个问题仍然是一个普遍的问题:

<>在C++下,有一个众所周知的问题,叫做全局变量/静态变量初始化顺序FASCO,这是因为C++无法决定在编译单元中首先初始化哪个全局/静态变量,因此,依赖于不同编译单元中另一个全局/静态变量的初始化可能早于其依赖项对应的变量,并且当dependent开始使用依赖对象提供的服务时,我们将有未定义的行为。在这里,我不想深入探讨C++如何解决这个问题。:)

在Python世界中,我确实看到了全局变量的使用,即使是在不同的.py文件中也是如此,我看到的一个典型用法是:在一个.py文件中初始化一个全局对象,而在其他.py文件中,代码只是无所畏惧地开始使用全局对象,假设它一定是在其他地方初始化的,由于我上面指定的问题,C++下的绝对不能接受。在

我不确定上面的用例是否是Python(Pythonic)中的常见实践,Python通常如何解决这种全局变量初始化顺序问题?在

非常感谢!在


Tags: 文件对象py概念顺序静态pythonic全局
2条回答

Under C++, there is a well known problem called global/static variable initialization order fiasco, due to C++'s inability to decide which global/static variable would be initialized first across compilation units,

我认为语句突出了Python和C++之间的关键区别:在Python中,没有不同的编译单元。我的意思是,在C++中(如你所知),两个不同的源文件可以完全独立地编译,因此,如果比较文件A中的一行和文件B中的一行,则没有什么可以告诉你哪一个将被放在程序中的第一位。这有点像多线程的情况:您无法确定线程1中的特定语句将在线程2中的特定语句之前还是之后执行。你可以说C++程序是并行编译的。在

相反,在Python中,执行从一个文件的顶部开始,按照定义良好的顺序通过文件中的每个语句执行,并在其他文件导入的位置分支到其他文件。实际上,您几乎可以将import指令看作#include,这样就可以确定程序中所有源文件中所有代码行的执行顺序。(嗯,这比它复杂一点,因为一个模块在第一次导入时才真正被执行,并且由于其他原因)如果C++程序并行编译,Python程序就被串行地解释。在

您的问题还涉及到Python中模块的深层含义。Python模块是一个实际的对象,它是单个.py文件中的所有内容。在单个源文件的“global”范围内声明的所有内容实际上都是该模块对象的属性。Python中没有真正的全局作用域。(Python程序员经常说“全局”,实际上,在语言中有一个^ {CD4}}关键字,但它总是指当前模块的顶层。)我可以看到,这是一个陌生的概念,习惯于从C++背景中来。我从java中得到一些习惯,在这方面,java比python更类似于C++。(Java中也没有全局范围)

我将提到,在Python中,使用一个变量而不知道它是否已被初始化/定义是完全正常的。嗯,也许不正常,但至少在适当的情况下是可以接受的。在Python中,试图使用未定义的变量会引发^ {< CD5> };您不能像C或C++那样任意地进行行为,因此您可以轻松地处理这种情况。您可能会看到这种模式:

try:
    duck.quack()
except NameError:
    pass

如果duck不存在,则不执行任何操作。实际上,你通常会看到

^{pr2}$

如果duck没有一个名为quack的方法,则它不会执行任何操作。(AttributeError是当你试图访问一个对象的一个属性,但是这个对象没有这个名称的任何属性)这就是在Python中进行类型检查的原因:我们认为如果我们只需要鸭子呱呱叫,我们可以要求它呱呱叫,如果它叫了,我们就不在乎它是不是真的还是鸭子不是。(这叫做鸭子打字;-)

Python导入从头到尾执行新的Python模块。后续导入只会导致sys.modules中现有引用的副本,即使由于循环导入而仍处于导入模块的中间。在循环导入存在之前已经初始化的模块属性(“全局变量”实际上在模块范围内)。在

main.py

import a

a.py

^{pr2}$

b.py

import a
print a.var1 # works
print a.var2 # fails

相关问题 更多 >

    热门问题