Zaczynam pisać w różnych projektach przy użyciu Pythona (w tym tworzenie stron internetowych Django i tworzenie gier Panda3D).
Aby pomóc mi zrozumieć, co się dzieje, chciałbym po prostu „spojrzeć” wewnątrz obiektów Pythona, aby zobaczyć, jak zaznaczają - podobnie jak ich metody i właściwości.
Powiedzmy, że mam obiekt Python. Czego potrzebowałbym do wydrukowania jego zawartości? Czy to w ogóle możliwe?
python
introspection
littlejim84
źródło
źródło
object.__dict__
źródło
vars(object)
jest do tego stworzony.from pprint import pprint; pprint(vars(object))
dał mi naprawdę ładny widok na zawartość mojego obiektu. Dzięki @liberforceNajpierw przeczytaj źródło.
Po drugie, użyj
dir()
funkcji.źródło
Dziwi mnie, że nikt jeszcze nie wspomniał o pomocy!
Pomoc pozwala przeczytać dokumentację i dowiedzieć się, jakie atrybuty może mieć klasa, co jest dość pomocne.
źródło
Jeśli jest to eksploracja, aby zobaczyć, co się dzieje, polecam spojrzeć na IPython . Dodaje to różne skróty w celu uzyskania dokumentacji obiektów, właściwości, a nawet kodu źródłowego. Na przykład dołączając „?” funkcja da pomoc dla obiektu (w rzeczywistości skrót do „help (obj)”, co przy użyciu dwóch? („
func??
”) wyświetli kod źródłowy, jeśli jest dostępny.Istnieje również wiele dodatkowych udogodnień, takich jak uzupełnianie tabulatorów, ładne drukowanie wyników, historia wyników itp., Które sprawiają, że jest to bardzo przydatne w tego rodzaju programowaniu eksploracyjnym.
Dla bardziej programowego wykorzystania introspekcji, podstawowe builtins podoba
dir()
,vars()
,getattr
etc będzie użyteczny, ale jest warta twojego czasu na sprawdzeniu sprawdzić moduł. Aby pobrać źródło funkcji, użyj „inspect.getsource
” np., Stosując ją do siebie:inspect.getargspec
jest również często przydatny, jeśli masz do czynienia z zawijaniem lub manipulowaniem funkcjami, ponieważ poda nazwy i wartości domyślne parametrów funkcji.źródło
Jeśli interesuje Cię GUI, spójrz na objbrowser . Wykorzystuje moduł inspekcji ze standardowej biblioteki Python do introspekcji obiektów pod spodem.
źródło
Możesz wymienić atrybuty obiektu za pomocą dir () w powłoce:
Oczywiście istnieje również moduł inspekcji: http://docs.python.org/library/inspect.html#module-inspect
źródło
źródło
Spróbuj ppretty
Wynik:
źródło
Inni wspominali już o wbudowanym dir (), który brzmi jak to, czego szukasz, ale oto kolejna dobra wskazówka. Wiele bibliotek - w tym większość bibliotek standardowych - jest rozpowszechnianych w formie źródłowej. Oznacza to, że możesz dość łatwo odczytać kod źródłowy bezpośrednio. Sztuka polega na znalezieniu go; na przykład:
Plik * .pyc jest skompilowany, więc usuń końcowy „c” i otwórz nieskompilowany plik * .py w swoim ulubionym edytorze lub przeglądarce plików:
Uważam, że jest to niezwykle przydatne do odkrywania rzeczy, takich jak które wyjątki są wywoływane z danego API. Tego rodzaju szczegóły rzadko są dobrze udokumentowane w świecie Pythona.
źródło
Chociaż
pprint
inni już wspominali, chciałbym dodać trochę kontekstu.pprint
może być bardzo poszukiwany przez programistów z doświadczeniem PHP, którzy szukają alternatywy dlavar_dump()
.Obiekty z atrybutem dict można ładnie zrzucić za pomocą
pprint()
mieszania zvars()
, co zwraca__dict__
atrybut dla modułu, klasy, instancji itp .:Więc nie ma potrzeby pętli .
Aby zrzucić wszystkie zmienne zawarte w zasięgu globalnym lub lokalnym, po prostu użyj:
locals()
pokazuje zmienne zdefiniowane w funkcji.Przydatny jest również dostęp do funkcji z odpowiadającą im nazwą jako kluczem ciągłym , między innymi :
Podobnie, za pomocą,
dir()
aby zobaczyć zawartość modułu lub atrybuty obiektu.I jest jeszcze więcej.
źródło
Jeśli chcesz przyjrzeć się parametrom i metodom, jak zauważyli inni, możesz użyć
pprint
lubdir()
Jeśli chcesz zobaczyć rzeczywistą wartość zawartości, możesz to zrobić
object.__dict__
źródło
Dwa świetne narzędzia do sprawdzania kodu to:
IPython . Terminal pythonowy, który pozwala na sprawdzenie za pomocą uzupełniania tabulacji.
Zaćmienie za pomocą wtyczki PyDev . Ma doskonały debugger, który pozwala na łamanie w danym miejscu i sprawdzanie obiektów poprzez przeglądanie wszystkich zmiennych jako drzewa. Możesz nawet użyć wbudowanego terminala, aby wypróbować kod w tym miejscu lub wpisać obiekt i nacisnąć „.” aby zawierał podpowiedzi do kodu.
źródło
pprint i dir razem działają świetnie
źródło
Do tego celu służy kompilacja biblioteki kodów Pythona: inspekcja Wprowadzono w Pythonie 2.7
źródło
Jeśli chcesz zobaczyć kod źródłowy funkcji odpowiadającej obiektowi
myobj
, możesz wpisaćiPython
lubJupyter Notebook
:myobj??
źródło
lub
źródło
Jeśli chcesz zajrzeć do aktywnego obiektu,
inspect
dobrą odpowiedzią jest moduł Pythona . Ogólnie rzecz biorąc, działa w celu uzyskania kodu źródłowego funkcji zdefiniowanych w pliku źródłowym gdzieś na dysku. Jeśli chcesz uzyskać źródło funkcji na żywo i lambd, które zostały zdefiniowane w tłumaczu, możesz użyćdill.source.getsource
zdill
. Może również uzyskać kod z metod klasy i funkcji powiązanych lub niezwiązanych zdefiniowanych w curry ... jednak kompilacja tego kodu może nie być możliwa bez kodu obiektu otaczającego.źródło
vars (obj) zwraca atrybuty obiektu.
źródło
Ponadto, jeśli chcesz przejrzeć listę i słowniki, możesz użyć pprint ()
źródło
Wiele dobrych wskazówek już teraz, ale o najkrótszych i najłatwiejszych (niekoniecznie najlepszych) trzeba jeszcze wspomnieć:
źródło
Spróbuj użyć:
object
jest nazwa zmiennej obiektu, który próbujesz sprawdzić.Wyświetla ładnie sformatowane i tabulowane dane wyjściowe pokazujące całą hierarchię kluczy i wartości w obiekcie.
UWAGA: Działa to w python3. Nie jestem pewien, czy działa we wcześniejszych wersjach
AKTUALIZACJA: To nie działa na wszystkich typach obiektów. Jeśli napotkasz jeden z tych typów (np. Obiekt Request), użyj jednego z następujących:
dir(object())
lub
import pprint
następnie:pprint.pprint(object.__dict__)
źródło