我知道这听起来不像Pythonic,但忍受了我一秒钟。如何在我的模块中弄清楚主程序是否使用了特定的变量?
我在写一个模块,它依赖于某些外部闭源模块。该模块需要实例化(使用module.create())。
我的模块试图弄清楚我的用户是否已经加载了这个模块(很容易做到),但是之后需要弄清楚模块是否被实例化了。我明白检查每个变量的类型()可以告诉我这一点,但我不知道如何获取主程序定义的变量名称。其原因是,当一个实例化模型时,他们还设置了一堆我不想因任何原因而被覆盖的参数。
我到目前为止的尝试都涉及到使用sys._getframe()。f_globals并遍历元素,但在我的测试中它不起作用。如果我将模块实例化为modInst,然后在模块中调用该函数,则无法显示modInst变量。还有其他解决方案吗?示例代码如下。
import sys
if moduleName not in sys.modules:
import moduleName
modInst = moduleName.create()
else:
globalVars = sys._getframe().f_globals
for key, value in globalVars:
if value == "Module Name Instance":
return key
return moduleName.create()
编辑:包括示例代码。
Alex, 非常感谢。 sys.modules ['__ main__']比sys._getframe(1).f_globals更优雅。当然,他们都假设主程序是调用create函数的程序,而不是它们自己的模块之一,但我不确定这很容易解决(除非我遍历所有的sys.modules)。 至于.create()函数创建任何变量 - 情况并非如此。所有变量都存储在create()为您创建的对象中,并且没有任何内容存储在外部。这就是为什么我在这方面遇到很多麻烦。 有没有办法找到对象,无论模块? – 2010-02-25 20:10:24
@Michalis,一般来说,不,没有完全一般的方法来找到一个对象,而不知道它的存储位置。但是,您可以尝试http://docs.python.org/library/gc.html?highlight=gc#gc.get_objects - 它会返回所有列表和字典(以及其他一些容器)供您检查。当然,对于大型项目来说,这种检查可能需要相当长一段时间! – 2010-02-25 21:18:18