访问正在创建的对象被指定的名称

2024-04-23 12:00:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一些代码来确定一个对象的名称。这是为了进行一般的调试工作,并进一步熟悉python的内部结构。在

我把它构造成一个类decorator,这样如果可能的话,该类的所有实例都将记录它们的名称。代码相当长,所以我不会张贴,除非有人问。一般的方法如下

  1. 用代码装饰类的__init__方法来做我想做的事情

  2. 设置caller = inspect.currentframe().f_back并打开inspect.getframeinfo(caller).filename并将其发送到ast.parse。我在这里不做任何错误检查,因为(1)这只是为了调试/分析/黑客攻击(2)这个确切的过程“刚刚”完成,或者代码不会运行。这个有问题吗?

  3. 找到使当前正在执行的ast.Assignment方法运行的ast.Assignment实例

  4. 如果len(assignment.targets) == 1那么左手边只有一个项目,我可以从targets[0].id中得到名称。在类似a = Foo()的简单形式中,assignment.value是{}的一个实例。如果它是一个文本(例如list),那么value将是该列表和bail,因为我感兴趣的对象没有被分配给一个名称。

确认assignment.value.func实际上是我感兴趣的对象的{}的最佳方法是什么。我很确定我可以保证它在“某个地方”或者代码不会运行。我只需要把它放在最高层。最明显的做法是走过去,确保它不包含任何内部调用。那么我保证我有这个名字。(我的推理是正确的,我不确定它的假设是否正确)。但这并不理想,因为如果我对Foo感兴趣,这可能会导致我放弃{},因为我不知道它是不是{}。在

当然,我可以检查一下assignment.value.func.id,但是有人可能已经做了Foobar = Foo或者其他什么,所以我不想太依赖这个

任何帮助都将不胜感激。和往常一样,我对我可能忽略的任何其他建议或问题都很感兴趣。在

另外,我真的很惊讶,我只是发明了“python internals”标记。在


Tags: 对象实例方法代码名称idfoovalue
3条回答

我不知道这有多大的帮助,但是您考虑过使用调用locals()吗?它返回一个dict,其中包含所有局部变量的名称和值。在

例如:

s = ''
locals()
>>> {'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 's': '', '__name__': '__main__', '__doc__': None}
t = s  # I think this is what is of most importance to you
locals()
>>> {'__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 's': '', 't': '', '__name__': '__main__', '__doc__': None}

所以您可以遍历这个字典并检查哪些变量具有(作为它们的值)所要查找的类型的对象。在

就像我说的,我不知道这个答案有多大的帮助,但是如果你需要澄清什么,那么请留下评论,我会尽我所能的做出最好的回应。在

AST不能给你答案。尝试使用frame.f_lasti,然后查看字节码。如果你有内线或者没有其他东西,你可以打电话给其他商店 除了你要找的简单任务。在

def f():
  f = sys._getframe()
  i = f.f_lasti + 3   # capture current point of execution, advance to expected store
  print dis.disco(f.f_code, i)

I don't do any error checking here because (1) this is just for debugging/profiling/hacking (2) this exact process was 'just' completed or the code wouldn't be running. Is there a problem with this?

是的:

  1. 启动程序

  2. 等待单元它导入一个特定的模块食品

  3. 编辑食品

现在,在Python进程中加载的代码与在磁盘上找到的代码不匹配。在

反汇编字节码的另一个原因可能是更好的技术。在

相关问题 更多 >