Python:如何从导入的模块调用全局函数

时间:2015-01-03 08:03:54

标签: python namespaces

是否可以在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不允许这样做,那么最接近的选择是什么? 在我的真实项目中,全局函数具有对全局的访问次数 变量。如果可能的话,我想避免使用所有全局功能 和变量在一个单独的类中。

编辑:以上是突出我的问题的代码摘录。在我的真实项目中,

  1. 我有十几个全局函数。因此,不通过函数参数传递其指针。
  2. 我在多个文件夹中有十几个其他def.py文件。我需要在运行时获取def.py文件,具体取决于各种条件。因此,从main.py到def.py的静态引用不会被优先使用。

3 个答案:

答案 0 :(得分:1)

您创建的内容称为模块。如果它没有导入到它所使用的文件中,则无法使用它。在你的情况下,def.py需要导入main。

导入可以这样做:

from moduleFilename import moduleFunctionname
然后你可以做

moduleFunctionname()

替代:

import moduleFilename
moduleFilename.moduleFunctionname()

编辑:看起来像Rawing的评论更快......

答案 1 :(得分:1)

我能够让main.py使用以下设置。

(注意我必须向__init__.pyfolders子目录添加一个空的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)