2

问题:有没有办法使用globals()or locals()but from a different (imported) module 而不是"__main__",而不必再仔细研究结果以找到例如函数对象?

到目前为止我所尝试的:( 表现出不同程度的无知和困惑!)

module2.globals module2.globals() "module2".globals "module2".globals() globals(module2) globals().module2 globals().module2() __name__.globals __name__.globals() "__main__".globals() "__main__".globals

我最好的前景是module2.__dict__并且module2.__dict__.keys()- 但我看不出我如何过滤结果而不会有很大的偏差......

背景:(以及为什么我不寻找sys.modules()答案,谢谢)

我最初的目标是从我创建的任何新模块中“收集”一个函数对象列表,并在经过一些过滤后,使用该列表以程序方式生成菜单或 GUI。我想出了以下方法,sys.modules作为“功能农业”的第一步,所以我有一个解决方案,只是没有完全理解——因此我提出了一个冗长的问题。

# module1

import sys

def get_functions_A(module = "__main__"):
    values1 = sys.modules[module].__dict__.values()
    print([x for x in values1 if str(type(x))=="<class 'function'>"])

我使用globals()values()以下得到了相同的结果,起初看起来很有希望:

# module1    
...
def get_functions_B(module = "__main__"):
    values2 = list(globals().values())   
    print([x for x in values2 if str(type(x))=="<class 'function'>"])

我更喜欢第二种方法,因为作为 Python 的新手,它读起来不像是神秘的咒语。

然而,当我尝试将这个globals()基于函数的函数放入一个不同的模块(我个人的“首选”工具和技巧库)并从那里导入它时,我注意到它只是从它自己的模块中获取函数,module2

# module2

def get_functions_B2(module="__main__"):
    values2=list(globals().values())   
    print([x for x in values2 if str(type(x))=="<class 'function'>"])

接着:

# module1

from module2 import get_functions_B2

def get_functions_B1(module = "__main__"):
    values1 = list(globals().values())   
    print([x for x in values1 if str(type(x))=="<class 'function'>"])

module1根据需要从和正确输出get_functions_B1

[<function get_functions_B2 at 0x000002059594DBF8>, <function get_functions_B1 at 0x0000020593593E18>]

不正确的(部分)输出module1和导入get_functions_B2

[<function get_functions_B2 at 0x000002494CC7DBF8>]

我现在明白为什么会发生这种情况(“全局”实际上意味着“模块范围”),并在这里回答了一个相关的问题,但仍然想知道我是否错过了一种优雅或明显的使用方式,globals()而不是sys.modules()请。

这是我在 StackOverflow 上的第一个问题,感谢您的耐心和帮助...

4

0 回答 0