Switchboard упрощает работу с API. Switchboard помогает легко конвертировать схемы JSON. Создав распределительный щит и определив некоторые шнуры, вы можете управлять тем, какие поля старой схемы связаны с какими полями в новой схеме.
Название Switchboard - это объединение старых телефонных операторов. Используя коммутатор, вы выступаете в роли оператора. Связывание полей схемы друг с другом напоминает коммутатор телефонного оператора. Фото Gawler History.
Например, при работе с интеграциями и сторонними API вы часто сталкиваетесь с ситуацией, когда данные приходится извлекать вручную. Предположим, что у вас есть следующая простая схема базы данных:
Column | Type ---------------+------- first_name | string last_name | string email | string
Например, вы работаете со сторонним пользовательским API, который возвращает следующий тип полезной нагрузки:
{ "id": 12335, "firstName": "Джон", "lastName": "Доу", "contactInfo": {"primaryEmail": "[email protected]" } }
Итак, что же делать теперь? Каков наилучший способ конвертировать полезную нагрузку в ваш собственный формат? Знакомо ли это:
response_dict = json.loads(response.body)data = {"first_name": response_dict.get("firstName"),"last_name": response_dict.get("lastName"),"email": response_dict.get("contactInfo" , {}).get("primaryEmail") }
К сожалению, приведенное выше решение становится крайне запутанным при работе с вложенными структурами JSON, несколькими сторонними API или их комбинацией. Вот почему Switchboard полезен: определив новый коммутатор, вы можете легко управлять сопоставлением данных между различными схемами.
from Switchboard import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # Обратите внимание, насколько просто получить доступ к вложенным данные!
Теперь код выглядит намного лучше. Хороший!
response_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
Этот проект все еще находится в стадии разработки. Улучшенная документация появится позже.
Определить новые коммутаторы легко. Все, что вам нужно сделать, это импортировать его и определить несколько аккордов.
from Switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # Источник сообщает расположение поля в исходной схемеrequired=True, # Если поле является обязательным и отсутствует, возникает исключениеdefault="Mr. Dog" # Если поле отсутствует, используется значение по умолчанию)
Функциональность коммутатора можно настроить с помощью мета-класса:
из импорта коммутатора Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# Сообщает, что делать с отсутствующими полями. Функциональность по умолчанию — INCLUDE,#, что означает, что если исходное поле отсутствует, поле добавляется, но значение поля # будет Nonemissing = Switchboard.EXCLUDE # Опции: Switchboard.EXCLUDE | Коммутатор.ВКЛЮЧИТЬ | Switchboard.RAISEpet_name = Шнур("petName")
Шнуры могут получать доступ к вложенным полям и даже спискам.
из импорта коммутатора Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Соответствует полю key0, # Соответствует индексу списка "field2" # Соответствует ключу поля] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
Атрибут Switchboard many
помогает работать со списками. Например:
класс MySwitchboard(Коммутатор):target = Cord("source")data_in = [ {"источник": 1}, {"источник": 2}, {"источник": 3}, {"источник": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]