问题:有没有办法使用globals()
或locals()
但是来自不同的(导入的)模块而不是"__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()
的功能放入 不同的 模块时(我的个人&#34; go-to&#34;库工具和技巧)并从那里导入它,我注意到它只是来自其自己的模块的农业功能,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>]
我现在明白为什么会发生这种情况(&#34;全球&#34;实际上意味着&#34;模块范围内&#34;),并回复相关问题here但仍想知道如果我错过了使用globals()
代替sys.modules()
的优雅或明显方式,请
这是我关于StackOverflow的第一个问题,所以感谢您的耐心等待。帮助...