【发布时间】:2011-04-14 06:34:07
【问题描述】:
我正在编写一些代码来确定分配给对象的名称。这是用于一般调试工作并进一步熟悉 python 内部结构。
我将其结构化为类装饰器,以便在可能的情况下,该类的所有实例都将记录其名称。代码相当长,所以除非被问到,否则我不会发布它。一般技术如下
用代码装饰类的
__init__方法来做我想做的事设置
caller = inspect.currentframe().f_back并打开inspect.getframeinfo(caller).filename并将其发送到ast.parse。我在这里不做任何错误检查,因为(1)这只是为了调试/分析/黑客(2)这个确切的过程“刚刚”完成,或者代码不会运行。这有问题吗?找到导致当前正在执行的
__init__方法运行的ast.Assignment实例如果
len(assignment.targets) == 1那么左边只有一项,我可以从targets[0].id中得到名字。在像a = Foo()这样的简单形式中,assignment.value是ast.Call的一个实例。如果它是文字(例如列表),那么value将是该列表并保释,因为我感兴趣的对象没有被分配给名称。
确认assignment.value.func 实际上是我感兴趣的对象的type(obj).__call__ 的最佳方法是什么。我很确定我可以保证它“在某处”或代码甚至不会运行。我只需要它处于最高水平。显而易见的事情是遍历它并确保它不包含任何内部调用。然后我保证我有这个名字。 (我的推理是正确的,我不确定它的假设是否正确)。这并不理想,因为如果我对Foo 感兴趣,这可能会导致我放弃a = Foo(Bar()),因为我不知道它是否是a = Bar(Foo())。
当然,我可以检查assignment.value.func.id,但有人可能已经完成了Foobar = Foo 或其他操作,所以我不想过分依赖它
任何帮助将不胜感激。与往常一样,我对我可能忽略的任何其他建议或问题感兴趣。
另外,我真的很惊讶我不得不发明“python-internals”标签。
【问题讨论】:
-
+many -- Python 很酷!