python - 从另一个 .py 文件导入函数导入的不仅仅是那个函数?

标签 python

为了说明我遇到的问题,请考虑以下内容。我有两个 .py 文件,一个名为 main.py,另一个名为 mymodule.py。它们都在同一个目录中。

main.py的内容:

from mymodule import myfunction

myfunction()

mymodule.py的内容:

def myfunction():
    for number in range(0,10):
        print(number)

print("Hi")

我的印象是导入一个函数只会导入那个函数。然而,当我运行 main.py 时,这是我得到的:

Hi
0
1
2
3
4
5
6
7
8
9

为什么调用 print("Hi")?它不是我导入的函数的一部分!

最佳答案

I was under the impression that importing a function would only import that function.

似乎对于 from-import 的实际作用有一个不正确的假设。

第一次导入模块时,导入语句将执行整个模块,包括在全局范围内进行的 print 调用 (docs)。无论 mymodule 是首先使用 import mymodule 语句还是使用 from mymodule import myfunction 语句导入,都是如此。

同一模块的后续导入将重新使用缓存在 sys.modules 中的现有模块,这可能是您误以为整个模块未执行的原因。

有一种通用模式可以避免模块导入执行全局级代码。通常您会发现在条件语句中不打算在导入时执行的代码,如下所示:

def myfunction():
    for number in range(0,10):
        print(number)

if __name__ == "__main__":
    print("Hi")

关于python - 从另一个 .py 文件导入函数导入的不仅仅是那个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51142373/

相关文章:

python - 操作系统错误: [Errno 13] Permission denied when initializing Celery in Docker

python - Django 1.6 : Forgot password not sending email

Python send_keys 方法未发送所需的值

python - 适用于 Python 的类似 Google App Engine 的数据存储

python - 如何使用 pybind11 绑定(bind)一个以 numpy.array() 作为参数的函数,例如形状 (10, 10, 3)?

python - Pexpect PopenSpawn 在标准输出上不显示任何内容

python - 使用 Tkinter Text 索引表达式删除最后一行文本

Python 导入在解释器中有效,在脚本 Numpy/Matplotlib 中不起作用

python - Tensorflow 3D 张量乘以 2D 矩阵

python - 如何处理整数值列中的非数字条目