Доступ к имени, которое Создаваемый объект присваивается

Я пишу код для определения имени, которому назначен объект. Это для общей работы по отладке и для дальнейшего ознакомления с внутренним устройством python.

Я структурировал его как декоратор классов, так что имена всех экземпляров этого класса будут записаны, если это возможно. Код довольно длинный, поэтому я не буду публиковать его, пока вас не спросят. Общая методика заключается в следующем, хотя

  1. украшает метод класса __ init __ кодом для выполнения того, что я хочу

  2. set caller = inspect.currentframe (). F_back и откройте inspect.getframeinfo (вызывающий) .filename и отправьте его на ast.parse . Я не Не выполняйте здесь проверку ошибок, потому что (1) это только для отладки / профилирования / взлома (2) этот точный процесс был «просто» завершен или код не запускался. Есть ли в этом проблема?

  3. найдите экземпляр ast.Assignment , который вызывает выполнение текущего метода __ init __

  4. if len (assignment.targets) == 1 , то слева есть только один элемент, и я могу получить имя из target [0] .id . В простой форме, такой как a = Foo () , тогда assignment.value является экземпляром ast.Call . если это литерал (например, список), то значение будет этим списком и залогом, потому что интересующий меня объект не назначается имени.

Как лучше всего подтвердить, что assignment.value.func на самом деле является типом (obj) .__ call __ интересующего меня объекта. Я почти уверен, что мне гарантировано, что Он «где-то там», иначе код даже не запустится. Мне просто нужно, чтобы это было на высшем уровне. Очевидно, что нужно пройтись по нему и убедиться, что он не содержит никаких внутренних звонков. Тогда мне гарантировано, что имя у меня есть. (Мои рассуждения верны, я не уверен, верны ли его предположения). Это не идеально, потому что, если меня интересует Foo , я могу выбросить a = Foo (Bar ()) , потому что я не знаю, a = Бар (Foo ()) .

Конечно, я могу просто проверить assignment.value.func. id , но тогда кто-то мог бы сделать Foobar = Foo или что-то в этом роде, поэтому я не хочу слишком сильно полагаться на это

Любая помощь будет принята с благодарностью. Как всегда, меня интересуют любые другие предложения или проблемы, которые я могу упустить.

Кроме того, я очень удивлен, что мне просто пришлось изобрести тег «python-internals».

6
задан aaronasterling 16 November 2010 в 03:09
поделиться