我想在模块中列出“已定义”的变量。然后,我发现无法区分模块中定义的变量和从其他模块导入的变量。有什么办法可以知道是否导入了变量?
我知道inspect.getmembers
和inspect.getmodule
和dir
,但我关心的是变量,而不是函数或类定义。
我知道我可以导入模块的数量要比从模块导入的变量多。
我只想知道有没有办法:)。
class A(object):
pass
from a import A
ins_b = A()
from a import A
from b import ins_b
ins_c = A()
我想列出这样的变量:
["b.ins_b", "c.ins_c"]
但实际上我能做的是:
{
<a.A instance at pos1>: ["b.ins_b", "c.ins_b"],
<a.A instance at pos2>: ["c.ins_c"],
}
答案 0 :(得分:0)
好。感谢@ juanpa.arrivillaga,我知道这是不可能的。 我只是改变了一个问题:如何知道“创建对象的模块”和“对象分配的属性名称”。
我尝试找到类似“元类”,也许是“元模块”的东西,但是我发现它改变了许多我不需要的行为。
因此,根据“ How to use inspect to get the caller's info from callee in Python?”和“ Retrieve module object from stack frame”,我做了一些技巧来实现我的想法。
import inspect
import re
attr_r = re.compile(u"\s*([^\s=]+)\s*=")
class A(object):
def __init__(self):
pre_frame = inspect.currentframe().f_back
frame_info = inspect.getframeinfo(pre_frame)
self.init_module_name = inspect.getmodule(pre_frame).__name__
self.init_attr_name = ""
if len(frame_info[3]) > 0:
line = frame_info[3][0]
m = attr_r.match(line)
if m:
self.init_attr_name = m.group(1)
获取attr名称的方法很技巧,但对我有用。
# init_module_name == "a"
a = A()
print a.init_module_name, a.init_attr_name
# init_module_name == "a"
a = b = A()
print a.init_module_name, a.init_attr_name
# init_module_name == ""
a = \
A()
print a.init_module_name, a.init_attr_name