Что такое Python-эквивалент PHP var_dump ()? [Дубликат]

304

При отладке PHP я часто считаю полезным просто вставить var_dump() в мой код, чтобы показать мне, что такое переменная, какова его ценность, и то же самое для всего, что она содержит.

Что такое хороший эквивалент Python для этого?

  • 2
    Я нашел это в поисках эквивалента PHP для pyrons repr. Благодарю.
  • 0
    повторяющийся вопрос, который упоминает @hop (и получивший наибольшее количество голосов), был для меня гораздо полезнее
Показать ещё 2 комментария
Теги:
debugging

10 ответов

217
Лучший ответ

Чтобы отобразить значение красиво, вы можете использовать модуль pprint. Самый простой способ сбрасывать все переменные с ним - это делать

from pprint import pprint

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

Если вы работаете в CGI, полезной функцией отладки является модуль cgitb, который отображает значение локальных переменных как часть трассировка.

  • 14
    как насчет показа типа var? как Null / None, String, Object ..
  • 0
    Как насчет pprint() для перечисления объектов, перестановок и т. Д.?
Показать ещё 2 комментария
257

Я думаю, что лучший эквивалент PHP var_dump($foo, $bar) заключается в объединении print с vars:

print vars(foo),vars(bar)
  • 24
    Этот ответ, возможно, был опубликован позже, чем остальные, но он все еще был самым полезным для меня. +1
  • 1
    То же самое здесь, только то, что сработало, как я ожидал (например, var_dump)
Показать ещё 4 комментария
40

Самое близкое к PHP var_dump() - pprint() с функцией getmembers() во встроенном inspect модуль:

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

PHP var_export() обычно показывает сериализованную версию объекта, которая может быть exec() 'd для повторного создания объекта. Самое близкое к тому, что в Python repr()

"Для многих типов эта функция пытается вернуть строку, которая даст объект с тем же значением при передаче в eval() [...]"

  • 2
    Я думаю, что вы думаете о var_export .
  • 0
    да, var_export в php и repr в python несколько связаны - если вы хотите получить официальное строковое представление какого-либо объекта - вы используете repr (). Для того, чтобы иметь неофициальный (читаемый человек), вы всегда можете принудительно преобразовать в строку: str (объект), которая производит информацию, аналогичную php print_r () (для отладки использовалось гораздо чаще, чем var_dump).
Показать ещё 1 комментарий
15

Итак, я взял ответы на этот вопрос и еще один вопрос и подошел ниже. Я подозреваю, что для большинства людей это недостаточно pythonic, но я действительно хотел что-то, что позволило мне получить глубокое представление значений, которые имеет неизвестная переменная. Я был бы признателен за любые предложения о том, как я могу улучшить это или добиться того же самого поведения.

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

Здесь используется

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))

и результаты.

{'__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)}
  • 0
    +1, я нашел это полезным.
  • 1
    +1, это единственный ответ, который на самом деле имеет функциональность var_dump , когда сталкивается с объектами
Показать ещё 1 комментарий
10

Я написал очень легкую альтернативу PHP var_dump для использования в Python и позже сделал его открытым.

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

Вы можете просто установить его с помощью pip:

pip install var_dump
  • 3
    отличный инструмент, спасибо
  • 0
    просто и красиво
Показать ещё 2 комментария
3

Старая тема, но стоит попробовать.

Вот простая и эффективная функция 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 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='')

Пример вывода:

>>> 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
2

У меня нет опыта PHP, но у меня есть понимание стандартной библиотеки Python.

В ваших целях Python имеет несколько методов:

logging модуль;

Модуль сериализации объектов, который называется pickle. Вы можете написать свою собственную оболочку модуля рассола.

Если вы используете var_dump для тестирования, у Python есть свой doctest и unittest. Это очень просто и быстро для дизайна.

2

print

Для ваших собственных классов просто выберите метод __str__

1

Я использую самоналоженный класс принтера, но dir() также хорош для вывода полей/значений экземпляра.

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)

Пример использования:

Printer(MyClass)
  • 0
    если '_' отсутствует в str (имя) .join (str (значение)): ^ SyntaxError: неверный синтаксис

Ещё вопросы

Сообщество Overcoder
Наверх
Меню