Научная статья на тему 'Сериализация и десереализация объектов Python в yaml- формат'

Сериализация и десереализация объектов Python в yaml- формат Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
815
102
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Сериализация и десереализация объектов Python в yaml- формат»

Разработанная диаграмма классов для определения локальных зон помещения позволяет точно определить количество локальных зон, необходимых в регулировании освещения. Она позволяет полноценно оценить факторы, влияющие на работу системы. По данной диаграмме можно определить локальные зоны в любом помещении, так как классы, выбранные в качестве характеристик помещений, являются унифицированными.

Литература

1. Буч, Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++ / Г. Буч; пер. с англ. И. Романовского; под ред. Ф. Андреева - М.: Невский Диалект, 2000. - 359 с.

2. Болдырев, В.В. Концепция интеллектуального алгоритма автоматизированной системы

энергопотребления/ В.В. Болдырев, М.А. Горькавый // Технические и математические науки: актуальные проблемы и перспективы развития: материалы междунар. науч.-практ. конф., Саратов, 14.11.2013г., С. 19 -24.

УДК 004.43:378.09

СЕРИАЛИЗАЦИЯ И ДЕСЕРЕАЛИЗАЦИЯ ОБЪЕКТОВ PYTHON В YAML - ФОРМАТ

Мясникова Нелли Александровна, доцент, Южно-Российский государственный политехнический университет (НПИ), Россия, Новочеркасск, mnela@list.ru Шепилов Владислав Александрович, студент, Южно-Российский государственный политехнический университет (НПИ), Россия, Новочеркасск, ship3000@mail.ru

Компания «Delmar» торгует ювелирными изделиями и сотрудничает с таким компаниями, как Sterling, Walmart, Commercehub, Ebay, Zulily, и многими другими. В своей деятельности для внутренних бизнес-процессов эта компания использует CRM-систему на базе OpenERP 6.1. Главной задачей для обеспечения работоспособности системы является унификация входных данных от покупателей. Система OpenERP написана на языке программирования Python 2.7, дополнительные модули, специфичные для компании «Delmar», также написаны на языке программирования Python. Поэтому в статье унификация входных/выходных данных и примеры будут рассмотрены для этого языка.

Упрощенная схема бизнес-процесса покупки показана на рисунке 1.

Рис. 1 - Упрощенная схема бизнес-процесса покупки

При разработке программного обеспечения часто возникает необходимость передачи данных между разными программными продуктами/частями программного продукта/сброса данных в базу данных. Сериализация - процесс перевода какой-либо внутренней (для языка программирования) структуры данных во внешнее представление в каком-либо из общеиспользуемых форматов обмена данными. Обратной к операции сериализации является операция десериализации (структуризации) - восстановление начального состояния структуры данных из внешнего представления[4].

За время эволюции компьютерной техники и программного обеспечения появилось множество человекочитаемых форматов данных и языков разметки. Наиболее известные: XML, YAML, JSON. Начиная с исследования форматов, следует учитывать, что

52

унифицированное представление входных данных должно без проблем проверяться человеком на правильность. Рассмотрим более подробно каждый из форматов.

Пример конечного объекта, используемого в последующем в объекте внутри

системы:

order = {

"order_id": "PO453234",

"ship": {

"address": "11345 Colmar Street",

"city": "Dallas",

"country": "USA",

"name": "Camela Yong",

"phone": 00000000000,

"state": "NY",

"zip": 342, },

"lines": [

{

"carrier": "UPS",

"sku": "BRK3144",

'qty': 1,

"cost": 35.0,

}, ], }

XML

XML (англ. extensible Markup Language - расширяемый язык разметки) -рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки. Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров (программ, читающих XML-документы и обеспечивающих доступ к их содержимому). XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете [5].

Пример объекта order в XML <?xml version="1.0"?>

<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">

<PyObject family="obj" type="builtin wrapper" class=" EmptyClass">

<attr name=" toplevel " type="dict" id="15692080" >

<entry>

<key type="string" value="order id" />

<val type="string" value="PO453234" />

</entry>

<entry>

<key type="string" value="ship" />

<val type="dict" id="15711664" >

<entry>

<key type="string" value="city" />

<val type="string" value="Dallas" />

</entry>

<entry>

<key type="string" value="name" />

<val type="string" value="Camela Yong" />

</entry>

<entry>

<key type="string" value="zip" />

<val type="numeric" value="342" />

</entry>

<entry>

<key type="string" value="country" />

<val type="string" value="USA" />

</entry>

<entry>

<key type="string" value="phone" />

53

value="0" />

<val type="numeric"

</entry>

<entry>

<key type="string" value="state" />

<val type="string" value="NY" />

</entry>

<entry>

<key type="string" value="address" />

<val type="string" value="11345 Colmar Street" /> </entry>

</val>

</entry>

<entry>

<key type="string" value="lines" />

<val type="list" id="140426501577760" >

<item type="dict" id="15766800" >

<entry>

</entry>

<entry>

</entry>

<entry>

</entry>

<entry>

</entry>

</item>

</val>

</entry>

</attr>

</PyObject>

string" value="sku" />

string" value="BRK3144" />

string" value="carrier" />

string" value="UPS" />

string" value="cost" />

numeric " value="35." />

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

string" value="qty" />

numeric " value="1" />

Плюсы использования XML:

• практически повсеместная поддержка;

• поддерживается на низком аппаратном, микропрограммном и программном уровнях в современных аппаратных решениях.

Минусы использования XML:

• плохая человекочитаемость;

• большой размер.

Конкретно в языке Python присутствует несколько библиотек для работы с XML, и сериализация/десереализация объекта представляется не совсем тривиальной задачей или связана с использованием сторонних библиотек.

JSON

JSON (англ. JavaScript Object Notation)- текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком.

Пример объекта order в JSON

{"order_id": "PO453234", "ship": {"city": "

"zip": 342, "country": "USA", "phone": 0, " Colmar Street"}, "lines": [{"sku": "BRK3144

Dallas", "name state": "NY",

", "carrier":

": "Camela Yong", "address": "11345 "UPS", "cost":

35.0, "qty": 1}]}

Основная проблема использования JSON внутри языка Python сопряжена с тем, что JSON поддерживает только базовые типы str, Unicode, int, long, float, bool, None. Поэтому при

54

сериализации объекта в JSON не базовые типы будут вызывать исключение TypeError, а при десериализации не смогут быть одназначно интерпретированы.

Плюсы:

• распространён;

• поддержка в любом браузере.

Минусы:

• поддержка только базовых типов Python.

YAML

YAML - человекочитаемый формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данных многих языков программирования. Изначально YAML являлось акроним от словосочетания Yet Another Markup Language(Ещё один язык разметки), но впоследствии YAML преобразовался в человекочитаемый формат данных и поэтому акроним теперь означает YAML Ain't Markup Language(YAML - не язык разметки). Ко всему прочему, начиная с версии 2.1, JSON является валидным объектом для сериализации/десериализации через YAML-библиотеку^].

Налицо видны очевидные плюсы этого формата данных, можно добавить только то, что из всех форматов данных YAML является наиболее человекочитаемым. Напишем класс для более простой работы с YAML в Python.

Содержание файла yaml class.py: from yaml import dump as dump data from yaml import load as load data from os import access, F OK, W OK, R OK import logging

logger = logging

class _YAML():

def init (self, work with file=None): self.filename = work with file def deserialize(self, data=None): result = None

if(self.filename is not None):

if not access(self.filename, F OK):

logger.error("no find file: %s!" % self.filename) result = None else:

if access(self.filename, R OK):

with open(self.filename, "r") as config: result = load data(config.read())

else:

logger.error("no access reading file: %s" %

self.filename)

result = None

else:

if( data is not None): try:

result = load data( data) except Exception, error:

logger.error(str( error.message))

else:

logger.error("not find deserialize data!") result = None return result

def serialize(self, data=None): result = None

if(self.filename is not None):

55

if not access(self.filename, F OK):

logger.info("no find file: %s, created new file!" %

self.filename)

with open(self.filename, "w+"): pass

if access(self.filename, W OK):

with open(self.filename, "w") as config: if( data is None):

logger.error("not find data!") result = None else:

result = dump data( data, default style='"') config.write(result)

else:

logger.error("no access writing to file: %s" %

self.filename)

result = None

else:

if( data is not None):

result = dump data( data, default style='"') else:

logger.error("not find serialize data!") result = None return result

Сериализуем с помощью него исходный объект:

from yaml class import YAML YAML.serialise(order)

Пример объекта order в YAML:

"lines":

- "carrier": "UPS"

"cost": !!float "35.0"

"qty": !!int "1"

"sku": "BRK3144"

"order_id": "PO453234"

"ship":

"address": "11345 Colmar Street"

"city": "Dallas"

"country": "USA"

"name": "Camela Yong"

"phone": !!int "0"

"state": "NY"

"zip": !!int "346

Как видно, объект в представлении YAML хорошо читаем, даёт полное представление о строении исходного объекта, при этом тип данных сохраняется однозначно.

Созданный нами класс позволяет получить сериализованный объект в виде строки, либо сразу записать объект в файл. В дальнейшим можно использовать данный модуль на стороне Python-программы не только для сериализации объектов, а также YAML-формат можно использовать для хранения конфигураций программы

Простота сериализации/десериализации с использованием YAML, а также хорошая челевекочитаемость сериализованного объекта являются главными преимуществами данного формата.

В конечном счёте, для унификации входных данных компанией Delmar был выбран формат YAML, так как формат хорошо читаем человеком, надежен при использовании внутри языка Python, прост в работе, безопасен.

Литература

56

1. Иан Грэхем. Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. - 3-е изд. - М.: «Вильямс», 2004.

2. Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++. 2-е изд. / Пер. с англ. - М.:"Издательство Бином", СПб:"Невский диалект", 1998 г.

3. http://lib.custis.ru/YAML

4. http://www.seobuilding.ru/wiki/Python

5. http://www.intuit.ru/studies/courses/71/71/info

УДК 004.413

АВТОМАТИЗИРОВАННАЯ СИСТЕМА СБОРА ДАННЫХ ФИЗИЧЕСКОГО ЭКСПЕРИМЕНТА

Хоченков Алексей Евгеньевич, студент, Ивановский государственный химико-технологический университет, Россия, Иваново, alexkhochenkov@gmail.com Галиаскаров Эдуард Геннадьевич, к.х.н., доцент, доцент, Ивановский государственный химикотехнологический университет, Россия, Иваново, galiaskarov@isuct.ru

Введение

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

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Выполнение любого физического эксперимента укладывается в следующие этапы:

• разработка методики эксперимента;

• сбор данных, запись их на носители, первичная обработка данных;

• вторичная обработка данных, включающая математическую обработку полученных результатов и оценку погрешности;

• анализ результатов.

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

Только представьте себе, что в XXI веке исследователь получает результат эксперимента в виде графика на ленте, постоянно делает на ней пометки о значениях диапазона измерения, показаниях вольтметров, численных значениях выдаваемой мощности нагревательных элементов. Ну а после садится за обработку полученных значений, вычитает из них фон прибора [1], рассчитывает термодинамические функции и константы. Сравнимо с набором текста не при помощи современных текстовых редакторов, а на пишущей машинке; кому-то может быть и нравится, но не практично.

Однако так уж получается, что экспериментатор (применительно к масс-спектрометрии) - это в первую очередь физик или химик, то есть ученый, а не специалист в области информационных технологий. Даже наличие цифровых выходов на приборах для исследователя - это замечательный факт, который в теории может быть очень полезен, но освоить эту полезность на практике не представляется возможным. Так происходит потому, что ученые - это те, кто в первую очередь должен разбираться в самих процессах предметной области, а не в микроэлектронике или программировании. Кроме того, современные средства измерения, стали мультифункциональными, что, с одной стороны, делает их более гибкими, а с другой - усложняет общение с ними.

Преодоление этой сложности должно ложиться на плечи специалистов ИТ -системных интеграторов, программистов, системных администраторов и архитекторов, при этом наука как отрасль испытывает острый дефицит специалистов подобного рода.

57

i Надоели баннеры? Вы всегда можете отключить рекламу.