【问题标题】:Sharing python globals() cross files共享 python globals() 交叉文件
【发布时间】:2016-11-06 09:42:13
【问题描述】:

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

【问题讨论】:

  • 实际上,imports 正是您所需要的。您能否就您的问题提供更广泛的背景并解释一下,为什么您不能使用它?
  • 如果不从 fileA 导入 fileB,我认为这是不可能的。

标签: python global-scope


【解决方案1】:

如果你想在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)

【讨论】:

  • @KirChou 我看不出两种情况有什么区别,你仍然可以将你的函数对象传递给loader。请注意,python 中几乎所有的东西都是一个对象。
  • 是的,我知道我可以将函数传递给 loader.py,但考虑到有多个全局函数。如何在一个对象中传递它们?我知道的是 globals(),但我发现我无法将 globals 作为模块共享。
  • 谢谢。 tbh,解决方案并没有超出我的预期,但似乎没有其他方法可以实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2017-10-23
相关资源
最近更新 更多