Pytanie Co to jest odpowiednik Pythona dla PHP var_dump ()? [duplikować]


To pytanie już zawiera odpowiedź:

Podczas debugowania w PHP często przydaje się po prostu przyklejać var_dump () w moim kodzie, aby pokazać mi czym jest zmienna, jaka jest jej wartość, i tym samym dla wszystkiego, co zawiera.

Co to jest dobry odpowiednik w Pythonie?


354
2017-12-21 00:43


pochodzenie


Znalazłem to szukając odpowiednika PHP dla pythons repr. Dzięki. - Danny Staple
zduplikowane pytanie @hop (i najwyższa głosowana odpowiedź) było dla mnie o wiele bardziej przydatne - cwd
Jeśli często używasz tej funkcji, możesz rozważyć użycie dobrego zdalnego debuggera z punktami przerwania. Na początku może to być trudne do zrozumienia, ale zaoszczędzi ci to czasu w przyszłości, a gdy już się o tym dowiesz, nigdy nie wrócisz. Wiem, że Zaćmienie ma dobre, podobnie jak Komodo. docs.activestate.com/komodo/8.0/... - styks
ponieważ ten wątek jest zamknięty, zobacz tę odpowiedź, która korzysta z serializacji jsonpickle: stackoverflow.com/a/35804583/1081043 - wisbucky


Odpowiedzi:


Aby wyświetlić ładnie wartość, możesz użyć znaku pprint moduł. Najprościej jest zrzucić wszystkie zmienne za pomocą tego

from pprint import pprint

pprint(globals())
pprint(locals())

Jeśli używasz CGI, użyteczną funkcją debugowania jest cgitb moduł, który wyświetla wartość zmiennych lokalnych jako część ścieżki zwrotnej.


232
2017-12-21 00:59



co z pokazaniem typu var? jak Null / None, String, Object .. - holms
Co powiesz na pprint() na wyliczać obiekty, permutacjeitp.? - JSmyth
To było pomocne. Jestem noobem Pythona, ale wydawało mi się, że pomógł mi mój przypadek .__dict__, np. pprint(object.__dict__). - Elijah Lynn
object.__dict__ wyprowadza wszystkie właściwości obiektu - Ligemer


Myślę, że najlepszy odpowiednik PHP var_dump($foo, $bar) jest połączony print z vars:

print vars(foo),vars(bar)

288
2018-05-22 17:21



Ta odpowiedź mogła zostać opublikowana później niż reszta, ale nadal była dla mnie najbardziej pomocna. - +1. - ralokt
To samo, tylko to, co działało zgodnie z oczekiwaniami (jak var_dump) - Kin
Wygląda na to, że dla vars działa, zmienna musi mieć informacje ze słownika, w przeciwnym razie pojawi się argument "TypeError: vars () musi mieć atrybut __ dyktować __". - Ken
Zrobiłem to dla mnie - ale lubię też pprint. Oto hybryda: pprint.pprint(vars(foo)). - dsummersl
-1, działa to tylko dla niektórych typów zmiennych, nie dla wszystkich. Zamiast tego rozważ pprint lub repr - GetFree


Najbliższa rzecz PHP„s var_dump() jest pprint() z getmembers() funkcja w wbudowanym inspect moduł:

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))

45
2018-05-22 10:58





PHP var_export () zwykle pokazuje serializowaną wersję obiektu, który może być exec () 'd, aby ponownie utworzyć obiekt. Najbliższą rzeczą w Pythonie jest repr ()

"W przypadku wielu typów funkcja ta próbuje zwrócić ciąg znaków, który dałby obiekt o tej samej wartości, po przekazaniu do eval () [...]"


23
2017-12-21 03:02



Myślę, że myślisz var_export. - Paul Biggar
yep, var_export w php i repr w pythonie są nieco spokrewnione - to jeśli chcesz oficjalny ciąg znaków reprezentujący jakiś obiekt - używasz repr (). Aby mieć wartość nieoficjalną (read human-readable), zawsze możesz wymusić konwersję na ciąg: str (object), który generuje informacje podobne do print_r (php) (używał o wiele więcej do debugowania niż var_dump). - Victor Farazdagi
Napraw odpowiedź, jest niepoprawna. Jak wspomniano, albo mówisz o var_export lub opisujesz var_dump () inaczej. - mark


Więc wziąłem odpowiedzi na to pytanie i inne pytanie i podszedł poniżej. Podejrzewam, że nie jest to wystarczająco pytonowskie dla większości ludzi, ale naprawdę chciałem czegoś, co pozwoliło mi uzyskać głęboką reprezentację wartości, jakie ma nieznana zmienna. Byłbym wdzięczny za wszelkie sugestie, w jaki sposób mogę to poprawić lub osiągnąć to samo zachowanie łatwiejsze.

def dump(obj):
  '''return a printable representation of an object for debugging'''
  newobj=obj
  if '__dict__' in dir(obj):
    newobj=obj.__dict__
    if ' object at ' in str(obj) and not newobj.has_key('__type__'):
      newobj['__type__']=str(obj)
    for attr in newobj:
      newobj[attr]=dump(newobj[attr])
  return newobj

Oto użycie

class stdClass(object): pass
obj=stdClass()
obj.int=1
obj.tup=(1,2,3,4)
obj.dict={'a':1,'b':2, 'c':3, 'more':{'z':26,'y':25}}
obj.list=[1,2,3,'a','b','c',[1,2,3,4]]
obj.subObj=stdClass()
obj.subObj.value='foobar'

from pprint import pprint
pprint(dump(obj))

i wyniki.

{'__type__': '<__main__.stdClass object at 0x2b126000b890>',
 'dict': {'a': 1, 'c': 3, 'b': 2, 'more': {'y': 25, 'z': 26}},
 'int': 1,
 'list': [1, 2, 3, 'a', 'b', 'c', [1, 2, 3, 4]],
 'subObj': {'__type__': '<__main__.stdClass object at 0x2b126000b8d0>',
            'value': 'foobar'},
 'tup': (1, 2, 3, 4)}

16
2017-12-22 21:26



+1, uznałem to za przydatne. - gradbot
+1, to jest jedyna odpowiedź, która tak naprawdę ma var_dumpfunkcjonalność po napotkaniu obiektów - Izkata
+1 bardzo przydatne, ale pokazuje błąd z "jeśli"dyktować"in dir (obj):", mógłbym poprawić używając instancji "if" w 'in str (obj) i obj .__ dict__: " - phipex


Napisałem bardzo lekką alternatywę dla PHP var_dump do używania w Pythonie i później udostępniłem go jako open source.

GitHub: https://github.com/sha256/python-var-dump

Możesz po prostu zainstalować go za pomocą pip:

pip install var_dump

13
2017-08-30 08:00



wspaniałe narzędzie, dzięki - user455318
prosty i miły - JSmyth
Brak zestawów - github.com/sha256/python-var-dump/issues/8 - anatoly techtonik
Idziemy tam, właśnie tego szukałem. - kagronick


Stary temat, ale warto spróbować.

Oto prosty i skuteczny var_dump funkcjonować:

def var_dump(var, prefix=''):
    """
    You know you're a php developer when the first thing you ask for
    when learning a new language is 'Where's var_dump?????'
    """
    my_type = '[' + var.__class__.__name__ + '(' + str(len(var)) + ')]:'
    print(prefix, my_type, sep='')
    prefix += '    '
    for i in var:
        if type(i) in (list, tuple, dict, set):
            var_dump(i, prefix)
        else:
            if isinstance(var, dict):
                print(prefix, i, ': (', var[i].__class__.__name__, ') ', var[i], sep='')
            else:
                print(prefix, '(', i.__class__.__name__, ') ', i, sep='')

Przykładowe wyniki:

>>> var_dump(zen)

[list(9)]:
    (str) hello
    (int) 3
    (int) 43
    (int) 2
    (str) goodbye
    [list(3)]:
        (str) hey
        (str) oh
        [tuple(3)]:
            (str) jij
            (str) llll
            (str) iojfi
    (str) call
    (str) me
    [list(7)]:
        (str) coucou
        [dict(2)]:
            oKey: (str) oValue
            key: (str) value
        (str) this
        [list(4)]:
            (str) a
            (str) new
            (str) nested
            (str) list

3
2018-02-15 00:03





print

Dla własnych klas, po prostu def a __str__ metoda


2
2017-12-21 00:58