2016-11-06 80 views
0

这个问题与Python的全局范围有关。共享python globals()交叉文件

下面有两个文件。

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(???) 

我不知道如何通过全局()作为一个模块/类到另一个文件。

+0

事实上,'import's正是你所需要的东西,。你能否给我们更广泛的问题背景并解释一下,为什么你不能使用它? –

+0

我不认为没有从fileA导入fileB就可能。 –

回答

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)] 

Loader类:

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) 
+0

我更新了我的问题。希望你能再读一遍。 –

+0

@KirChou我没有看到两种情况之间的任何区别,你仍然可以将你的函数对象传递给'loader'。请注意,python中的几乎所有东西都是一个对象。 – Kasramvd

+0

是的,我知道我可以将函数传递给loader.py,但考虑有多个全局函数。如何将它们传递给一个对象**?我所知道的是globals(),但我发现我不能将全局变量作为模块共享。 –