问题:有没有办法使用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 上的第一个问题,感谢您的耐心和帮助...