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

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

Ответы [ 23 ]

864 голосов
/ 11 октября 2008

Вы хотите vars(), смешанный с pprint():

from pprint import pprint
pprint(vars(your_object))
489 голосов
/ 10 октября 2008

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

Используйте 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__'}
169 голосов
/ 10 октября 2008
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

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

47 голосов
/ 10 октября 2008

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

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

o = O()

Вот вывод:

>>> o.__dict__

{'value': 3}
20 голосов
/ 11 октября 2008

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

>>> 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 голосов
/ 10 октября 2008

Для этого вы можете использовать функцию "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
15 голосов
/ 15 ноября 2012

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

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

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

https://gist.github.com/1071857

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

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

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

11 голосов
/ 15 октября 2008

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

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

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

7 голосов
/ 11 октября 2008

Пример метапрограммирования Дамп объекта с магией :

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

С Утилитами Гнозиса :

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

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

4 голосов
/ 07 декабря 2018

Я рекомендую использовать 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's attributes.
 for a class object:  its attributes, and recursively the attributes
 of its bases.
 for any other object: its attributes, its class's attributes, and
 recursively the attributes of its class's base classes.

help(vars)

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