繁体   English   中英

如何知道python2.7中是否导入了变量?

[英]How to know if a variable is imported in python2.7?

我想列出模块中“定义”的变量。 然后我发现无法区分模块中定义的变量和从其他模块导入的变量。 有没有办法知道一个变量是否被导入?

我知道inspect.getmembersinspect.getmoduledir但我关心的是variable ,而不是函数或类定义。

我知道我可以导入模块而不是从模块导入变量。

我只是想知道有没有办法:)。

  • a.py,定义一个类

class A(object):
    pass
  • b.py,使用A类定义一个实例
from a import A

ins_b = A()

  • c.py,使用类 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM