我正在写一些代码来确定一个对象的名称。这是为了进行一般的调试工作,并进一步熟悉python的内部结构。在
我把它构造成一个类decorator,这样如果可能的话,该类的所有实例都将记录它们的名称。代码相当长,所以我不会张贴,除非有人问。一般的方法如下
用代码装饰类的__init__
方法来做我想做的事情
设置caller = inspect.currentframe().f_back
并打开inspect.getframeinfo(caller).filename
并将其发送到ast.parse
。我在这里不做任何错误检查,因为(1)这只是为了调试/分析/黑客攻击(2)这个确切的过程“刚刚”完成,或者代码不会运行。这个有问题吗?
找到使当前正在执行的ast.Assignment
方法运行的ast.Assignment
实例
如果len(assignment.targets) == 1
那么左手边只有一个项目,我可以从targets[0].id
中得到名称。在类似a = Foo()
的简单形式中,assignment.value
是{value
将是该列表和bail,因为我感兴趣的对象没有被分配给一个名称。
确认assignment.value.func
实际上是我感兴趣的对象的{Foo
感兴趣,这可能会导致我放弃{
当然,我可以检查一下assignment.value.func.id
,但是有人可能已经做了Foobar = Foo
或者其他什么,所以我不想太依赖这个
任何帮助都将不胜感激。和往常一样,我对我可能忽略的任何其他建议或问题都很感兴趣。在
另外,我真的很惊讶,我只是发明了“python internals”标记。在
我不知道这有多大的帮助,但是您考虑过使用调用
locals()
吗?它返回一个dict
,其中包含所有局部变量的名称和值。在例如:
所以您可以遍历这个字典并检查哪些变量具有(作为它们的值)所要查找的类型的对象。在
就像我说的,我不知道这个答案有多大的帮助,但是如果你需要澄清什么,那么请留下评论,我会尽我所能的做出最好的回应。在
AST不能给你答案。尝试使用frame.f_lasti,然后查看字节码。如果你有内线或者没有其他东西,你可以打电话给其他商店 除了你要找的简单任务。在
是的:
启动程序
等待单元它导入一个特定的模块食品
编辑食品
现在,在Python进程中加载的代码与在磁盘上找到的代码不匹配。在
反汇编字节码的另一个原因可能是更好的技术。在
相关问题 更多 >
编程相关推荐