这个问题可能有点令人费解,但让我举个例子。 PyQt执行我在pyqtSignal
函数中要求的内容。你可以这样做:
class Foo():
some_attr = pyqtSignal()
pyqtSignal
有一个名为name
的关键字参数。它是可选的,如果省略,则使用属性的名称(在本例中为some_attr
)。我想复制那种行为。关于如何做到这一点的任何想法?
答案 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
匹配attr
和attr4
,因为在名称中我们同时拥有它们而find
只查找第一个和最后一个匹配的索引并找到一个即使在“nnnaattrnnnnnn”中也会出现。
我不得不提到我怀疑他们这样做的锤头到前额样式我做了....(我甚至没有尝试过多个assignemets,生成器表达式和其他狂野的上下文,你的变量可能会被发现)