Самоанализ Python - как обнаружить объект, в котором я нахожусь - PullRequest
4 голосов
/ 13 июля 2010

Предположим, у меня есть свободная функция, которая была вызвана из метода класса. Есть ли способ для меня проанализировать стек вызовов в свободной функции и определить, какой объект вызвал меня?

def foo(arg1) :
  s = ? #Introspect call stack and determine what object called me
  # Do something with s

Спасибо! * * 1004

1 Ответ

2 голосов
/ 13 июля 2010

На самом деле нет понятия "вызывающий объект ".Вы можете исследовать стек и определить, имеет ли ваша вызывающая функция первый аргумент с именем self, я полагаю - если вы вызываетесь напрямую из нормально кодированного instance метода (абсолютно не a класс метод как вы говорите ... Я полагаю, вы просто ужасно неправильно говорите, потому что сама цель 1014 * цель classmethod означает, что не имеет «объект», то есть включенный экземпляр! -), который должен это обнаружить.

Модуль inspect предлагаетВы инструменты для расширенного самоанализа (рекомендуется только для целей отладки и разработки, никогда для "фактического использования в производстве" !!!).Однако обратите внимание, что даже отслеживание функции не является тривиальным: вы получаете стековых фреймов , которые указывают на объект кода (который не указывает на функцию).

Тем не менее, он может быть может быть организован, потому что существуют псевдо-диктанты локальных переменных, также указываемых из стековых фреймов, и аргументы являются локальными переменными, так что вы ищетезапись в локальных переменных стекового фрейма вашего вызывающего абонента с именем self (и, конечно же, вам нужно много оптимизма и удачи, поскольку никто не заставляет ваш вызывающий код разумно кодироваться -- аргумент, обычно называемый self , может быть назван иначе, и тогда у вас возникнут проблемы; -).

...