Estoy escribiendo un código para determinar el nombre al que está asignado un objeto. Esto es para el trabajo de depuración general y para familiarizarme aún más con las partes internas de Python.Accediendo al nombre que un objeto que se está creando está asignado a
Lo tengo estructurado como un decorador de clases para que todas las instancias de esa clase tengan sus nombres registrados si es posible hacerlo. El código es bastante largo, así que no lo publicaré a menos que me lo pidan. La técnica general es el siguiente, aunque
decorar la clase
__init__
método con el código para hacer lo que quieroconjunto
caller = inspect.currentframe().f_back
y abiertoinspect.getframeinfo(caller).filename
y enviarlo aast.parse
. No hago ningún error al verificar aquí porque (1) esto es solo para la depuración/creación de perfiles/piratería (2) este proceso exacto fue 'simplemente' completado o el código no se estaría ejecutando. ¿Hay algún problema con esto?encontrar la instancia
ast.Assignment
que hace que el__init__
método actualmente en ejecución para ejecutarlen(assignment.targets) == 1
si entonces no es sólo un elemento en el lado izquierdo, y puedo obtener el nombre detargets[0].id
. En una forma simple comoa = Foo()
, entonces elassignment.value
es una instancia deast.Call
. si es un literal (por ejemplo, una lista), entoncesvalue
será esa lista y la fianza porque el objeto que me interesa no se está asignando a un nombre.
¿Cuál es la mejor manera de confirmar que assignment.value.func
es, de hecho, type(obj).__call__
del objeto que me interesa. Estoy bastante seguro de que es garantizado que es "en alguna parte" o el código ni siquiera estaría funcionando. Solo necesito que esté en el nivel superior. Lo más obvio es caminar y asegurarse de que no contenga llamadas interiores. Entonces estoy garantizado que tengo el nombre. (Mi razonamiento es correcto, no estoy seguro de si sus suposiciones son). Esto no es ideal, porque si estoy interesado en Foo
, esto podría llevarme a descartar a = Foo(Bar())
porque no sé si es a = Bar(Foo())
.
Por supuesto que puedo comprobar assignment.value.func.id
pero entonces alguien podría haber hecho Foobar = Foo
o algo así que no quiero depender de esto también en gran medida
Cualquier ayuda sería muy apreciada. Como siempre, estoy interesado en cualquier otra sugerencia o problema que pueda estar pasando por alto.
Además, estoy realmente sorprendido de que tuve que inventar la etiqueta 'python-internal'.
+ many - ¡Python es genial! – katrielalex