Python如何打印完整的堆栈,包括使用的魔术方法(dunder方法)?

问题描述 投票:0回答:2

我正在尝试调试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方法(如果有)。 ...

python debugging stack traceback magic-methods
2个回答
1
投票

我认为,使用stacktrace,您正在寻找错误的位置。当您从某个地方调用print_stack时(仅当来自dunder方法时才执行),该方法会很好地包含在输出中。


0
投票

我还对该主题进行了一些研究,因为@LydiaVanDyke的答案中的信息促进了更好的搜索。

© www.soinside.com 2019 - 2024. All rights reserved.