Вы можете просто сохранить ссылку на объект кадра вызывающего абонента, но это, вероятно, плохая идея. Это сохраняет работоспособность кадров, а также содержит ссылки на все используемые локальные переменные, поэтому это может повлиять на производительность, если они используют большие куски памяти и могут иметь даже худшие эффекты, если они полагаются (неправильно) на завершение до уничтожать ресурсы, такие как блокировки и дескрипторы файлов, когда они выходят за рамки.
Это означает, что вам нужно будет содержать строковое представление stacktrace, что не идеально подходит для ваших целей (нужно на самом деле сделать некоторую обработку, чтобы получить его, даже если это редко необходимо). К сожалению, похоже, что это не так, но вы можете отключить его, пока не установите какой-либо параметр конфигурации. Таким образом, вы получите лучшую производительность для общего случая, но все же можете включить настройку при попытке диагностики сбоев.
Если вашей вызывающей функции в одиночку (или небольшого числа родительских абонентов) достаточно, чтобы отличить маршрут (т. Е. Трассировка всегда одинакова при вызове через func1(), и нет func2 -> func1() vs func3() -> func1(), чтобы различать), вы можете сохранить хэш на основе имени файла и номера строки вызывающего фрейма (или двух последних кадров вызова и т. д.). Однако это, вероятно, не соответствует вашей ситуации, а там, где этого не происходит, вы получите фиктивные трассировки стека.
Обратите внимание, что если вы хотите, чтобы кадр звонящего, то с помощью inspect.currentframe(depth)
, вероятно, лучший способ его получить.
Спасибо, но это не работает надежно для классов, когда __init__ перегружен. –
А, ладно. Не проверял этот случай, но я полагаю, что он может быть изменен, чтобы найти «я» в f.f_locals и сохранить значение этого тоже ... – AKX