Я думаю, с помощью трассировки стека вы смотрите не в том месте. Когда вы вызываете print_stack
из места, которое выполняется только при поступлении из более сложного метода, этот метод очень хорошо включается в вывод.
Я попробовал этот код для проверки:
import sys
import traceback
from enum import Enum
class TestEnum(Enum):
"""Test enum."""
A = "A"
class MyIter:
def __init__(self):
self.i = 0
def __next__(self):
self.i += 1
if self.i <= 1:
traceback.print_stack(file=sys.stdout)
return TestEnum.A
raise StopIteration
def __iter__(self):
return self
def main():
for enum_member in MyIter():
print(f"enum member = {enum_member}.")
if __name__ == "__main__":
main()
Последняя строка трассировки стека печатается как
File "/home/lydia/playground/demo.py", line 21, in __next__
traceback.print_stack(file=sys.stdout)
В исходном коде вы получаете трассировка стека в то время, когда все более сложные методы уже возвращены. Таким образом, они были удалены из стека.
Так что я думаю, вы хотите вместо этого взглянуть на граф вызовов. Я знаю, что IntelliJ / PyCharm может делать это красиво, по крайней мере, в платных изданиях.
Есть и другие инструменты, которые вы можете попробовать. Как pycallgraph выглядит для вас?
Обновление:
Python делает на самом деле довольно легко вывести простой список всех функций звонки.
В общем, все, что вам нужно сделать, это
import sys
sys.setprofile(tracefunc)
Напишите tracefunc
в зависимости от ваших потребностей. Найдите рабочий пример по такому вопросу: Как напечатать функции, как они называются
Предупреждение: Мне нужно было запустить скрипт из внешней оболочки. Запуск с помощью кнопки воспроизведения в моей IDE означал, что скрипт никогда не завершится, а будет писать все больше и больше строк. Я предполагаю, что это противоречит внутреннему профилированию, выполненному моей IDE.
Официальная документация sys.setprofile
: https://docs.python.org/3/library/sys.html#sys .setprofile
И случайное руководство по трассировке в Python: https://pymotw.com/2/sys/tracing.html
Учтите, однако, что по моему опыту вы можете лучше понять вопросы "кто кого зовет?" или "откуда вообще это значение?" используя обычный старый отладчик.