Python 如何从其结果被指定给属性的函数中获取属性的名称?
这个问题可能有点复杂,但让我举个例子。PyQt执行我在pyqtSignal函数中要求的操作。您可以这样做:Python 如何从其结果被指定给属性的函数中获取属性的名称?,python,python-3.4,Python,Python 3.4,这个问题可能有点复杂,但让我举个例子。PyQt执行我在pyqtSignal函数中要求的操作。您可以这样做: class Foo(): some_attr = pyqtSignal() pyqtSignal有一个名为name的关键字参数。它是可选的,如果省略,则在本例中使用属性的名称。我想复制这种行为。你知道我该怎么做吗?这真的让我在这里痛苦了一段时间。所以我试了些东西只是为了好玩 无论如何,我的想法是,我应该获取带有调用方代码的行,然后将该行与发起调用的帧的所有本地名称的列表进行比较。如果
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的继承。找出他们是如何在源代码中实现这一奇怪的功能的,并试图从中找到意义。我觉得这真的很奇怪,而且没有它可能应该的那么明确。你要找的是方法。