无法从导入的函数中调用函数

Cannot call function from within imported function

我有 2 个文件,第一个文件名为 function_call_test.py 并包含以下代码;

from Strategy_File import strategy

def function_1():
    print('This works')

strategy()

第二个文件名为 Strategy_File.py,包含以下代码;

def strategy():
    print('got here')
    function_1()

当 运行 第一个脚本时,我得到“NameError: name 'function_1' is not defined”。 我认为当您导入一个函数时,它会被添加到导入模块命名空间中。如果是这样,为什么 strategy() 看不到 function_1()?

同样重要的是,我该如何完成这项工作。以上仅用于演示目的,我有理由希望 strategy() 在一个单独的模块中。

Python 3.6,Windows 7-64,Visual Studio 2019 和 IDLE

您必须将每个名称导入到使用它的文件中。所以需要把Strategy_File.py修改成这样:

from function_call_test import function_1

def strategy():
    print('got here')
    function_1()

但是现在你又遇到了一个新问题:循环导入。 Python 不允许这样做。因此,您将不得不想出一种不同的方式来组织您的功能。

此错误由 Strategy_File.py 引起,缺少 function_1() 的定义。

在顶部的 Strategy_File.py 中添加这一行会有所帮助。

编辑:循环导入无济于事。对于错误信息,我们深表歉意。

Python 是静态范围的。查找自由变量(例如 function_1)会在 strategy 定义 的范围内进行,而不是在它被调用的范围内。由于 strategy 是在模块 Strategy_File 的全局范围内定义的,这意味着要查找 Strategy_File.function_1,并且该函数未定义。

如果你想让strategycurrent全局范围内调用一些东西,你需要定义它来接受一个可调用的参数,并在你调用时传递所需的函数呼叫 strategy.

# Strategy_File.py

# f is not a free variable here; it's a local variable
# initialized when strategy is called.
def strategy(f):
    print('got here')
    f()

# function_call_test.py

from Strategy_File import strategy


def function_1():
    print('This works')

# Assign f = function_1 in the body of strategy
strategy(function_1)