共享python globals()交叉文件

时间:2016-11-06 09:42:14

标签: python global-scope

这个问题与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()作为模块/类传递给另一个文件。

1 个答案:

答案 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)