寫一段加入 Google 行事曆的 code
在準備每週 kobo 99元電子書特價資料時,加入 Google 行事曆的功能蠻好用。
接著我就想到,我們共同學習募集說明會時,百人響應、幾人到場 的情形,也許可以用這個方法解決,讓網友在自己的行事曆上設定提醒。
所以 【共筆】Line Bot 開發學習資源 募集說明會,就加了提醒按鈕。
因為這個功能未來可能常會用到,我懶得手動編輯,就請 ChatGPT(或其他類似工具)幫忙。
果然,幾秒鐘就完成了,程式也順利執行無誤。
使用者(就是我啦)輸入 標題、日期、時間和說明文字後(懶得輸入的話,都有預設值),就自動產生 Google Calendar 和 iCal 的 url 連結。
既然沒有問題,那這篇文章在底什麼 BUG?
問題發生在另一隻程式
通常我在上班前和下班後,都會跑一次 udemy 限免課程的爬蟲。
明明上午還活蹦亂跳的爬蟲,晚上卻出現了奇怪的 BUG。
只是 import pandas 就有問題,程式 line 4: import pandas as pd
Traceback (most recent call last):
File "C:\Dev\course\main_sorting.py", line 4, in <module>
import pandas as pd
File "C:\Python310\lib\site-packages\pandas\__init__.py", line 22, in <module>
from pandas.compat import is_numpy_dev as _is_numpy_dev
File "C:\Python310\lib\site-packages\pandas\compat\__init__.py", line 15, in <module>
from pandas.compat.numpy import (
File "C:\Python310\lib\site-packages\pandas\compat\numpy\__init__.py", line 4, in <module>
from pandas.util.version import Version
File "C:\Python310\lib\site-packages\pandas\util\__init__.py", line 1, in <module>
from pandas.util._decorators import ( # noqa:F401
File "C:\Python310\lib\site-packages\pandas\util\_decorators.py", line 14, in <module>
from pandas._libs.properties import cache_readonly # noqa:F401
File "C:\Python310\lib\site-packages\pandas\_libs\__init__.py", line 13, in <module>
from pandas._libs.interval import Interval
File "pandas\_libs\interval.pyx", line 1, in init pandas._libs.interval
File "pandas\_libs\hashtable.pyx", line 1, in init pandas._libs.hashtable
File "pandas\_libs\missing.pyx", line 1, in init pandas._libs.missing
File "C:\Python310\lib\site-packages\pandas\_libs\tslibs\__init__.py", line 30, in <module>
from pandas._libs.tslibs.conversion import (
File "pandas\_libs\tslibs\conversion.pyx", line 63, in init pandas._libs.tslibs.conversion
File "pandas\_libs\tslibs\parsing.pyx", line 1, in init pandas._libs.tslibs.parsing
File "pandas\_libs\tslibs\offsets.pyx", line 1, in init pandas._libs.tslibs.offsets
File "pandas\_libs\tslibs\timedeltas.pyx", line 61, in init pandas._libs.tslibs.timedeltas
File "pandas\_libs\tslibs\fields.pyx", line 49, in init pandas._libs.tslibs.fields
File "pandas\_libs\tslibs\strptime.pyx", line 633, in init pandas._libs.tslibs.strptime
File "pandas\_libs\tslibs\strptime.pyx", line 538, in pandas._libs.tslibs.strptime.TimeRE.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 414, in pandas._libs.tslibs.strptime.LocaleTime.__init__
File "pandas\_libs\tslibs\strptime.pyx", line 434, in pandas._libs.tslibs.strptime.LocaleTime.__calc_weekday
AttributeError: module 'calendar' has no attribute 'day_abbr'
什麼錯誤呢?我們看最後兩行,在 strptime.pyx
line 434,module ‘calendar’ 找不到這個屬性 ‘day_abbr’。
File "pandas\_libs\tslibs\strptime.pyx", line 434, in pandas._libs.tslibs.strptime.LocaleTime.__calc_weekday
AttributeError: module 'calendar' has no attribute 'day_abbr'
看看 pandas\_libs\tslibs\strptime.pyx
,我標註了 line 434,問題就出在這裡的 calendar.day_abbr[i].lower()
:
def __calc_weekday(self):
# Set self.a_weekday and self.f_weekday using the calendar
# module.
+ a_weekday = [calendar.day_abbr[i].lower() for i in range(7)] ## < line 434
f_weekday = [calendar.day_name[i].lower() for i in range(7)]
self.a_weekday = a_weekday
self.f_weekday = f_weekday
等一下,爬蟲程式又沒有用到 module ‘calendar’,我只是拿 pandas 來處理爬回來的課程資料 csv 檔,這樣也不行?
不過這個 module ‘calendar’ 看起來很眼熟,這不就是我白天新增的程式嗎?
看看 pandas\_libs\tslibs\strptime.pyx
前面幾行的 import:
"""Strptime-related classes and functions.
"""
+ import calendar
import locale
import re
import time
我大概心裡就有底了,這傢伙…
原因就是我把檔案命名為 calendar.py
我現在已經不常寫程式了,偶爾有在更動的,就是 udemy 限免課程的爬蟲。爬蟲程式經常更動是宿命,因為網站要防爬蟲,也經常在改版。
這些更動常會用到課程相關資料或程式,所以我會把程式放在同樣的路徑。
在測試加入行事曆功能時也不例外,我直接在原本爬蟲程式的路徑中,新增一個 calendar.py
檔,然後把 ChatGPT 的程式貼進去測試。
calendar.py
可以順利執行,但晚上執行爬蟲程式就出槌了。
雖然
1. 爬蟲程式沒用到 calendar.py
,只是 import pandas as pd
2. 兩個程式的路徑不同 calendar.py
& strptime.pyx
但就在命運的神秘安排下,產生了量子糾纏(胡扯,哪有!明明就是很初級的 BUG)。
這件事告訴我們(其實只有我),不要把檔案命名為常用字,這很可能會造成預期之外的BUG。
這時候是不是應該來整理一下,命名時應避開的檔名呢?找時間來整理一下好了。