Рубрики
Без рубрики

Исследуя Google Protobuffers с Python

Вы работаете над новым проектом, все еще в дизайне высокого уровня. Вы записываете … Tagged с протобуфом, кодом, Datastructures, Python.

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

Это было быстро переднее начало нового проекта. Теперь вам нужно подумать о Структура ваших данных (классы, интерфейсы и т. Д.)

Одна вещь, которую вы должны рассмотреть на этом этапе сериализация . Как вы сохраняете ваши данные, либо это будет локальной файловой системой или по сети? (Вы не можете просто отправить объекты на провод, но:))

Буферы протокола являются методом сериализации структурированных данных. Это полезно для разработки программ для взаимодействия друг с другом через провод или для хранения данных. (Википедия)

В этой статье я буду исследовать, что это и как его использовать с Python.

Google’s Документация Определение протелуферов:

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

TL; доктор

Вы определяете свои «сообщения» (структуры данных) в .Proto Файлы и получить возможность развязать данные между различными службами, написанными на разных языках. Это меньше, и быстрее, чем JSON/XML. Также гораздо легче поддерживать.

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

Далее вы используете компилятор Protobuffers ( Protoc ) для генерации исходного кода на нужном вам языка (из файла .proto ). Они обеспечивают доступ к данным, а также методы для сериализации/анализа структуры данных к/из A Двоичный формат Отказ

Давайте посмотрим на пример. Я собираюсь использовать переводчик Python в проверять Объекты Python, созданные protuffers. Кроме того, я показываю пример того, как компилировать то же самое .Proto Чтобы пойти исходный код.

Подготовка

Прежде чем начать, вам нужно установить Google Protobuffers на вашей ОС. Ниже приведены инструкции для Mac Os Вы можете найти инструкции по другой ОС в документации:

  1. Скачать . Пакет & распаковать файл tar.gz
  2. CD в каталог и запустить ./autogen.sh && ./configure && make

    1. Если компиляция не удается, установите необходимые зависимости с помощью Brew: Brew Установить Autoconf && Brew Установить Automake && Brew Установить libtool
  3. После шага 2 добиться успеха, выполните следующие действия:
    1. проверить проверку
    2. sudo make install.
    3. Какой проток && protoc –version

Последний шаг подтверждает Проток установлен и расположен в вашем ДОРОЖКА Затем печатает свою версию.

Нам также нужны соответствующие плагины для Python и GO, поэтому мы можем скомпилировать файлы кода исходных сигналов на эти языки.

  • Для Python: PIP3 Установить Protobuf.
  • Для Голанга:
    • Убедитесь, что GoPath установлен и Gopath/Bin находится в пути ENV переменная
    • Go Get -u github.com/golang/protobuf/protoc-gen-go

.Proto Файл я собираюсь использовать просто с фрагментом кода ниже. Я тогда собираюсь сделать источник сделать для Python и выйти из него. Это моя структура данных; Давайте рассмотрим.

Файл является самоочередным, вы можете прочитать больше о его структуре в Документация Google Protobuf Отказ Давайте посмотрим, как мы его используем.

Чтобы генерировать файл Python, вам нужно выполнить protoc -i = $ src_dir - python_out = $ dst_dir $ src_dir/person.proto Это генерирует файл с именем Person_pb2.py который мы собираемся использовать. Файл довольно большой, поэтому я не буду ставить это здесь Но я рекомендую вам попробовать это Сам и проверяйте файл. (Вышеуказанное .Proto Файл генерирует 165 строк Код Python!)

Покажите мне какой-нибудь код!

Python 3.7.0 (default, Sep 16 2018, 19:30:42)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import Person_pb2
>>> p = Person_pb2.Person()

# The imported model contains a class defined by our message
# Let's inspect what attributes are there on the object,
# Using the DESCRIPTOR of our object.

>>> p.DESCRIPTOR.fields_by_name.keys()
['name', 'id', 'has_mac', 'phones']
>>> p.name
''
>>> p.name = 'Gnosis'
>>> p.id = 4
>>> p.phones
[]

# Let's add phone elements to the list (the repeated type)

>>> pho = p.phones.add()
>>> pho.number = '1800-500-501'
>>> pho.type_ = Person_pb2.MOBILE
>>> pho
number: "1800-500-501"
type_: MOBILE

>>> p
name: "Gnosis"
phones {
  number: "1800-500-501"
  type_: MOBILE
}

# You can also create Phone objects without adding them to person

>>> phone = Person_pb2.Phone()
>>> phone.DESCRIPTOR.fields_by_name.keys()
['number', 'type_']

>>> phone.number = '1800-500-500'
>>> phone.type_ = Person_pb2.MOBILE
>>> phone
number: "1800-500-500"
type_: MOBILE

# Which we can later add it to our object using extend

>>> p.phones.extend([phone])
>>> p
..
phones {
  number: "1800-500-501"
  type_: MOBILE
}
phones {
  number: "1800-500-500"
  type_: MOBILE
}

# We can check if certain field is defined on our object

>>> p.HasField('name')
True

# Okay, let's see how we serialize this object

>>> p.SerializeToString()
Traceback (most recent call last):
  File "", line 1, in 
google.protobuf.message.EncodeError: Message tutorial.Person is missing required fields: id

# Ooops, we didn't set a required field. This causes serialization operation to fail.
>>> p.id = 4
>>> p.SerializeToString()
b'\n\x06Gnosis\x10\x04"\x10\n\x0c1800-500-500\x10\x00"\x10\n\x0c1800-500-500\x10\x00"\x10\n\x0c1800-500-500\x10\x00'
>>>
>>> b = p.SerializeToString()
>>> b
b'\n\x06Gnosis\x10\x04"\x10\n\x0c1800-500-500\x10\x00"\x10\n\x0c1800-500-500\x10\x00"\x10\n\x0c1800-500-500\x10\x00'
>>> type(b)


# We can save this binary to disk or send it on the wire to another service.
# Then we simply load it with a new object.
# We create a new object and use ParseFromString method to load it's data

>>> new_p = Person_pb2.Person()
>>> new_p.ParseFromString(b)
64
>>> new_p
name: "Gnosis"
id: 4
phones {
  number: "1800-500-500"
  type_: MOBILE
}
phones {
  number: "1800-500-500"
  type_: MOBILE
}
phones {
  number: "1800-500-500"
  type_: MOBILE
}

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

Я использую то же самое .Proto Файл для генерации моего исходного кода в Идти Отказ Чтобы генерировать код GO, вы выполняете protoc -i =. --go_out =./PERSON.PROTO ( 199 Линии кода)

Вам понадобится плагин Protobuf Goalang и выполните команду внутри каталога, где файл .Proto

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

Лучший корпус использования для Protobufs – это когда есть два (или более) услуг, которые необходимо общаться. Если услуги записываются на разных языках, это еще один плюс в пользу протобуфа. Потому что услуги (компьютеры) не нужны данные, чтобы быть в читаемой человеке моды; Они работают быстрее с битами ( Бинар ).

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

С Protobuf у нас есть лучшее решение для этого использования.

Вы определяете свои данные в .Proto Файл Однажды , в отдельном общем проекте. Каждая команда использует Проект для создания их исходного кода на их языке программирования. Когда вам нужно добавить больше полей на данные, вы продлите их в источнике .Proto файл и переосмыслить их. Тогда дайте головы к другой команде, им нужно переосмыслить Это тоже и сделайте необходимые обновления в их исходный код.

Другая прохладная особенность Protobuf – это поддержка обратной совместимости. Даже если другая команда использует старую версию, сервис не сломается. Это просто не будет поддерживать новые данные. Разве это не Fabolous? Мы получаем обратную совместимость бесплатно.

Преимущества

  • Определите свою структуру данных Однажды и генерировать исходный код на любом языке кодирования, который вам нужен (который поддерживается)
  • Это более удобно, управлять только одним исходным кодом вашей структуры данных в .Proto
  • Это более размер эффективен, чем JSON/XML (это двоичные, по сравнению с строками)
  • Быстрая сериализация
  • Тип безопасности
  • Обратная совместимость

Недостатки

  • Меньшее сообщество и отсутствие знаний. Вы можете найти дополнительную документацию, примеры и сообщения в блоге через JSON или XML
  • Это не читаемо

Когда вы сидите и разработаете требования к вашему приложению, вы посмотрите на плюсы и минусы вариантов, которые вы попали на стол. Учитывая плюсы и минусы, я думаю, что мы можем сделать вывод, что, когда человек или браузер – это потребитель данных, возможно, лучше использовать JSON, потому что это человек, читаемый из коробки, и, таким образом, экономит время в США. Не было никаких усилий, необходимых для нежелательных данных. Но Если у вас есть два Услуги Это должно взаимодействовать между ними, Protobuf имеет так много преимуществ, что вы должны, по крайней мере, считаете это решением.

Я настоятельно рекомендую вам попробовать протобуф самостоятельно. У них есть больше преимуществ, чем я упоминал здесь. Это было больше о том, как пост, Исследуя данные сгенерированные по Protobuf Отказ

Список литературы для получения дополнительной информации

  1. Как назначить повторное поле (так)
  2. Документация Google

Оригинал: “https://dev.to/chen/exploring-google-protobuffers-with-python-1gmd”