不能用我自己的时间模块覆盖 python 时间模块
Can't shadow python time module with my own time module
我有一个包含三个文件的文件夹:
- test.py
- time.py
- 日期time.py
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
但是,请不要这样做(除非您只是在试验 :-).
我有一个包含三个文件的文件夹:
- test.py
- time.py
- 日期time.py
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 thetime
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
但是,请不要这样做(除非您只是在试验 :-).