Я пишу код для определения имени, которому назначен объект. Это для общей работы по отладке и для дальнейшего ознакомления с внутренними компонентами python.Доступ к имени, которое присваивается создаваемому объекту,
У меня есть он структурированный как декоратор класса, так что все экземпляры этого класса будут иметь свои имена, записанные, если это возможно. Код довольно длинный, поэтому я не буду публиковать его, если не задано. Общая методика заключается в следующем, хотя
украшают класс
__init__
метод с кодом, чтобы делать то, что я хочунабор
caller = inspect.currentframe().f_back
и открытыйinspect.getframeinfo(caller).filename
и отправить его вast.parse
. Я не делаю никаких ошибок здесь, потому что (1) это просто для отладки/профилирования/взлома (2) этот точный процесс был «просто» завершен или код не будет работать. Есть ли проблема с этим?найти
ast.Assignment
экземпляр, который вызывает в настоящее время выполняет__init__
метод для запускаесли
len(assignment.targets) == 1
то есть только один пункт на левой стороне, и я могу получить имя изtargets[0].id
. В простой форме, напримерa = Foo()
, тогдаassignment.value
является экземпляромast.Call
. если это буквальный список (например, список), тоvalue
будет тем списком и залогом, потому что объект, который мне интересен, не присваивается имени.
Что это лучший способ, чтобы подтвердить, что assignment.value.func
фактически type(obj).__call__
объекта, который меня интересует. Я уверен, что я гарантировал, что это «где-то там» или код даже не будет работать. Мне просто нужно, чтобы он был на высшем уровне. Очевидное, что нужно сделать, это прогуляться и убедиться, что он не содержит внутренних вызовов. Тогда мне гарантировано, что у меня есть имя. (Мое рассуждение правильное, я не уверен, что его предположения). Это не идеально, потому что, если меня интересует Foo
, это может привести меня отбросить a = Foo(Bar())
, потому что я не знаю, если это a = Bar(Foo())
.
Конечно, я могу просто проверить assignment.value.func.id
, но потом кто-то мог бы сделать Foobar = Foo
или что-то, так что я не хочу полагаться на это слишком сильно
Любая помощь будет принята с благодарностью. Как всегда, меня интересуют любые другие предложения или проблемы, которые я могу игнорировать.
Кроме того, я очень удивлен, что мне просто нужно было придумать тег 'python-internals'.
+ много - Python классный! – katrielalex