如何从结果分配给属性的函数中获取属性的名称?

时间:2015-02-20 11:39:57

标签: python python-3.4

这个问题可能有点令人费解,但让我举个例子。 PyQt执行我在pyqtSignal函数中要求的内容。你可以这样做:

class Foo():
  some_attr = pyqtSignal()

pyqtSignal有一个名为name的关键字参数。它是可选的,如果省略,则使用属性的名称(在本例中为some_attr)。我想复制那种行为。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

这真的在这里杀了我一段时间。所以我尝试了一些只是为了它的乐趣。

无论如何,我的想法是我应该使用调用者的代码获取该行,然后将该行与该调用源自的帧的所有本地名称列表进行比较。如果我受到了打击,那意味着本地命名空间的变量就是调用我的类的变量。

然而,当你必须开始考虑时,问题就开始了,究竟什么是正确匹配,什么不是。归结为解析/匹配问题。它可能是一个强大的正则表达式,寻找赋值运算符=可以做到这一点?我只是在python中使用find字符串比较函数来做,因为我很懒惰

但就像我说的那样,我觉得这一切都很奇怪而且奇怪......

这是一个示例代码,说明函数如何检索被调用函数的结果赋值给的变量/属性的名称。

import inspect

def call():
    frame = inspect.currentframe()
    caller_code = inspect.getframeinfo(frame.f_back).code_context[0].strip()
    names = frame.f_back.f_code.co_names
    caller_name = [name for name in names
                   if caller_code.find(name)+1 and name!="call" ]
    return caller_name

class Test():
  attr1 = "sad"      
  def __init__(self):
    self.attr = call()
    self.attr2 = "sda"

class Test2():
  attr = call()
  attr1 = "adsa"
  attr3 = "sas"
  attr4 = call()

输出

>>> t = Test()
>>> t.attr
['attr']

>>> Test2.attr
['attr']
>>> Test2.attr4
['attr', 'attr4']

显然,find匹配attrattr4,因为在名称中我们同时拥有它们而find只查找第一个和最后一个匹配的索引并找到一个即使在“nnnaattrnnnnnn”中也会出现。

我不得不提到我怀疑他们这样做的锤头到前额样式我做了....(我甚至没有尝试过多个assignemets,生成器表达式和其他狂野的上下文,你的变量可能会被发现)