从globals()和locals()获取跨不同模块

时间:2018-04-22 23:19:09

标签: python python-3.x namespaces python-module global-scope

问题:有没有办法使用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'>"])

根据需要从module1get_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的第一个问题,所以感谢您的耐心等待。帮助...

0 个答案:

没有答案