我正在尝试调试Python内置类。我的调试使我进入了魔术方法(又名dunder方法)的领域。
我试图找出调用了哪些dunder方法,如果有的话。通常我会做这样的事情:
import sys
import traceback
# This would be located where the I'm currently debugging
traceback.print_stack(file=sys.stdout)
但是,traceback.print_stack
没有给我提供打印细节的程度,该细节在附近使用了什么方法。
是否有某种方式可以以非常冗长的方式打印出代码块中实际发生的事情?
样本代码
#!/usr/bin/env python3.6 import sys import traceback from enum import Enum class TestEnum(Enum): """Test enum.""" A = "A" def main(): for enum_member in TestEnum: traceback.print_stack(file=sys.stdout) print(f"enum member = {enum_member}.") if __name__ == "__main__": main()
我希望上面的示例代码打印出所使用的任何dunder方法(例如:
__iter__
。
当前它打印出对traceback.print_stack
的调用的路径:
/path/to/venv/bin/python /path/to/file.py File "/path/to/file.py", line 56, in <module> main() File "/path/to/file.py", line 51, in main traceback.print_stack(file=sys.stdout) enum member = TestEnum.A.
P.S。我对进入
dis.dis
给出的字节码级别不感兴趣。
我正在尝试调试Python内置类。我的调试使我进入了魔术方法(又名dunder方法)领域。我试图找出调用了哪些dunder方法(如果有)。 ...
我认为,使用stacktrace,您正在寻找错误的位置。当您从某个地方调用print_stack
时(仅当来自dunder方法时才执行),该方法会很好地包含在输出中。
我还对该主题进行了一些研究,因为@LydiaVanDyke的答案中的信息促进了更好的搜索。