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

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

+720
10 окт. '08 в 16:19
источник поделиться
23 ответа

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

Используйте 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__'}
+449
10 окт. '08 в 17:27
источник

Связанные вопросы


Похожие вопросы

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

from pprint import pprint
pprint(vars(your_object))
+781
11 окт. '08 в 1:16
источник
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

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

+152
10 окт. '08 в 16:36
источник

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

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

o = O()

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

>>> o.__dict__

{'value': 3}
+41
10 окт. '08 в 16:44
источник

Вы можете использовать функцию 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
+19
10 окт. '08 в 16:20
источник

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

>>> 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 выражение: более удобный или может использоваться краткое представление вместо. Возвращаемое значение должно быть Строковый объект.

+19
11 окт. '08 в 7:29
источник

Возможно, стоит проверить -

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

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

https://gist.github.com/1071857

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

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

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

+13
15 нояб. '12 в 4:11
источник

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

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

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

+11
15 окт. '08 в 14:53
источник

Пример метапрограммирования 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>

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

+7
11 окт. '08 в 7:53
источник

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

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))
+5
23 нояб. '14 в 21:20
источник

Сбросить "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?

+3
26 июн. '14 в 16:12
источник

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

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

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)
+3
16 сент. '16 в 16:12
источник

Это выводит все содержимое объекта рекурсивно в формате 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)
+3
04 мар. '16 в 19:32
источник

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

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])
+3
28 июн. '13 в 19:36
источник
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
14 июл. '14 в 15:01
источник

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

+2
13 сент. '10 в 5:11
источник

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

from pprint import pprint
pprint(my_var)

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

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

+2
28 сент. '17 в 4:35
источник

Попробуйте 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)
+2
28 июл. '16 в 7:14
источник

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

for key,value in obj.__dict__.iteritems():
    print key,value
+2
14 июн. '13 в 9:20
источник

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__.
0
07 дек. '18 в 10:49
источник

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

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

o.keys()

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

o.values()
0
04 мая '17 в 12:53
источник

Вы можете попробовать панель инструментов отладки 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)
0
07 мар. '16 в 16:41
источник

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

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

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

for attr in dir(obj):
        try:
            print("obj.{} = {}".format(attr, getattr(obj, attr)))
        except AttributeError:
            print("obj.{} = ?".format(attr))
0
07 сент. '17 в 11:40
источник

Посмотрите другие вопросы по меткам или Задайте вопрос