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

时间:2019-07-10 03:31:07

标签: python python-2.7

我想在模块中列出“已定义”的变量。然后,我发现无法区分模块中定义的变量和从其他模块导入的变量。有什么办法可以知道是否导入了变量?

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

我知道我可以导入模块的数量要比从模块导入的变量多。

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

  • 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"],
}

1 个答案:

答案 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