Так что я ищу здесь что-то вроде PHP функции print_r .
Это так, чтобы я мог отлаживать свои сценарии, видя состояние рассматриваемого объекта.
Так что я ищу здесь что-то вроде PHP функции print_r .
Это так, чтобы я мог отлаживать свои сценарии, видя состояние рассматриваемого объекта.
Вы действительно смешиваете две разные вещи.
Используйте dir()
, vars()
или inspect
модуль , чтобы получить то , что вы заинтересованы в том, (я использую в __builtins__
качестве примера, вы можете использовать любой объект , а).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Распечатайте этот словарь так, как вам нравится:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
или
>>> 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',
...
Красивая печать также доступна в интерактивном отладчике в виде команды:
(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__
члена (re.MatchObject
например), но встроенные функцииdir()
работают для всех объектов.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
модуле в своем ответе? Я думаю, что это самая близкая вещь к print_r или var_dump.dir()
, тогда?dir()
возвращает только список имен, и не все из них существуют вvars()
или в__dict__
атрибуте.Вы хотите
vars()
смешать сpprint()
:источник
vars()
просто возвращает__dict__
свой аргумент, и это также запасной вариант,dir()
если нет__dir__
метода. так что используйтеdir()
в первую очередь, как я уже сказал.dir()
дает вам все встроенные в вещи , которые вы , вероятно , не заботятся о том, как__str__
и__new__
.var()
не делает.__dict__
атрибута.Существует множество сторонних функций, которые добавляют такие вещи, как обработка исключений, печать национальных / специальных символов, повторное использование вложенных объектов и т. Д. В соответствии с предпочтениями их авторов. Но все они в основном сводятся к этому.
источник
getmembers()
функцию в стандартномinspect
модуле, но я подумал, что это было бы более полезно, поскольку оно иллюстрирует, как сделать самоанализ в целом.__dict__
(такие как__doc__
и__module__
). Кроме того,__dict__
совсем не работает для объектов, объявленных с__slots__
. В общем,__dict__
показывает пользовательские свойства, которые на самом деле хранятся в словаре внутри. dir () показывает больше.__dict__
атрибутов / членов. Я знаю, что это безумие, но это правда. Встроенные модули, такие какint
andstr
илиre.MatchObject
s, являются типичными примерами. Попробуй'hello'.__dict__
, потом попробуйdir('hello')
dir был упомянут, но это даст вам только имена атрибутов. Если вы хотите их значения, попробуйте __dict__.
Вот вывод:
источник
set
не имеет__dict__
, поэтому для них это не удастсяAttributeError: 'set' object has no attribute '__dict__'
Вы можете использовать функцию "dir ()", чтобы сделать это.
Еще одна полезная функция - помощь.
источник
Чтобы напечатать текущее состояние объекта, вы можете:
или
или
Для ваших занятий определите
__str__
или__repr__
методы. Из документации Python :источник
print "DEBUG: object value: " + repr(obj)
Может стоит проверить -
Есть ли Python эквивалентный Perl Data :: Dumper?
Моя рекомендация такая -
https://gist.github.com/1071857
Обратите внимание, что в perl есть модуль Data :: Dumper, который переводит данные объекта обратно в исходный код perl (примечание: он НЕ переводит код обратно в исходный код, и почти всегда вам не нужны функции метода объекта в выходных данных). Это может использоваться для постоянства, но общая цель для отладки.
Есть ряд вещей, которые не удается выполнить стандартному python pprint, в частности он просто останавливается, когда видит экземпляр объекта, и выдает внутренний шестнадцатеричный указатель объекта (ошибочно, этот указатель не очень полезен путь). Итак, в двух словах, Python - это все об этой великолепной объектно-ориентированной парадигме, но инструменты, которые вы получаете из коробки, предназначены для работы с чем-то, кроме объектов.
Perl Data :: Dumper позволяет вам контролировать, насколько глубоко вы хотите зайти, а также обнаруживает циклически связанные структуры (это действительно важно). Этот процесс принципиально проще осуществить в Perl, потому что у объектов нет особой магии, кроме их благословения (универсально четко определенный процесс).
источник
Я рекомендую использовать
help(your_object)
.help(dir)
help(vars)
источник
В большинстве случаев, используя
__dict__
илиdir()
вы получите необходимую информацию. Если вам нужно больше подробностей, стандартная библиотека включает в себя модуль проверки , который позволяет получить впечатляющее количество деталей. Некоторые из реальных кусочков информации включают в себя:Если вы просто ищете «какие значения атрибутов имеет мой объект?», То
dir()
и__dict__
, вероятно, достаточно. Если вы действительно хотите заглянуть в текущее состояние произвольных объектов (имея в виду, что в python почти все является объектом), тоinspect
стоит рассмотреть.источник
Нет. Ответ с наибольшим количеством голосов исключает некоторые виды атрибутов, и принятый ответ показывает, как получить все атрибуты, включая методы и части закрытого API. Но нет хорошего полного встроенного функции.
Таким образом, короткое следствие заключается в том, что вы можете написать свой собственный, но он будет вычислять свойства и другие вычисляемые дескрипторы данных, которые являются частью общедоступного API, и вы можете этого не захотеть:
Проблемы с другими ответами
Обратите внимание на применение ответа, получившего наибольшее количество голосов в классе с множеством различных типов данных:
только отпечатки:
Потому что возвращает
vars
только__dict__
объект, и это не копия, поэтому, если вы изменяете dict, возвращаемый vars, вы также изменяете__dict__
сам объект.возвращает:
- что плохо, потому что quux - это свойство, которое мы не должны устанавливать и не должны находиться в пространстве имен ...
Применение совета в принятом в настоящее время ответе (и других) не намного лучше:
Как мы видим,
dir
возвращает только все (на самом деле только большинство) из имен, связанных с объектом.inspect.getmembers
Упоминается в комментариях, также имеет недостатки - возвращает все имена и значения.Из класса
При обучении мои ученики создают функцию, которая предоставляет семантически открытый API объекта:
Мы можем расширить это, чтобы предоставить копию семантического пространства имен объекта, но нам нужно исключить
__slots__
те, которые не назначены, и, если мы серьезно относимся к запросу «текущих свойств», нам нужно исключить вычисляемые свойства (так как они могут стать дорогими и могут быть истолкованы как не «текущие»):И теперь мы не рассчитываем и не показываем свойство quux:
Предостережения
Но, возможно, мы знаем, что наша недвижимость не дорогая. Мы можем захотеть изменить логику, чтобы включить их. И, возможно, мы хотим исключить другие пользовательские дескрипторы данных.
Затем нам нужно дополнительно настроить эту функцию. И поэтому имеет смысл, что у нас не может быть встроенной функции, которая волшебным образом точно знает, чего мы хотим, и обеспечивает ее. Это функциональность, которую мы должны создать сами.
Вывод
Нет встроенной функции, которая делает это, и вы должны делать то, что наиболее семантически подходит для вашей ситуации.
источник
FunctionType
. Но очень полезно - спасибо!Пример метапрограммирования Dump объект с магией :
Без аргументов:
С Gnosis Utils :
Это немного устарело, но все еще работает.
источник
Если вы используете это для отладки и просто хотите получить рекурсивный дамп всего, принятый ответ неудовлетворителен, поскольку требует, чтобы у ваших классов уже были хорошие
__str__
реализации. Если это не так, это работает намного лучше:источник
TypeError: vars() argument must have __dict__ attribute
Попробуйте ppretty
Вывод:
источник
источник
Это распечатывает все содержимое объекта рекурсивно в формате с отступом json или yaml:
источник
Я проголосовал за ответ, который упоминает только pprint. Для ясности, если вы хотите увидеть все значения в сложной структуре данных, сделайте что-то вроде:
Где my_var - ваша переменная интереса. Когда я использовал,
pprint(vars(my_var))
я ничего не получил, и другие ответы здесь не помогли, или метод выглядел излишне длинным. Кстати, в моем конкретном случае проверяемый код содержал словарь словарей.Стоит отметить, что с некоторыми пользовательскими классами вы можете просто получить бесполезный
<someobject.ExampleClass object at 0x7f739267f400>
вид вывода. В этом случае вам может понадобиться реализовать__str__
метод или попробовать другие решения. Я все еще хотел бы найти что-то простое, которое работает во всех сценариях, без сторонних библиотек.источник
Мне нужно было распечатать информацию отладки в некоторых журналах и не смог использовать pprint, потому что это сломало бы ее. Вместо этого я сделал это и получил практически то же самое.
источник
Чтобы создать дамп myObject:
Я пробовал vars () и dir (); оба потерпели неудачу из-за того, что я искал. vars () не работал, потому что у объекта не было __dict__ (exceptions.TypeError: аргумент vars () должен иметь атрибут __dict__). dir () не то, что я искал: это просто список имен полей, не дает значений или структуру объекта.
Я думаю, что json.dumps () будет работать для большинства объектов без default = json_util.default, но у меня было поле datetime в объекте, поэтому стандартный сериализатор json не сработал. Смотрите Как преодолеть «datetime.datetime, не JSON serializable» в python?
источник
Почему не что-то простое:
источник
for key,value in obj.__dict__.iteritems(): print key,value
?pprint содержит «симпатичный принтер» для создания эстетически приятных представлений о ваших структурах данных. Форматировщик создает представления структур данных, которые могут быть правильно проанализированы интерпретатором, и которые также легко читаются человеком. Выходные данные хранятся в одной строке, если это возможно, и имеют отступ, если разделены на несколько строк.
источник
Просто попробуйте beeprint .
Это поможет вам не только с печатью переменных объекта, но и с красивым выводом, например так:
источник
Для всех, кто борется с
vars()
не возвращает все атрибуты.dir()
не возвращает значения атрибутов.Следующий код печатает все атрибуты
obj
с их значениями:источник
Вы можете попробовать панель инструментов отладки Flask.
https://pypi.python.org/pypi/Flask-DebugToolbar
источник
Мне нравится работать с ключами или значениями встроенных типов объектов Python .
Для атрибутов независимо от того, являются ли они методами или переменными:
Для значений этих атрибутов:
источник
Это работает независимо от того, как ваши переменные определены в классе, внутри __init__ или снаружи.
источник