这个问题与python的全局范围有关。
下面有两个文件。
fileA.py
import pprint
pprint.pprint(globals())
fileB.py
import fileA
def global_funcB():
return "global_funcB"
当我运行python fileB.py
时。 fileA.py的globals()只包含fileA的内容。
是否可以从fileA.py获取fileB.py中global_funcB
的地址?到目前为止,我只能从fileB.py。
注意:出于我的目的,无法从fileA.py
导入fileB
[编辑]
让我清楚地描述一下我的目的。
loader.py
class loader(object):
def __init__(self, module):
print(dir(module))
builder.py +类函数
import loader
class someobj(object):
def somefunc(self):
pass
loader.loader(someobj)
如果我将一些模块/类从fileB传递给构建fileA,那么就可以获取fileB的函数。
但是,如果builder.py中的函数是全局的。
builder.py +全局函数
import loader
def someglobalfunc(self):
pass
loader.loader(???)
我不知道如何将globals()作为模块/类传递给另一个文件。
答案 0 :(得分:0)
如果要在B
中导入文件A
之后获取文件B
的全局变量并使用B
中的全局变量,那么它就完全是多余的,因为你可以简单地获取B
中的全局变量并使用它们。
如果你想获得那些全局变量并将它们与A
一起使用,那是不可能的,因为当你运行文件A
时,它的名称空间中没有B
,这是完全明显。
根据您的修改:
如果要将多个全局函数传递给loader
,可以在全局命名空间中找到所有函数并将它们传递给loader
。例如,您可以查找具有__call__
属性的对象(如果您的类和其他对象不可调用)。或者作为一种更通用的方式使用types.FunctionType
。
from typing import FunctionType
functions = [obj for obj in globals().values() if isinstance(obj, FunctionType)]
装载程序类:
class loader:
def __init__(self, *modules):
for module in modules:
print(dir(module))
您的可执行文件:
import loader
from typing import FunctionType
def someglobalfunc1(self):
pass
def someglobalfunc2(self):
pass
functions = [obj for obj in globals().values() if isinstance(obj, FunctionType)]
loader.loader(*functions)