我有一个包含三个文件的文件夹:
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'
为什么我可以遮蔽日期时间模块但不影响时间模块?
答案 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
,但请不要这样做(除非你是只是试验: - )。