[英]How to know if a variable is imported in python2.7?
我想列出模块中“定义”的变量。 然后我发现无法区分模块中定义的变量和从其他模块导入的变量。 有没有办法知道一个变量是否被导入?
我知道inspect.getmembers
和inspect.getmodule
和dir
但我关心的是variable ,而不是函数或类定义。
我知道我可以导入模块而不是从模块导入变量。
我只是想知道有没有办法:)。
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"],
}
好的。 感谢@juanpa.arrivillaga 我知道这是不可能的。 我只是改变了问题:如何知道“创建哪个对象的模块”和“分配对象的属性名称”。
我试图找到诸如“元类”之类的东西,也许是“元模块”,但我发现它改变了许多我不需要的行为。
所以根据“ 如何使用inspect从Python中的被调用者获取调用者的信息? ”和“ 从堆栈帧中检索模块对象”,我做了一些技巧来实现我的想法。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.