Więc szukam tutaj czegoś w rodzaju funkcji print_r PHP .
Dzięki temu mogę debugować skrypty, sprawdzając, jaki jest stan danego obiektu.
Więc szukam tutaj czegoś w rodzaju funkcji print_r PHP .
Dzięki temu mogę debugować skrypty, sprawdzając, jaki jest stan danego obiektu.
Naprawdę łączysz dwie różne rzeczy.
Stosowanie dir()
, vars()
lub inspect
moduł, aby uzyskać to, co jesteś zainteresowany (używam __builtins__
jako przykład, można użyć dowolnego obiektu zamiast).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Wydrukuj ten słownik, jakkolwiek lubisz:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
lub
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
Ładne drukowanie jest również dostępne w interaktywnym debuggerze jako polecenie:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
członkowski (re.MatchObject
na przykład), ale wbudowanedir()
działa dla wszystkich obiektów.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
w swojej odpowiedzi nie mówisz więcej o module? Myślę, że to najbliższa rzecz do print_r lub var_dump.dir()
?dir()
zwraca tylko listę nazw i nie wszystkie istnieją w atrybucievars()
lub w nim__dict__
.Chcesz
vars()
mieszać zpprint()
:źródło
vars()
po prostu zwraca__dict__
argument swojego argumentu i jest to również awariadir()
w przypadku braku__dir__
metody. więc używajdir()
przede wszystkim, jak powiedziałem.dir()
zawiera wszystkie wbudowane rzeczy, o których prawdopodobnie nie dbacie, jak__str__
i__new__
.var()
nie.__dict__
atrybutu.Istnieje wiele funkcji innych firm, które dodają takie funkcje, jak obsługa wyjątków, drukowanie znaków narodowych / specjalnych, rekurencja w zagnieżdżone obiekty itp. Zgodnie z preferencjami ich autorów. Ale wszystkie one w zasadzie sprowadzają się do tego.
źródło
getmembers()
funkcji w standardowyminspect
module, ale pomyślałem, że byłoby to bardziej przydatne, ponieważ ilustruje ogólnie, jak robić introspekcję.__dict__
(takich jak__doc__
i__module__
). Ponadto w__dict__
ogóle nie działa dla obiektów zadeklarowanych za pomocą__slots__
. Zasadniczo__dict__
pokazuje właściwości na poziomie użytkownika, które są faktycznie przechowywane wewnętrznie w słowniku. dir () pokazuje więcej.__dict__
atrybutu / członka. Wiem, że to szalone, ale prawdziwe. Wbudowane, takie jakint
istr
lubre.MatchObject
s, są typowymi przykładami. Spróbuj'hello'.__dict__
, a następnie spróbujdir('hello')
dir został wspomniany, ale to da ci tylko nazwy atrybutów. Jeśli chcesz również ich wartości, spróbuj __dict__.
Oto wynik:
źródło
set
nie mają__dict__
, więc dla nich się nie powiedzieAttributeError: 'set' object has no attribute '__dict__'
Aby to zrobić, możesz użyć funkcji „dir ()”.
Kolejną przydatną funkcją jest pomoc.
źródło
Aby wydrukować bieżący stan obiektu, możesz:
lub
lub
Dla twoich klas zdefiniuj
__str__
lub zastosuj__repr__
metody. Z dokumentacji Python :źródło
print "DEBUG: object value: " + repr(obj)
Może warto to sprawdzić -
Czy istnieje Python równoważny Perlowi Data :: Dumper?
Moje zalecenie jest następujące -
https://gist.github.com/1071857
Zauważ, że perl ma moduł o nazwie Data :: Dumper, który tłumaczy dane obiektowe z powrotem na kod źródłowy perla (UWAGA: NIE tłumaczy kodu z powrotem na źródło i prawie zawsze nie chcesz, aby funkcja metody obiektowej na wyjściu). Można tego użyć do trwałości, ale wspólnym celem jest debugowanie.
Istnieje wiele rzeczy, których nie osiąga standardowy wydruk w Pythonie, w szczególności przestaje opadać, gdy widzi instancję obiektu i daje wewnętrzny wskaźnik heksadecymalny obiektu (errr, ten wskaźnik nie jest zbyt często używany przez droga). Krótko mówiąc, w Pythonie chodzi o ten wspaniały paradygmat zorientowany obiektowo, ale narzędzia, które dostajesz po wyjęciu z pudełka, są zaprojektowane do pracy z czymś innym niż obiekty.
Perl Data :: Dumper pozwala kontrolować głębokość, którą chcesz zejść, a także wykrywa okrągłe struktury połączone (to naprawdę ważne). Proces ten jest zasadniczo łatwiejszy do zrealizowania w Perlu, ponieważ obiekty nie mają żadnej szczególnej magii poza ich błogosławieństwem (proces powszechnie zdefiniowany).
źródło
Polecam używać
help(your_object)
.help(dir)
help(vars)
źródło
W większości przypadków przy użyciu
__dict__
lubdir()
otrzymasz informacje, których potrzebujesz. Jeśli potrzebujesz więcej szczegółów, standardowa biblioteka zawiera moduł inspekcji , który pozwala uzyskać imponującą ilość szczegółów. Niektóre z prawdziwych sugestii informacji obejmują:Jeśli szukasz po prostu „co robi mój wartości atrybutu obiektu mają?”, A potem
dir()
i__dict__
są prawdopodobnie wystarczające. Jeśli naprawdę chcesz zagłębić się w bieżący stan dowolnych obiektów (pamiętając, że w pythonie prawie wszystko jest przedmiotem),inspect
to warto go rozważyć.źródło
Nie. Najpopularniejsza odpowiedź wyklucza niektóre rodzaje atrybutów, a zaakceptowana odpowiedź pokazuje, jak uzyskać wszystkie atrybuty, w tym metody i części niepublicznego interfejsu API. Ale nie ma do tego dobrej kompletnej wbudowanej funkcji.
Zatem następstwem jest to, że możesz napisać własny, ale będzie on obliczał właściwości i inne obliczone deskryptory danych, które są częścią publicznego interfejsu API, i możesz tego nie chcieć:
Problemy z innymi odpowiedziami
Obserwuj zastosowanie obecnie najlepiej głosowanej odpowiedzi w klasie z wieloma różnymi rodzajami członków danych:
drukuje tylko:
Ponieważ zwraca
vars
tylko__dict__
obiekt, a nie kopię, więc jeśli zmodyfikujesz dykt zwrócony przez vars, zmodyfikujesz również__dict__
sam obiekt.zwroty:
- co jest złe, ponieważ quux jest właściwością, której nie powinniśmy ustawiać i nie powinniśmy znajdować się w przestrzeni nazw ...
Zastosowanie porady w obecnie akceptowanej odpowiedzi (i innych) nie jest dużo lepsze:
Jak widzimy,
dir
zwraca tylko wszystkie (właściwie tylko większość) nazw związanych z obiektem.inspect.getmembers
, wspomniane w komentarzach, jest podobnie wadliwe - zwraca wszystkie nazwy i wartości.Z klasy
Podczas nauczania mam uczniów, którzy tworzą funkcję, która zapewnia semantycznie publiczny interfejs API obiektu:
Możemy to rozszerzyć, aby uzyskać kopię semantycznej przestrzeni nazw obiektu, ale musimy wykluczyć
__slots__
, które nie są przypisane, a jeśli poważnie traktujemy żądanie „bieżących właściwości”, musimy wykluczyć właściwości obliczone (ponieważ mogą stać się drogie i mogą być interpretowane jako nie „aktualne”):A teraz nie obliczamy ani nie pokazujemy właściwości, quux:
Ostrzeżenia
Ale może wiemy, że nasze nieruchomości nie są drogie. Możemy chcieć zmienić logikę, aby również je uwzględnić. Być może zamiast tego chcemy wykluczyć inne niestandardowe deskryptory danych.
Następnie musimy dodatkowo dostosować tę funkcję. Ma to zatem sens, że nie możemy mieć wbudowanej funkcji, która magicznie dokładnie wie, czego chcemy i zapewnia to. To funkcjonalność, którą sami musimy stworzyć.
Wniosek
Nie ma wbudowanej funkcji, która to robi, i powinieneś robić to, co jest najbardziej semantycznie odpowiednie dla twojej sytuacji.
źródło
FunctionType
. Ale bardzo pomocne - dzięki!Przykład metaprogramowania Zrzuć obiekt za pomocą magii :
Bez argumentów:
Z Gnosis Utils :
Jest trochę przestarzały, ale nadal działa.
źródło
Jeśli używasz tego do debugowania i chcesz po prostu rekurencyjnego zrzutu wszystkiego, zaakceptowana odpowiedź jest niezadowalająca, ponieważ wymaga, aby Twoje klasy miały
__str__
już dobre implementacje. Jeśli tak nie jest, działa to znacznie lepiej:źródło
TypeError: vars() argument must have __dict__ attribute
Spróbuj ppretty
Wynik:
źródło
źródło
Spowoduje to wydrukowanie całej zawartości obiektu rekurencyjnie w formacie wcięcia w formacie json lub yaml:
źródło
Głosowałem za odpowiedzią, która wymienia tylko pprint. Dla jasności, jeśli chcesz zobaczyć wszystkie wartości w złożonej strukturze danych, zrób coś takiego:
Gdzie my_var jest Twoją zmienną zainteresowania. Kiedy użyłem
pprint(vars(my_var))
, nic nie dostałem, a inne odpowiedzi tutaj nie pomogły lub metoda wyglądała niepotrzebnie długo. Nawiasem mówiąc, w moim szczególnym przypadku kod, który sprawdzałem, miał słownik słowników.Warto zauważyć, że w przypadku niektórych klas niestandardowych może dojść do niepomocnego
<someobject.ExampleClass object at 0x7f739267f400>
wyniku. W takim przypadku może być konieczne zaimplementowanie__str__
metody lub wypróbowanie niektórych innych rozwiązań. Wciąż chciałbym znaleźć coś prostego, co zadziała we wszystkich scenariuszach, bez bibliotek stron trzecich.źródło
Musiałem wydrukować informacje o DEBUGIE w niektórych logach i nie mogłem użyć pprint, ponieważ może to spowodować uszkodzenie. Zamiast tego zrobiłem to i dostałem praktycznie to samo.
źródło
Aby zrzucić „myObject”:
Próbowałem vars () i dir (); oba zawiodły w tym, czego szukałem. Funkcja vars () nie działała, ponieważ obiekt nie miał __dict__ (wyjątki.TypeError: argument vars () musi mieć atrybut __dict__). dir () nie był tym, czego szukałem: to tylko lista nazw pól, nie podaje wartości ani struktury obiektu.
Myślę, że json.dumps () działałby dla większości obiektów bez wartości domyślnej = json_util.default, ale miałem w obiekcie pole daty i godziny, więc standardowy serializator json nie powiódł się. Zobacz Jak przezwyciężyć „datetime.datetime not JSON serializable” w pythonie?
źródło
Dlaczego nie coś prostego:
źródło
for key,value in obj.__dict__.iteritems(): print key,value
?pprint zawiera „ładną drukarkę” do tworzenia estetycznych reprezentacji twoich struktur danych. Formater tworzy reprezentacje struktur danych, które mogą być poprawnie przeanalizowane przez interpretera, a także łatwe do odczytania przez człowieka. Dane wyjściowe są przechowywane w jednym wierszu, jeśli to możliwe, i wcięte, gdy są dzielone na wiele wierszy.
źródło
Po prostu wypróbuj beeprint .
Pomoże ci to nie tylko w drukowaniu zmiennych obiektowych, ale także w pięknych wynikach, takich jak:
źródło
Dla wszystkich, którzy walczą
vars()
nie zwraca wszystkich atrybutów.dir()
nie zwraca wartości atrybutów.Poniższy kod wyświetla wszystkie atrybuty
obj
wraz z ich wartościami:źródło
Możesz wypróbować pasek narzędzi debugowania Flask.
https://pypi.python.org/pypi/Flask-DebugToolbar
źródło
Lubię pracować z kluczami lub wartościami wbudowanych obiektów Pythona .
W przypadku atrybutów, niezależnie od tego, czy są to metody lub zmienne:
Dla wartości tych atrybutów:
źródło
Działa to bez względu na to, jak zdefiniowane są zmienne w klasie, wewnątrz __init__ lub na zewnątrz.
źródło