是否可以从另一个脚本导入函数而不从此类文件导入变量?

Is it possible to import a function from another script without importing the variables from such file?

我有两个脚本 1 和 2,我需要这两个脚本彼此独立工作,但我还需要脚本 2 才能在需要时使用脚本 1 中的功能。我试图尽可能地自动化,所以每个脚本都有一些内部已经定义的变量。

这是我正在谈论的纸条的一个过于简单的例子。

脚本 1:

def plustwo(n):
    out = n + 2
    print(out)

m=3
plustwo(m)

Result:
5

脚本 2:

from file import plustwo

z=5
plustwo(z)

Result: 
5
7

如您所见,当我从脚本 1 导入函数时,即使我使用 from file import plustwo,也会导入变量,这导致脚本 2 到 return 两个结果,一个是变量 m (5) 和另一个变量 z (7).

我是否一定需要创建第三个脚本,与脚本 2 相同但没有 m 变量?有没有办法从导入中排除这样的变量? (我只想要脚本 2 中的函数,这样我就可以使用脚本 1 和它已有的变量。)

在脚本1中,可以添加if __name__ == '__main__':,使其只执行

m=3
plustwo(m)

如果程序是 运行 直接来自 script1.py

最后只需要稍微修改一下脚本1即可:

def plustwo(n):
    out = n + 2
    print(out)

if __name__ == '__main__':
    m=3
    plustwo(m)

不,不是。

import 语句总是会在第一次 运行 时 执行 整个目标模块。即使将 import 写入 cherry pick 仅从目标文件中挑选几个函数和名称,文件仍会从第一行执行到最后一行 - 这就是语言的工作方式。

在此执行中创建的“模块对象”(基本上是一个包含所有函数的命名空间,classes 和模块中全局定义的变量),它们是否在 sys.modules 字典中可用.在引用同一文件的第二个 import 语句中,它将再次 not 运行:缓存版本用于从中选择任何函数或变量。

当模块文件本身直接 side-effects 并且仍然希望它的某些部分应该是可导入的时,做法是将您不想在导入时执行的代码放入如果自动变量 __name__ 包含字符串 "__main__",则只有 运行s 的块。 Python 这样做是为了让模块可以“知道”模块是 运行ning 作为主程序,还是已作为更大系统的一部分导入。

这个成语在 Python 项目中无处不在,通常看起来像:


...

if __name__ == "__main__":
    # this block only runs when the coded is executed as the main program
    m = 3
    plustwo(m)

(由于显而易见的原因,这出现在文件末尾,函数定义之后)

否则,唯一可能的解决方法是将模块文件作为文本文件读取,动态解析和 re-generate 另一个源文件,只包含感兴趣的行,然后是进口。即便如此,以这种方式导入的函数或 classes 也不可能寻址任何其他函数,class 或同一模块中的变量,当然。