Я пишу некоторый код, чтобы определить имя, которому присвоен объект.Это для общей работы по отладке и для дальнейшего знакомства с внутренними компонентами 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'.