问题 如何从datetime.datetime子模块直接导入now()


背景: 我在Python程序中有一些重复调用的紧密循环,其中包括 datetime.datetime.now() 方法,以及 datetime.datetime.min 和 datetime.datetime.max 属性。为了优化,我想将它们导入本地命名空间,避免重复的,不必要的模块层次结构名称查找,如下所示:

from datetime.datetime import now, min, max

然而,Python抱怨:

Traceback (most recent call last):
  File "my_code.py", line 1, in <module>
    from datetime.datetime import now, min, max
ImportError: No module named datetime

题:  为什么上面的子模块导入不起作用?

解决方法:  我可以这样做:

import datetime
dt_now = datetime.datetime.now
dt_min = datetime.datetime.min
dt_max = datetime.datetime.max

但是,我很好奇为什么更传统的方法不起作用?为什么我不能直接从datetime.dateime子模块导入方法和属性? ...并且,有没有理由避免上述解决方法(除了可读性,超越自己等)?

谢谢!


8203
2017-12-15 19:19


起源

最好不要输入max和min,否则当你去调用内置的min或max函数时你可能会有意想不到的结果 - Padraic Cunningham
@PadraicCunningham,你是对的。这就是为什么我在我的解决方法中更改了名称,但是我懒得在原始示例中添加“as”来重命名它们。 :) - Trevor


答案:


datetime.datetime 不是子模块。 datetime 是一个班内的 datetime 模块。 now 是该类的方法。你不能用 from...import... 导入类的各个方法。您只能使用它从包中导入单个模块,或者从模块顶层存在的单个对象。

至于你的解决方法,如果你想要速记,我发现这样做更具可读性:

from datetime import datetime as dt
dt.now()
# you can also use dt.max, dt.min, etc.

如果您真的想将这些方法直接放在局部变量中,那么您的解决方法是有意义的。


12
2017-12-15 19:24



啊,好抓!谢谢,@ BrenBarn! - Trevor