檔案名稱的陷阱:命名 py 檔請小心

寫一段加入 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

這時候是不是應該來整理一下,命名時應避開的檔名呢?找時間來整理一下好了。

1 Like