Python 2.7用caldav库序列化日历事件遇TypeError错误求助
解决Python 2.7中caldav + vobject添加EXDATE时的序列化错误
我刚碰到过几乎一模一样的问题,原因很简单:vobject的EXDATE字段期望接收的是日期时间对象的列表,而不是单个datetime对象。你直接赋值单个datetime的话,序列化时vobject会尝试对它做迭代操作(比如取__getitem__),自然就抛出了那个TypeError。
修复代码
只需要把单个datetime对象放进列表里赋值就行:
for event in results: vevent = event.instance.vevent if vevent.status.value != "CANCELLED": if (vevent.summary.value, vevent.dtstart.value) in cancelled: ev = calendar.event_by_uid(vevent.uid.value) # 把单个datetime包装成列表 ev.instance.vevent.add("exdate").value = [vevent.dtstart.value] print ev.instance.vevent.serialize()
为什么这样能行?
在iCalendar规范里,EXDATE是可以包含多个排除日期的,所以vobject的实现把这个字段的value设计成了可迭代的结构。当你传入单个datetime时,它无法像列表那样被遍历处理,就触发了报错。包装成列表后,vobject就能正确识别并序列化这个字段了。
额外注意点
如果你的事件带有时区信息(dtstart是带tzinfo的datetime),确保EXDATE的时区和原事件保持一致,避免出现日历解析异常的问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

