Применить DRY к dict, в котором данные поступают из разных переменных

#python #django

#python #django

Вопрос:

У меня есть две функции, в которых я передаю dict event_data = {[...]} в API Google. Единственное отличие заключается в том, что update_calendar_event данные поступают из a dict . Для create_calendar_event него это obj .

Есть ли у вас какие-либо идеи, как применить DRY здесь, учитывая, что это два разных типа?

 class GoogleCalendarAPI:
    def __init__(self) -> None:
        # cache_discovery=False to avoid ImportError
        self.service = build(
            "calendar", "v3", credentials=credentials, cache_discovery=False
        )

    def _event_link(self, event_slug: str) -> str:
        return "https://example.com/events/"   event_slug

    def update_calendar_event(
        self, calendar_event_id: str, validated_data: Dict[str, Any], event_slug: str
    ) -> None:
        event_data = {
            "summary": validated_data.get("name"),
            "description": validated_data.get("description")
              "nnEvent link: "
              self._event_link(event_slug),
            "start": {
                "dateTime": validated_data.get("start_date").isoformat(),
                "timeZone": validated_data.get("timezone"),
            },
            "end": {
                "dateTime": validated_data.get("end_date").isoformat(),
                "timeZone": validated_data.get("timezone"),
            },
        }
        self.service.events().patch(
            calendarId=CALENDAR_ID, eventId=calendar_event_id, body=event_data
        ).execute()

    def create_calendar_event(self, event_instance) -> str:
        event_data = {
            "summary": event_instance.name,
            "description": event_instance.description
              "nnEvent link: "
              self._event_link(event_instance.slug),
            "start": {
                "dateTime": event_instance.start_date.isoformat(),
                "timeZone": event_instance.timezone,
            },
            "end": {
                "dateTime": event_instance.end_date.isoformat(),
                "timeZone": event_instance.timezone,
            },
        }
        event = (
            self.service.events()
            .insert(calendarId=CALENDAR_ID, body=event_data)
            .execute()
        )
        return event.get("id")
  

Комментарии:

1. Вы можете создать фрагмент кода, который переносит либо объект в dict, либо dict на объект, и работать с тем, который вы предпочитаете в своем коде

2. На самом деле только что обнаружил, что vars(obj) именно это и делает. 🙂