是否可以在Python 3中从导入的函数调用全局函数?
./文件夹/文件夹1 / def.py
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
./ main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
我有这样的错误。
++ def.do_test()
Traceback (most recent call last):
File "C:\src\python\class2\main.py", line 10, in <module>
mod.do_test()
File "C:\src\python\class2\folders\folder1\def.py", line 4, in do_test
global_function_1()
NameError: name 'global_function_1' is not defined
显然,如果在同一个文件中定义,相同的功能就可以正常工作。
def global_function_1():
print("calling the global function 1")
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
do_test()
结果是
++ def.do_test()
calling the global function 1
-- def.do_test()
如果Python不允许这样做,那么最接近的选择是什么? 在我的真实项目中,全局函数具有对全局的访问次数 变量。如果可能的话,我想避免使用所有全局功能 和变量在一个单独的类中。
编辑:以上是突出我的问题的代码摘录。在我的真实项目中,
答案 0 :(得分:1)
您创建的内容称为模块。如果它没有导入到它所使用的文件中,则无法使用它。在你的情况下,def.py需要导入main。
导入可以这样做:
from moduleFilename import moduleFunctionname
然后你可以做
moduleFunctionname()
替代:
import moduleFilename
moduleFilename.moduleFunctionname()
编辑:看起来像Rawing的评论更快......
答案 1 :(得分:1)
我能够让main.py
使用以下设置。
(注意我必须向__init__.py
和folders
子目录添加一个空的folder1
文件,以使导入生效。)
档案 .\class2\folders\folder1\def.py
from main import global_function_1
def do_test():
print("++ def.do_test()")
global_function_1()
print("-- def.do_test()")
档案 .\class2\main.py
import importlib
def global_function_1():
print("doing function 1 thing...")
if __name__ == '__main__':
mod = importlib.import_module('folders.folder1.def')
mod.do_test()
输出:
++ def.do_test()
doing function 1 thing...
-- def.do_test()
答案 2 :(得分:0)
如果你想保持folders.folder1.def
独立于反向导入的东西,因为它看起来像是一个库或插件等,你可以诉诸它作为回调:
库:
def do_test(callback):
print("++ def.do_test()")
callback()
print("-- def.do_test()")
主要模块:
import importlib
def global_function_1():
print("doing function 1 thing...")
mod = importlib.import_module('folders.folder1.def')
mod.do_test(global_function_1)