Есть ли встроенная функция для печати всех текущих свойств и значений объекта? - PullRequest
809 голосов
/ 10 октября 2008

Так что я ищу здесь что-то вроде функции PHP print_r . Это так, чтобы я мог отлаживать свои сценарии, видя состояние рассматриваемого объекта.

Ответы [ 23 ]

4 голосов
/ 04 марта 2016

Это распечатывает все содержимое объекта рекурсивно в формате с отступом json или yaml:

import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml

serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
4 голосов
/ 24 ноября 2014

Если вы используете это для отладки и хотите просто рекурсивный дамп всего, принятый ответ неудовлетворителен, поскольку требует, чтобы у ваших классов уже были хорошие реализации __str__. Если это не так, это работает намного лучше:

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))
3 голосов
/ 28 июня 2013

Мне нужно было распечатать информацию отладки в некоторых журналах, и я не смог использовать pprint, потому что это сломало бы ее. Вместо этого я сделал это и получил практически то же самое.

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])
3 голосов
/ 28 июля 2016

Попробуйте ppretty

from ppretty import ppretty


class A(object):
    s = 5

    def __init__(self):
        self._p = 8

    @property
    def foo(self):
        return range(10)


print ppretty(A(), show_protected=True, show_static=True, show_properties=True)

Выход:

__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
3 голосов
/ 14 июля 2014
from pprint import pprint

def print_r(the_object):
    print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
    pprint(vars(the_object))
3 голосов
/ 26 июня 2014

Для сброса "myObject":

from bson import json_util
import json

print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))

Я пробовал vars () и dir (); оба потерпели неудачу из-за того, что я искал. vars () не работал, потому что у объекта не было __dict__ (exceptions.TypeError: аргумент vars () должен иметь атрибут __dict__). dir () не то, что я искал: это просто список имен полей, не дает значений или структуру объекта.

Я думаю, что json.dumps () будет работать для большинства объектов без default = json_util.default, но у меня было поле datetime в объекте, поэтому стандартный сериализатор json не сработал. См. Как преодолеть "datetime.datetime не сериализуемый JSON" в python?

2 голосов
/ 28 сентября 2017

Я проголосовал за ответ, в котором упоминается только pprint. Чтобы было понятно, если вы хотите увидеть все значения в сложной структуре данных, то сделайте что-то вроде:

from pprint import pprint
pprint(my_var)

Где my_var - ваша переменная интереса. Когда я использовал pprint (vars (my_var)), я ничего не получил, и другие ответы здесь не помогли или метод выглядел излишне длинным. Кстати, в моем конкретном случае проверяемый код содержал словарь словарей.

Стоит отметить, что с некоторыми пользовательскими классами вы можете просто получить бесполезный вывод <someobject.ExampleClass object at 0x7f739267f400>. В этом случае вам, возможно, придется реализовать метод __str__ или попробовать другие решения. Я все еще хотел бы найти что-то простое, которое работает во всех сценариях, без сторонних библиотек.

2 голосов
/ 16 сентября 2016

Просто попробуйте beeprint .

Это поможет вам не только с печатью переменных объекта, но и с красивым выводом, например:

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)
2 голосов
/ 13 сентября 2010

pprint содержит «симпатичный принтер» для создания эстетически приятных представлений ваших структур данных. Форматировщик создает представления структур данных, которые могут быть правильно проанализированы интерпретатором, и которые также легко читаются человеком. Выходные данные сохраняются в одной строке, если возможно, и с отступом при разбивке на несколько строк.

2 голосов
/ 14 июня 2013

Почему бы не что-то простое:

for key,value in obj.__dict__.iteritems():
    print key,value
...