首页 > 解决方案 > 将 DRY 应用于数据来自不同变量的字典

问题描述

我有两个函数可以将 dict 传递event_data = {[...]}给 Google API。唯一的区别是update_calendar_event数据来自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")
            + "\n\nEvent 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
            + "\n\nEvent 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")

标签: pythondjango

解决方案


推荐阅读