Switchboard facilita el trabajo con API. Switchboard le ayuda a convertir fácilmente esquemas JSON. Al crear un panel de control y definir algunos cables, puede administrar qué campos del esquema antiguo implican qué campos del nuevo esquema.
El nombre Centralita es una asociación de operadores telefónicos de antaño. Al utilizar la Centralita, actúas como operador. La vinculación de campos de esquema entre sí se asemeja a la centralita de un operador telefónico. Foto de Historia de Gawler.
Cuando se trabaja con integraciones y API de terceros, por ejemplo, a menudo se encuentra con situaciones en las que los datos deben extraerse manualmente. Consideremos que tiene el siguiente tipo de esquema de base de datos simple:
Column | Type ---------------+------- first_name | string last_name | string email | string
Está trabajando con una API de usuario de terceros, por ejemplo, que devuelve el siguiente tipo de carga útil:
{ "id": 12335, "firstName": "John", "lastName": "Doe", "contactInfo": {"primaryEmail": "[email protected]" } }
Entonces, ¿qué hacer ahora? ¿Cuál es la mejor manera de convertir la carga útil a su propio formato? ¿Esto te resulta familiar?
respuesta_dict = json.loads(response.body)data = {"primer_nombre": respuesta_dict.get("primerNombre"),"apellido": respuesta_dict.get("apellido"),"correo electrónico": respuesta_dict.get("contactInfo" , {}).get("correo electrónico principal") }
Desafortunadamente, la solución anterior se vuelve extremadamente complicada cuando se trabaja con estructuras JSON anidadas, múltiples API de terceros o una combinación de ellas. Esta es la razón por la que Switchboard es útil: al definir un nuevo switchboard, puede administrar fácilmente las asignaciones de datos entre diferentes esquemas.
from switchboard import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # Observe lo simple que es acceder a archivos anidados ¡datos!
Ahora, el código se ve mucho mejor. ¡Lindo!
respuesta_dict = json.loads(respuesta.body)datos = UserSwitchboard().apply(respuesta_dict)
Este proyecto todavía está en progreso. Más adelante vendrá una mejor documentación.
Definir nuevas Centralitas es fácil. Todo lo que necesitas hacer es importarlo y definir algunos acordes.
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # La fuente indica la ubicación del campo en el esquema fuenterequired=True, # Si el campo es obligatorio y falta, se genera una excepcióndefault="Mr. Dog" # Si falta el campo, se está utilizando el valor predeterminado)
La funcionalidad del panel de control se puede modificar usando la clase Meta:
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# Indica qué hacer con los campos faltantes. La funcionalidad predeterminada es INCLUDE,# lo que significa que si falta el campo de origen, el campo se agrega pero el valor del campo# será No falta = Switchboard.EXCLUDE # Opciones: Switchboard.EXCLUDE | Centralita.INCLUYE | Switchboard.RAISEpet_name = Cord("petName")
Los cables pueden acceder a campos anidados, incluso a listas.
from centralita import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Coincide con la clave de campo0, # Coincide con el índice de lista"field2" # Coincide con la clave de campo] )MiSwitchboard().apply({ "campo1": [{ "campo2": "valor" }] })# > { "target_field": "valor" }
many
atributos del panel de control ayudan a manejar las listas. Por ejemplo:
clase MySwitchboard(Centralita):objetivo = Cord("fuente")data_in = [ {"fuente": 1}, {"fuente": 2}, {"fuente": 3}, {"fuente": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "destino": 1 }, { "destino": 2 }, { "destino": 3 }, {"destino": 4 }]