[英]Can't shadow python time module with my own time module
我有一個包含三個文件的文件夾:
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模塊而不是time模塊?
為什么我可以
datetime
模塊而不是time
模塊?
因為Python首先搜索內置模塊(用C實現),然后再搜索普通的.py
文件(在各個位置,從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
重新排序,然后將PathFinder
放在第一位,從而導致找到time.py
,但是請不要這樣做(除非您只是在嘗試:-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.