为什么导入模块执行python中的所有语句?

时间:2014-04-22 17:49:52

标签: python python-import python-module

这是我的模块:

test1.py

regions=["a","b","c"]
print "from test1 module"

test2.py

from test1 import regions
print "from test2 module", regions

运行test2.py

python test2.py 
from test1 module
from test2 module ['a', 'b', 'c']

我看到来自print的{​​{1}}语句已被调用,但我只从test1.py导入regions列表。对于要执行的所有内容,我不会说test1.py

1)为什么它会执行import test1.py文件中的所有内容(当然不包括test1.py)。

2)如何在不执行所有其他陈述的情况下__name__==__main__ importregions list

我不知道导入是如何工作的,我已经在这个问题上工作了3天。

3 个答案:

答案 0 :(得分:4)

这就是进口的运作方式。

def my_function():
    print("Hello")

上面的代码片段是什么?它确实是一个函数定义,但Python中的函数定义是语句,它们必须执行才能定义函数。因此,当您导入上述模块时,执行 def,这会创建一个新函数并将其分配给my_function。它基本上与:

相同
my_function = ...definition..

因此,当您导入模块时,总是执行其内容。否则,您将无法使用该模块中的任何函数(或类)。

还有其他方法可以在Python中定义函数。

def create_my_function(x):
    def local_function():
        print(x)
    global my_function
    my_function = local_function

create_my_function("Hello")

这大致相当于my_function()的原始定义。

由于您可以在Python模块中放置任何语句,因此Python无法知道必须执行哪些语句才能定义您感兴趣的符号。因此它必须执行所有语句。

答案 1 :(得分:3)

Python需要执行模块中的所有语句,因为它们可能具有相关的副作用。例如,考虑

a = 2
b = a*3

如果从该模块导入b会怎样? 通常,除了main之外的模块不应该具有导入时有害的副作用。通常,模块应该定义类,函数和变量,但不应该执行诸如打开文件,连接数据库等操作。

答案 2 :(得分:1)

这是导入的工作方式 - python在导入时执行模块。这有它的用途,因为您可以包含验证依赖项的功能,或在导入模块实际调用任何类之前初始化功能。