不能用我自己的时间模块覆盖 python 时间模块

Can't shadow python time module with my own time module

我有一个包含三个文件的文件夹:

time.py 和日期time.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'

为什么我可以隐藏日期时间模块而不是时间模块?

Why can I shadow the datetime module but not the time module?

因为 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 放在第一位,从而导致找到 time.py 但是,请不要这样做(除非您只是在试验 :-).