爲什麼我可以影響datetime
模塊而不是time
模塊?
因爲Python將首先搜索用於搜索正常.py
文件之前內置模塊(C實現)(在不同的地點,從你開始cwd
,看到sys.path
的內容)。
您可以通過檢查sys.meta_path
包含當一個模塊導入時(尚未在sys.modules
發現一個模塊)被查詢的發現者看到這一點:
>>> sys.meta_path
[<class '_frozen_importlib.BuiltinImporter'>,
<class '_frozen_importlib.FrozenImporter'>,
<class '_frozen_importlib_external.PathFinder'>]
首先在此列表BuiltinImporter
正如其名稱所暗示的,它處理內置模塊的發現。
時間模塊內置(見sys.builtin_module_names
對於這些列表):
>>> time
<module 'time' (built-in)>
,併爲您的time.py
執行搜索之前被發現。雖然datetime.py
是不是:
>>> datetime
<module 'datetime' from '/home/jim/anaconda3/lib/python3.6/datetime.py'>
,因此在當前的工作目錄口罩datetime.py
它(PathFinder
通過查看sys.path
中列出的條目發現datetime.py
)。
是的,你可以重新排序在sys.meta_path
的發現者,並把PathFinder
第一從而導致time.py
越來越發現,但是,請不要做(除非你只是嘗試:-)。
這似乎是一個可怕的想法,故意掩蓋內置模塊。你爲什麼想這麼做? –
我不知道「爲什麼」,但這裏是一個「如何」:命名你的模塊「my_time.py」,並以這種方式導入它:'import my_time as time'。 –
爲什麼我要這樣做: 我正在使用micropython開發一個項目。微處理器上可用的時間模塊版本具有ticks_ms()函數,返回自處理器啓動以來的毫秒數。在開發我在計算機上編寫的代碼時,爲了輕鬆測試代碼而無需將其上載到微處理器,我已經爲所有板載內容「模擬」了模塊。正常時間模塊沒有ticks_ms()函數,我不能只是將它命名爲其他東西,因爲導入不能在微處理器上工作。 – Stefan