Есть ли встроенная функция для печати всех текущих свойств и значений объекта?

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

Ответ 1

Вы действительно смешиваете две разные вещи.

Используйте 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__'}

Ответ 2

Вы хотите, чтобы vars() смешивался с pprint():

from pprint import pprint
pprint(vars(your_object))

Ответ 3

def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

Есть много сторонних функций, которые добавляют такие вещи, как обработка исключений, печать на национальном/специальном символе, рекурсия на вложенные объекты и т.д. В соответствии с предпочтениями их авторов. Но все они сводятся к этому.

Ответ 4

dir упоминается, но это даст вам только имена атрибутов. Если вы хотите, чтобы их значения также старались __dict __.

class O:
   def __init__ (self):
      self.value = 3

o = O()

Вот результат:

>>> o.__dict__

{'value': 3}

Ответ 5

Вы можете использовать функцию dir() для этого.

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>

Еще одна полезная функция - помощь.

>>> help(sys)
Help on built-in module sys:

NAME
    sys

FILE
    (built-in)

MODULE DOCS
    http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known

Ответ 6

Чтобы напечатать текущее состояние объекта, вы можете:

>>> obj # in an interpreter

или

print repr(obj) # in a script

или

print obj

Для ваших классов определите методы __str__ или __repr__. Из Документация Python:

__repr__(self) Вызывается встроенной функцией repr() и строкой конверсии (обратные котировки) на вычислить "официальную" строку представление объекта. Если вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть используется для воссоздания объекта с помощью одинаковое значение (с учетом соответствующего Окружающая среда). Если это невозможно, строка формы "<... некоторые полезные описание... > ". Возвращаемое значение должно быть строкой объект. Если класс определяет repr() но не __str__(), то __repr__()также используется, когда "неформальная" строка представление экземпляров этого класс требуется. Обычно это используется для отладки, поэтому важно что представление богатый информацией и недвусмысленный.

__str__(self) Вызывается встроенной функцией str() и печатью выражение для расчета "неформального" строковое представление объекта. Это отличается от __repr__() тем, что он не должен быть действительным Python выражение: более удобный или может использоваться краткое представление вместо. Возвращаемое значение должно быть Строковый объект.

Ответ 7

Может стоит проверить -

Есть ли в Python эквивалент Perl's Data :: Dumper?

Моя рекомендация такая -

https://gist.github.com/1071857

Обратите внимание, что в perl есть модуль Data :: Dumper, который переводит данные объекта обратно в исходный код perl (примечание: он НЕ переводит код обратно в исходный код, и почти всегда вам не нужны функции метода объекта в выходных данных). Это можно использовать для сохранения, но общая цель - отладка.

Есть ряд вещей, которые не удается выполнить стандартному python pprint, в частности он просто останавливается, когда видит экземпляр объекта, и выдает внутренний шестнадцатеричный указатель объекта (ошибочно, этот указатель не очень полезен путь). Итак, в двух словах, Python - это все об этой великолепной объектно-ориентированной парадигме, но инструменты, которые вы получаете из коробки, предназначены для работы с чем-то, кроме объектов.

Perl Data :: Dumper позволяет вам контролировать, насколько глубоко вы хотите зайти, а также обнаруживает циклически связанные структуры (это действительно важно). Этот процесс принципиально проще осуществить в Perl, потому что у объектов нет особой магии, кроме их благословения (универсально четко определенный процесс).

Ответ 8

В большинстве случаев использование __dict__ или dir() даст вам информацию, которую вы хотите. Если вам понадобится дополнительная информация, в стандартную библиотеку входит модуль проверки, который позволяет получить впечатляющее количество деталей. Некоторые из настоящих необъяснимых сведений включают:

  • имена параметров функции и метода
  • иерархии классов
  • исходный код реализации объектов функций/классов
  • локальные переменные из объекта фрейма

Если вы просто ищете "какие значения атрибутов имеет мой объект?", __dict__, возможно, достаточно dir() и __dict__. Если вы действительно хотите вникнуть в текущее состояние произвольных объектов (имея в виду, что в python почти все является объектом), тогда inspect заслуживает рассмотрения.

Ответ 9

Пример метапрограммирования Dump object with magic:

$ cat dump.py
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
    module, metaklass  = sys.argv[1:3]
    m = __import__(module, globals(), locals(), [metaklass])
    __metaclass__ = getattr(m, metaklass)

class Data:
    def __init__(self):
        self.num = 38
        self.lst = ['a','b','c']
        self.str = 'spam'
    dumps   = lambda self: repr(self)
    __str__ = lambda self: self.dumps()

data = Data()
print data

Без аргументов:

$ python dump.py
<__main__.Data instance at 0x00A052D8>

С Gnosis Utils:

$ python dump.py gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
  <item type="string" value="a" />
  <item type="string" value="b" />
  <item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>

Он немного устарел, но все еще работает.

Ответ 10

Я рекомендую использовать help(your_object).

help(dir)

 If called without an argument, return the names in the current scope.
 Else, return an alphabetized list of names comprising (some of) the attributes
 of the given object, and of attributes reachable from it.
 If the object supplies a method named __dir__, it will be used; otherwise
 the default dir() logic is used and returns:
 for a module object: the module attributes.
 for a class object:  its attributes, and recursively the attributes
 of its bases.
 for any other object: its attributes, its class attributes, and
 recursively the attributes of its class base classes.

help(vars)

Without arguments, equivalent to locals().
With an argument, equivalent to object.__dict__.

Ответ 11

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

Ответ 12

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

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))

Ответ 13

Это выводит все содержимое объекта рекурсивно в формате 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)

Ответ 14

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

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])

Ответ 15

Сбросить "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() будет работать для большинства объектов без значения по умолчанию = json_util.default, но у меня было поле datetime в объекте, поэтому стандартный json serializer не удался. См. Как преодолеть "datetime.datetime, а не JSON serializable" в python?

Ответ 16

Попробуйте 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)

Ответ 17

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

from pprint import pprint
pprint(my_var)

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

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

Ответ 18

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

Ответ 19

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

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

Ответ 20

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

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

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)

Ответ 21

Для всех, кто борется с

  • vars() не возвращает все атрибуты.
  • dir() не возвращает значения атрибутов.

Следующий код печатает все атрибуты obj с их значениями:

for attr in dir(obj):
        try:
            print("obj.{} = {}".format(attr, getattr(obj, attr)))
        except AttributeError:
            print("obj.{} = ?".format(attr))

Ответ 22

Вы можете попробовать панель инструментов отладки Flask.
https://pypi.python.org/pypi/Flask-DebugToolbar

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension

app = Flask(__name__)

# the toolbar is only enabled in debug mode:
app.debug = True

# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'

toolbar = DebugToolbarExtension(app)

Ответ 23

Мне нравится работать с встроенными типами объектов python keys или values.

Для атрибутов, независимо от того, являются ли они методами или переменными:

o.keys()

Для значений этих атрибутов:

o.values()