不能用我自己的时间模块影子python时间模块

时间:2017-07-21 15:02:58

标签: python datetime time import python-3.6

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

  • 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'

为什么我可以遮蔽日期时间模块但不影响时间模块?

1 个答案:

答案 0 :(得分: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通过查看datetime.py中列出的条目找到sys.path

是的,您可以在sys.meta_path重新排序查找器,然后将PathFinder放在第一位,从而导致找到time.py,但请不要这样做(除非你是只是试验: - )。