#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)
именно это и делает. 🙂