Intereting Posts

Что такое эквивалент Python PHP var_dump ()?

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

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

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

from pprint import pprint pprint(globals()) pprint(locals()) 

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

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

 print vars(foo),vars(bar) 

Ближайшей var_dump() PHP var_dump() является pprint() с getmembers() во встроенном модуле inspect :

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

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

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

Поэтому я взял ответы на этот вопрос и другой вопрос и подошел ниже. Я подозреваю, что для большинства людей это недостаточно 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)} 

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

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

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

 pip install var_dump 

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

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

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

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

print

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

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

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

модуль регистрации ;

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

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

Я использую самоналоженный класс принтера, но 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)