如何从导入模块而非__main__中直接获取函数对象(无需遍历结果)
关于用globals()/locals()访问导入模块内容的问题
嘿,我来帮你理清楚这个问题——你之前试的那些写法大多没找对路子,因为globals()和locals()的用法跟你想的不太一样。
首先得明确核心逻辑:globals()和locals()是当前作用域的内置函数,它们返回的是你当前运行代码所在作用域的命名空间字典,根本不是其他模块的。所以你试的module2.globals()、globals(module2)这些写法全错了——模块对象本身没有globals()方法,globals()也不接受模块作为参数。
那怎么不用遍历就能访问其他模块里的内容?其实每个模块对象都自带一个__dict__属性,这就是它的全局命名空间字典,等价于模块内部调用globals()返回的结果。另外,内置函数vars()如果传入模块对象,也会返回这个字典,和module.__dict__完全一样。
举个实际例子:假设你导入了module2,这个模块里有函数bar()和变量PI = 3.14,你可以这样直接访问:
import module2 # 最直接的方式(其实根本不需要碰字典) module2.bar() print(module2.PI) # 用模块的__dict__访问(对应模块自身的全局空间) module2.__dict__['bar']() print(module2.__dict__['PI']) # 用vars()等价访问 vars(module2)['bar']() print(vars(module2)['PI'])
如果你是想无需遍历筛选就拿到模块里的特定对象,只要你知道它的名字,用上面的方式就行——完全不用遍历整个字典。只有当你不知道具体名字、需要批量筛选类型(比如所有函数)的时候才需要遍历,那是另一种场景了。
再纠正几个你之前的误区:
globals().module2其实只是拿到当前模块里的module2引用(也就是你导入的模块对象),这不是模块的全局内容,只是模块对象本身。- 字符串比如
"module2"或者"__main__"只是普通字符串,根本没有globals属性,那些写法肯定行不通。
总结一下:要访问其他模块的全局内容,不用打globals()的主意,直接用模块对象的__dict__或者vars(module);如果知道具体名字,甚至直接用module.name就够了,这比操作字典更简单。
内容的提问来源于stack exchange,提问作者Peter F
相关产品推荐
相关产品推荐

