Ścieżka śledzenia i numer linii
Używam Pythonatrace
moduł do śledzenia kodu. Kiedy śledzę kod w ten sposób, mogę uzyskać jeden z dwóch następujących wyników:
Połączenie:
tracer = trace.Trace(count=False, trace=True, ignoredirs=[sys.prefix, sys.exec_prefix])
r = tracer.run('run()')
tracer.results().write_results(show_missing=True)
Wynik:
<filename>(<line number>): <line of code>
Połączenie [cytat]:
tracer = trace.Trace(count=False, trace=True, ignoredirs=[sys.prefix, sys.exec_prefix], countfuncs=True)
r = tracer.run('run()')
tracer.results().write_results(show_missing=True)
Wynik:
filename:<filepath>, modulename:<module name>, funcname: <function name>
To, czego naprawdę potrzebuję, to ślad, który daje mi to:
<filepath> <line number>
Wydawałoby się, że mógłbym wykorzystać powyższe informacje i przeplatać je, aby uzyskać to, czego potrzebuję, ale taka próba nie powiedzie się w następującym przypadku użycia:
sys.path
zawiera katalogA
i katalogB
.Istnieją dwa plikiA/foo.py
iB/foo.py
ObieA/foo.py
iB/foo.py
zawierają funkcjębar
, zdefiniowane w liniach 100–120Istnieją niewielkie różnice między nimiA/foo.py
iB/foo.py
W tym scenariuszu użycie takiego przeplatania do prawidłowego określenia, którebar
jest wywoływane jest niemożliwe (proszę poprawić mnie, jeśli się mylę) bez statycznej analizy kodu w każdym z nichbar
, co jest bardzo trudne dla nietrywialnych funkcji.
Jak więc mogę uzyskać poprawne dane wyjściowe, których potrzebuję?