2017-07-21 29 views
0

我有三個文件夾:不能陰影蟒蛇時間模塊,我自己的時間模塊

  • test.py
  • time.py
  • datetime.py

time.py和datetime.py是相同的:

def ticks_ms(): 
    return 5 

當test.py看起來是這樣的:

import datetime as t 
print(t.ticks_ms()) 

它打印5.如果我將其更改爲:

import time as t 
print(t.ticks_ms()) 

我得到:

AttributeError: module 'time' has no attribute 'ticks_ms' 

爲什麼我的影子datetime模塊,但沒有時間模塊?

+2

這似乎是一個可怕的想法,故意掩蓋內置模塊。你爲什麼想這麼做? –

+0

我不知道「爲什麼」,但這裏是一個「如何」:命名你的模塊「my_time.py」,並以這種方式導入它:'import my_time as time'。 –

+0

爲什麼我要這樣做: 我正在使用micropython開發一個項目。微處理器上可用的時間模塊版本具有ticks_ms()函數,返回自處理器啓動以來的毫秒數。在開發我在計算機上編寫的代碼時,爲了輕鬆測試代碼而無需將其上載到微處理器,我已經爲所有板載內容「模擬」了模塊。正常時間模塊沒有ticks_ms()函數,我不能只是將它命名爲其他東西,因爲導入不能在微處理器上工作。 – Stefan

回答

2

爲什麼我可以影響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越來越發現,但是,請不要做(除非你只是嘗試:-)。