Я пишу код для определения имени, которому назначен объект. Это для общей работы по отладке и для дальнейшего ознакомления с внутренним устройством python.
Я структурировал его как декоратор классов, так что имена всех экземпляров этого класса будут записаны, если это возможно. Код довольно длинный, поэтому я не буду публиковать его, пока вас не спросят. Общая методика заключается в следующем, хотя
украшает метод класса __ init __
кодом для выполнения того, что я хочу
set caller = inspect.currentframe (). F_back
и откройте inspect.getframeinfo (вызывающий) .filename
и отправьте его на ast.parse
. Я не Не выполняйте здесь проверку ошибок, потому что (1) это только для отладки / профилирования / взлома (2) этот точный процесс был «просто» завершен или код не запускался. Есть ли в этом проблема?
найдите экземпляр ast.Assignment
, который вызывает выполнение текущего метода __ init __
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».