Piszę kod, aby określić nazwę, do której przypisany jest obiekt. Ma to na celu ogólne debugowanie i dalsze zapoznanie się z obiektami wewnętrznymi Pythona.Uzyskiwanie dostępu do nazwy tworzonego obiektu przypisanego do
Mam to ustrukturyzowane jako dekorator klas, tak aby wszystkie wystąpienia tej klasy miały zarejestrowane nazwy, jeśli jest to możliwe. Kod jest dość długi, więc nie opublikuję go, chyba że zostanie poproszony. Ogólna technika jest następujący chociaż
ozdobić klasę
__init__
metodę z kodem, aby robić to, co chcęustawić
caller = inspect.currentframe().f_back
i otwartejinspect.getframeinfo(caller).filename
i wysłać go doast.parse
. Nie robię tutaj żadnego sprawdzania błędów, ponieważ (1) jest to tylko do debugowania/profilowania/hakowania (2) ten dokładny proces został "właśnie" zakończony lub kod nie został uruchomiony. Czy jest z tym jakiś problem?znaleźć instancję
ast.Assignment
który powoduje, że aktualnie wykonywany__init__
sposób uruchomićjeśli
len(assignment.targets) == 1
to istnieje tylko jedna pozycja na lewej stronie, i mogę uzyskać nazwę ztargets[0].id
. W prostej formie, takiej jaka = Foo()
,assignment.value
jest instancjąast.Call
. jeśli jest to literał (na przykład lista), tovalue
będzie tą listą i kaucją, ponieważ obiekt, który mnie interesuje, nie jest przypisany do nazwy.
Jaki jest najlepszy sposób, aby potwierdzić, że jest w rzeczywistości assignment.value.func
type(obj).__call__
obiektu, który mnie interesuje. Jestem pewien, że mam pewność, że to „gdzieś tam” lub kod nawet nie działał. Po prostu potrzebuję, aby był na najwyższym poziomie. Oczywistym wyjściem jest chodzić i upewnić się, że nie zawiera żadnych połączeń wewnętrznych. Wtedy mam gwarancję, że mam imię. (Moje rozumowanie jest poprawne, nie jestem pewien, czy są to jego założenia). To nie jest idealne, ponieważ jeśli interesuje mnie Foo
, może to spowodować odebranie a = Foo(Bar())
, ponieważ nie wiem, czy to jest a = Bar(Foo())
.
Oczywiście mogę tylko sprawdzić assignment.value.func.id
ale wtedy ktoś mógłby zrobić Foobar = Foo
lub coś więc nie chcę polegać na tym zbyt mocno
Każda pomoc będzie mile widziana. Jak zawsze, interesują mnie inne sugestie lub problemy, które mogą mi przeszkadzać.
Jestem również zaskoczony, że po prostu wymyśliłem znacznik "python-internals".
+ wiele - Python jest fajny! – katrielalex