Python 如何从其结果被指定给属性的函数中获取属性的名称?

Python 如何从其结果被指定给属性的函数中获取属性的名称?,python,python-3.4,Python,Python 3.4,这个问题可能有点复杂,但让我举个例子。PyQt执行我在pyqtSignal函数中要求的操作。您可以这样做: class Foo(): some_attr = pyqtSignal() pyqtSignal有一个名为name的关键字参数。它是可选的,如果省略,则在本例中使用属性的名称。我想复制这种行为。你知道我该怎么做吗?这真的让我在这里痛苦了一段时间。所以我试了些东西只是为了好玩 无论如何,我的想法是,我应该获取带有调用方代码的行,然后将该行与发起调用的帧的所有本地名称的列表进行比较。如果

这个问题可能有点复杂,但让我举个例子。PyQt执行我在pyqtSignal函数中要求的操作。您可以这样做:

class Foo():
  some_attr = pyqtSignal()

pyqtSignal有一个名为name的关键字参数。它是可选的,如果省略,则在本例中使用属性的名称。我想复制这种行为。你知道我该怎么做吗?

这真的让我在这里痛苦了一段时间。所以我试了些东西只是为了好玩

无论如何,我的想法是,我应该获取带有调用方代码的行,然后将该行与发起调用的帧的所有本地名称的列表进行比较。如果我被击中,这意味着本地名称空间的变量就是调用我的类的变量

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

但就像我说的,我发现这一切都很奇怪

下面是一个示例代码,说明函数如何检索被调用函数的结果分配给的变量/属性的名称

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匹配attr和attr4,因为在名称中,我们都有它们,find只查找第一个和最后一个匹配索引,甚至在nnnaattrnnnnn中也会找到命中


我必须提一下我怀疑他们是用锤子敲额头的方式做的。。。。我甚至没有尝试过在多个赋值项、生成器表达式和其他可能找到a变量的野生上下文中进行实验。已经尝试过了,运气不好,那么代码在哪里,到底有什么问题?问题是我找不到可靠的方法来获取名称。我知道名称本身存储在frame.f_back.f_code.co_names中,但还没有找到一种方法来确定TupleyYour代码的正确索引您缺少对QObject的继承。找出他们是如何在源代码中实现这一奇怪的功能的,并试图从中找到意义。我觉得这真的很奇怪,而且没有它可能应该的那么明确。你要找的是方法。