Co to jest Python odpowiednik var dump () PHP? [duplikat]

to pytanie ma już odpowiedzi tutaj : czy istnieje wbudowana funkcja, która wyświetla wszystkie bieżące właściwości i wartości obiektu? (25 odpowiedzi) Zamknięty 6 lat temu .

Podczas debugowania w PHP, często uważam, że przydatne jest po prostu umieszczenie var_dump() w moim kodzie, aby pokazać mi, czym jest zmienna, jaka jest jej wartość i to samo dla wszystkiego, co zawiera.

Jaki jest do tego dobry odpowiednik Pythona?

Author: Zoredache, 2008-12-21

10 answers

Aby ładnie wyświetlić wartość, możesz użyć modułu pprint . Najprostszym sposobem na zrzut wszystkich zmiennych jest wykonanie

from pprint import pprint

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

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

 295
Author: Martin v. Löwis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 22:08:09

Myślę, że najlepszym odpowiednikiem PHP {[1] } jest combine print z vars:

print vars(foo),vars(bar)
 335
Author: Jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 16:45:27

Najbliższą rzeczą PHP ' s var_dump() jest pprint() z funkcją getmembers() we wbudowanym module inspect:

from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObj))
 62
Author: Hai Phaikawl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 05:10:40

PHP's var_export() Zwykle pokazuje serializowaną wersję obiektu, która może być exec ()' d do ponownego utworzenia obiektu. Najbliższą rzeczą w Pythonie jest repr()

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

 25
Author: Cody Casterline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 09:32:17

Napisałem bardzo lekką alternatywę dla PHP var_dump do użycia w Pythonie i zrobiłem ją później open source.

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

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

pip install var_dump
 23
Author: sha256,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 05:12:31

Więc wziąłem odpowiedzi z tego pytania i inne pytanie I przyszedł poniżej. Podejrzewam, że nie jest to wystarczająco pythoniczne dla większości ludzi, ale naprawdę chciałem czegoś, co pozwoli mi uzyskać głęboką reprezentację wartości, które ma jakaś nieznana zmienna. Byłbym wdzięczny za wszelkie sugestie dotyczące tego, jak mogę poprawić to lub osiągnąć to samo zachowanie łatwiej.

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)}
 15
Author: Zoredache,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:59

Stary temat, ale warto spróbować.

Oto prosta i efektywna Funkcja var_dump:

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 wyjście:

>>> 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
 8
Author: Jivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 14:22:49

Nie mam doświadczenia w PHP, ale znam standardową bibliotekę Pythona.

Do Twoich celów, Python ma kilka metod:

Logging module;

Moduł serializacji obiektów, który nazywa się pickle . Możesz napisać własne opakowanie modułu pickle.

Jeśli używasz var_dump do testowania, Python ma własne moduły doctest i unittest. Jest bardzo prosty i szybki w projektowaniu.

 2
Author: Dmitry Zagorulkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 05:12:04

print

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

 1
Author: Oli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-21 00:58:36

Używam samodzielnie napisanej klasy drukarki, ale dir() jest również dobre do wysyłania pól/wartości instancji.

class Printer:

       def __init__ (self, PrintableClass):
           for name in dir(PrintableClass):
               value = getattr(PrintableClass,name)
               if  '_' not in str(name).join(str(value)):
                    print '  .%s: %r' % (name, value)

Próbka użycia:

Printer(MyClass)
 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-18 09:08:37