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

问题描述 投票:0回答:3

这是我的模块:

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

# this is the output of the execution
from test1 module
from test2 module ['a', 'b', 'c']

我看到调用了来自

print
test1.py
语句,尽管我只从
regions
导入
test1.py
列表。我没有使用导致所有内容被执行的指令
import test1

  1. 为什么它执行

    test1.py
    文件中的所有内容(当然不是指令
    if __name__==__main__
    下的代码,如果包含的话)。

  2. 如何仅

    import
    来自
    regions
    test1
    列表而不执行所有其他语句?

我不知道导入是如何工作的,因此我已经研究了 3 天的错误。

python python-import python-module
3个回答
5
投票

这就是进口的运作方式。

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无法知道必须执行哪些语句才能定义您感兴趣的符号。因此它必须执行所有语句。

    

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


5
投票

如果我从该模块导入 b 会发生什么? 一般来说,除 main 之外的模块不应具有导入时有害的副作用。一般来说,模块应该定义类、函数和变量,但不应该执行打开文件、连接数据库等操作。


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


1
投票

© www.soinside.com 2019 - 2024. All rights reserved.