Switchboard를 사용하면 API 작업이 쉬워집니다. Switchboard를 사용하면 JSON 스키마를 쉽게 변환할 수 있습니다. 스위치보드를 생성하고 일부 코드를 정의함으로써 이전 스키마의 어떤 필드가 새 스키마의 어떤 필드에 암시되는지 관리할 수 있습니다.
교환대(Switchboard)라는 이름은 옛날 전화 교환원들의 협회입니다. 스위치보드를 사용하면 운영자 역할을 할 수 있습니다. 스키마 필드를 서로 연결하는 것은 전화 교환원의 교환기와 유사합니다. 골러 역사의 사진.
예를 들어 통합 및 타사 API를 사용하여 작업할 때 데이터를 수동으로 파헤쳐야 하는 상황에 자주 직면하게 됩니다. 다음과 같은 종류의 간단한 데이터베이스 스키마가 있다고 가정해 보겠습니다.
Column | Type ---------------+------- first_name | string last_name | string email | string
예를 들어 다음과 같은 종류의 페이로드를 반환하는 타사 사용자 API를 사용하여 작업하고 있습니다.
{ "id": 12335, "firstName": "John", "lastName": "Doe", "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가 유용한 이유입니다. 새로운 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", # 소스는 소스의 필드 위치를 알려줍니다.schemarequired=True, # 필드가 필수이고 누락된 경우 예외가 발생합니다default="Mr. Dog" # 필드가 누락된 경우 기본값이 사용됩니다.)
스위치보드 기능은 Meta 클래스를 사용하여 조정할 수 있습니다.
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# 누락된 필드를 어떻게 처리할지 알려줍니다. 기본 기능은 INCLUDE,#입니다. 이는 소스 필드가 누락된 경우 필드가 추가되지만 필드# 값은 Nonemissing = Switchboard.EXCLUDE # 옵션: Switchboard.EXCLUDE | 스위치보드.포함 | Switchboard.RAISEpet_name = 코드("petName")
코드는 중첩된 필드, 심지어 목록에도 액세스할 수 있습니다.
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # 필드 key0과 일치, # 목록 index"field2"와 일치 # 필드 key와 일치] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
스위치보드의 many
속성은 목록을 처리하는 데 도움이 됩니다. 예를 들어:
class MySwitchboard(스위치보드):target = Cord("source")data_in = [ {"출처": 1}, {"출처": 2}, {"출처": 3}, {"출처": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]