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