Простой Python. Современный стиль программирования (Любанович) - страница 127

>'"2013-02-22 03:49:27.483336"'

>>>> from time import mktime

>>>> now_epoch = int(mktime(now.timetuple()))

>>>> json.dumps(now_epoch)

>'1361526567'

Если значение datetime встретится между нормальными сконвертированными типами данных, может быть неприятно выполнять такие особые преобразования. Вы можете изменить то, как JSON будет закодирован, с помощью наследования, что описано в разделе «Наследование» главы 6. Документация JSON для Python содержит пример такого переопределения для комплексных чисел, что также заставляет JSON притвориться мертвым. Напишем переопределение для datetime:

>>>> class DTEncoder(json.JSONEncoder):

>…·····def default(self, obj):

>…·········# isinstance() checks the type of obj

>…·········if isinstance(obj, datetime.datetime):

>…·············return int(mktime(obj.timetuple()))

>…·········# else it's something the normal decoder knows:

>…·········return json.JSONEncoder.default(self, obj)

>…

>>>> json.dumps(now, cls=DTEncoder)

>'1361526567'

Новый класс DTEncoder является подклассом, или классом-потомком, класса JSONEncoder. Нам нужно лишь переопределить его метод default(), добавив обработку datetime. Наследование гарантирует, что все остальное будет обработано родительским классом.

Функция isinstance() проверяет, является ли объект obj объектом класса datetime.datetime. Поскольку в Python все является объектом, функция isinstance() работает везде:

>>>> type(now)

>

>>>> isinstance(now, datetime.datetime)

>True

>>>> type(234)

>

>>>> isinstance(234, int)

>True

>>>> type('hey')

>

>>>> isinstance('hey', str)

>True


Для JSON и других структурированных текстовых форматов вы можете загрузить файл в память и разместить его в структуре данных, не зная о самих структурах заранее. Далее вы можете с помощью функции isinstance() пройти по структурам и соответствующим типам методам, чтобы проверить их значения. Например, если один из элементов является словарем, вы можете извлечь его содержимое с помощью функций keys(), values() и items().

YAML

Как и JSON, YAML (http://www.yaml.org/) имеет ключи и значения, но обрабатывает большее количество типов данных, включая дату и время. Стандартная библиотека Python не содержит модулей, работающих с YAML, поэтому вам нужно установить стороннюю библиотеку yaml (http://pyyaml.org/wiki/PyYAML). Функция load() преобразует строку в формате YAML к данным Python, а функция dump() предназначена для противоположного действия.

Следующий YAML-файл, mcintyre.yaml, содержит информацию о канадском поэте Джеймсе Макинтайре (James McIntyre), в том числе два его стихотворения: