Итак, мне нужно что-то вроде функции PHP print_r. Это нужно для того, чтобы я мог отлаживать свои скрипты, видя, в каком состоянии находится объект, о котором идет речь.
Вы хотите Варс()вперемешку с
печатные()`:
from pprint import pprint
pprint(vars(your_object))
Вы действительно смешиваете две разные вещи.
Использовать реж()
, Варс()
или проверить
модуль чтобы получить то, что вы заинтересованы в (Я использовать __страницу 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__'}
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))
Существует множество сторонних функций, которые добавляют такие вещи, как обработка исключений, печать национальных/специальных символов, рекурсия во вложенные объекты и т. д. в соответствии с предпочтениями их авторов. Но все они в основном сводятся к следующему.
Уже упоминалось о dir, но это даст вам только имена атрибутов. Если вам нужны их значения, попробуйте __dict__.
class O:
def __init__ (self):
self.value = 3
o = O()
Вот результат:
>>> o.__dict__
{'value': 3}
Для этого можно использовать функцию "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
Для печати текущего состояния объекта вы можете:
>>> obj # in an interpreter
или
print repr(obj) # in a script
или
print obj
Для классы определять __ул.__ " или " __репр__
методы. В документации Python]1:
__репр__(самовыдвижение)
вызываетсяпредст () в функцию и строку преобразования (обратной котировки) в рассчитать и"официальный" в строку представление объекта. Если на всех возможно, это должно выглядеть как допустимое выражение Python, который может быть использованы для воссоздания объекта с По той же стоимости (с учетом соответствующего окружающая среда). Если это невозможно, строка формат "<...некоторые полезные ГТ; описание...>" и; должны быть возвращены. возвращаемое значение должно быть строкой объект. Если класс определяет __репр__() но нет метода__STR__()
, то__репр__ ()
- это также используется при собой "неофициальных" в строку представление экземпляров требуется класс. Это обычно используется для отладки, поэтому важно что представление богатый информацией и однозначным.
__ул.__(самовыдвижение)
вызывается(ул.)
встроенная функция и печати заявление для расчета в "неофициальном"и строковое представление объекта. это отличается от `репр () в том, что Это не обязательно должен быть действительным на Python выражение: более удобный или представление лаконичные, могут быть использованы вместо. Возвращаемое значение должно быть строка объект.
Может быть стоит проверить --
протокол HTTPS://stackoverflow.com/questions/2540567/is-there-a-python-equivalent-to-perls-datadumper
Моя рекомендация-это ...
протокол HTTPS://gist.github.com/1071857
Обратите внимание, что в Perl есть модуль под названием данные::самосвал, который переводит объект данных в Perl исходный код (Примечание: это не перевести код назад к источнику, и почти всегда вы Don'т хотим, чтобы объект метод вывода). Это может быть использовано за настойчивость, но общей целью-это для отладки.
Есть ряд вещей, стандартный Python печатные удается достичь, в частности, он просто перестает нисходящий, когда он видит экземпляр объекта и дает внутренним шестигранником указатель на объект (ошика, что указатель не много использовать кстати). Так в двух словах, Python-это все об этой великой объектно-ориентированную парадигму, но средства вам выбраться из коробки предназначены для работы с объектами.
Данные в Perl::самосвал позволяет контролировать, насколько глубоко вы хотите пойти, и также обнаруживает круговые связанных структур (что's действительно важно). Этот процесс принципиально легче достичь в Perl, потому что объекты не имеют особой магии за их благословение (универсально определенного процесса).
В большинстве случаев, используя __дикт__ " или " каталог()
будет Вам информацию вам'вновь желая. Если вы должно произойти, чтобы нужно больше информации, стандартная библиотека включает проверить модуль, который позволяет сделать некоторые впечатляющие количество деталей. Некоторые из реальных nuggests информации включают в себя:
Если вы're просто ищу "что значения атрибутов не мой объект?" и реж()
и __дикт__
вполне достаточен. Если вы'вновь действительно хотите копаться в состояние произвольных объектов (имея в виду, что в Python почти все является объектом), затем "инспекции" достоин рассмотрения.
Пример метапрограммирования объект дамп с магией:
в <предварительно> $ кот dump.py </пред>
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
Без аргументов:
в <предварительно> $ питона dump.py </пред> <основной.Экземпляр данных в 0x00A052D8>
С Гнозис Утилиты: в <предварительно> $ питона dump.py гнозис.магия MetaXMLPickler </пред> <?XML версии=на"1.0" и?> <!Система PyObject и quot установлен;PyObjects.отд" и> <модуль PyObject=" и главное я____&; класс=то"Сведения" и код="и 11038416" и> <АТР. имя="не пропустить" и тип="по списку" и код="и 11196136" и > <пункт Тип="в строке" в значении"А" /> <пункт Тип="в строке" в значении"и в” /> <пункт Тип="в строке" в значении"и с" и /> </м> <attr, который название=на"ням" и типа=на"цифровые" в значении"в 38-то" /> <АТР. имя="и пр." и тип="в строке" по стоимости=на"спам" и />
Это немного устарели, но еще работают.
Я рекомендую использовать помощь(your_object)`.
справка(реж)`
если вызывается без аргументов, она возвращает имена в текущей области. По другой, вернуться алфавитный список, включающий имена (некоторые) атрибуты У данного объекта, и атрибутов достижимых из него. если предмет поставки метод с именем Дир, он будет использован; в противном случае по умолчанию маршрутизатор dir() используется логика и возвращает: для объекта модуль: модуль'с атрибутами. для объекта класса: его атрибуты, и рекурсивно атрибуты > у его основания. для любых других объектов: его атрибутов, его класс'с атрибутами, и рекурсивно атрибутами своего класса'ы базовых классов.
справка(Варс)`
без аргументов, что эквивалентно местные жители(). с аргументом, что эквивалентно объекта.дикт.
Это распечатывает все содержимое рекурсивно объект в 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)
Если вы're, используя это для отладки, и вы просто хотите, рекурсивную свалка всего, принято отвечать не удовлетворяет, потому что это требует, чтобы ваши занятия уже реализаций хорошей__, ул.__
. Если это's не так, то это работает намного лучше:
import json
print(json.dumps(YOUR_OBJECT,
default=lambda obj: vars(obj),
indent=1))
Попробуйте 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)
Я'вэ голосуют за ответ, в котором упоминаются только печатные. Чтобы было понятно, если вы хотите увидеть ценности в сложную структуру данных, а затем сделать что-то вроде:
from pprint import pprint
pprint(my_var)
Где my_var ваша переменная. Когда я использовал печатные(Варс(my_var))
у меня ничего нет, и других ответов здесь не'т помочь, или метод выглядел слишком затянутым. Кстати, в моем конкретном случае, код я проверка был словарь словарей.
Стоит отметить, что с некоторых пользовательских классов, которые вы можете просто в конечном итоге с бесполезным <someobject.Объект класса exampleclass в 0x7f739267f400>
вроде выходной. В этом случае, вы могли бы реализовать метод STR____`, или попробовать некоторые из других решений. Я'd по-прежнему хотелось найти что-то простое, что работает во всех сценариях, без сторонних библиотек.
Мне нужно печатать отладочную информацию в некоторые журналы и не смогла использовать печатные, потому что это разбило бы его. Вместо этого я сделал это и получил практически то же самое.
DO = DemoObject()
itemDir = DO.__dict__
for i in itemDir:
print '{0} : {1}'.format(i, itemDir[i])
Свалить на "объект MyObject и":
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
Я попытался Варс() и Dir(); и не за то, что я искал. Варс() я'т работу, потому что объект не'т __дикт (исключений.Ошибку TypeError: Варс (аргумент) должен иметь \дикт__ атрибут). реж() это'т то, что я искал: это's просто список имен полей, не'т дают значения или структуры объекта.
Я думаю, что в JSON.дампы() будет работать для большинства объектов без дефолта=json_util.по умолчанию, но у меня есть поле datetime в объект, так что стандартный формат JSON сериализатор не удалось. См https://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable-in-python
Почему не что-то простое:
for key,value in obj.__dict__.iteritems():
print key,value
Просто попробовать beeprint.
Это поможет вам не только с переменными объекта печати, но красивый выход так же, как это:
class(NormalClassNewStyle):
dicts: {
},
lists: [],
static_props: 1,
tupl: (1, 2)
печатные содержит “довольно принтер” для производства эстетично представления структур данных. Форматеру производит представления структур данных, которые могут быть преобразованы с помощью переводчика, и также легко для человека, чтобы читать. Выходные данные хранится в одной строке, если это возможно, и с отступом, когда разбить на несколько строк.