среда, 7 мая 2014 г.

Аналог var_dump() в python

Как ни крути, а var_dump() в php очень удобен и интуитивно понятен.
К сожалению, такой простой конструкции в python нет, но ее можно примерно повторить, если сделать следующее:
from inspect import getmembers
from pprint import pprint
pprint(getmembers(yourObject))


Разберем подробнее. Создадим файл vardump.py:
# -*- coding:utf-8 -*-
from inspect import getmembers
from pprint import pprint

class Car(object):
    model = "BMW"
    
    def getModel(self):
        return self.model
 
myCar = Car()

# Пусть мы хотим узнать поля объекта myCar
pprint(getmembers(myCar))

Запустим этот файл через консоль cmd.exe. Можно подумать, что функция выдаст нам два поля - model и метод getModel, но это не так. Мы получим еще кучу других данных об объекте:

[('__class__', ),
 ('__delattr__', ),
 ('__dict__', {}),
 ('__doc__', None),
 ('__format__', ),
 ('__getattribute__',
  ),
 ('__hash__', ),
 ('__init__', ),
 ('__module__', '__main__'),
 ('__new__', ),
 ('__reduce__', ),
 ('__reduce_ex__',
  ),
 ('__repr__', ),
 ('__setattr__', ),
 ('__sizeof__', ),
 ('__str__', ),
 ('__subclasshook__',
  ),
 ('__weakref__', None),
 ('getModel',
  >),
 ('model', 'BMW')]

Мы ведь не хотели с вами получать эти служебные поля? А python нам их вернул. Возможно есть другие способы сделать аналог var_dump объекта.

А давайте попробуем использовать эту функцию, чтобы получить структуру переменной, которая является словарем. Отредактируем файл vardump.py:
d = {"name": "Johny", "age": 27}

# Пусть мы хотим узнать структуру словаря d
pprint(getmembers(d))

В итоге мы получим массу методов и служебных полей переменной d, но не увидим никаких значений:
[('__class__', ),
 ('__cmp__', ),
 ('__contains__', ),
 ('__delattr__', ),
 ('__delitem__', ),
 ('__doc__',
  "dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
    (key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
    d = {}
    for k, v in iterable:
        d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
    in the keyword argument list.  For example:  dict(one=1, two=2)"),
 ('__eq__', ),
 ('__format__', ),
 ('__ge__', ),
 ('__getattribute__',
  ),
 ('__getitem__', ),
 ('__gt__', ),
 ('__hash__', None),
 ('__init__', ),
 ('__iter__', ),
 ('__le__', ),
 ('__len__', ),
 ('__lt__', ),
 ('__ne__', ),
 ('__new__', ),
 ('__reduce__', ),
 ('__reduce_ex__',
  ),
 ('__repr__', ),
 ('__setattr__', ),
 ('__setitem__', ),
 ('__sizeof__', ),
 ('__str__', ),
 ('__subclasshook__',
  ),
 ('clear', ),
 ('copy', ),
 ('fromkeys', ),
 ('get', ),
 ('has_key', ),
 ('items', ),
 ('iteritems', ),
 ('iterkeys', ),
 ('itervalues', ),
 ('keys', ),
 ('pop', ),
 ('popitem', ),
 ('setdefault', ),
 ('update', ),
 ('values', ),
 ('viewitems', ),
 ('viewkeys', ),
 ('viewvalues', )]

Конечно, ясно, что эти значения можно получать при помощи метода d.items(), который вернет:

[('age', 27), ('name', 'Johny')]

Но ведь в коде мы можем не знать тип переменной, с которой имеем дело.

Комментариев нет:

Отправить комментарий