Python:什么时候需要在模块名称前添加前缀?

时间:2019-09-06 06:06:16

标签: python datetime

经过C++C编程多年之后,我实际上才刚接触Python编程,并且正努力去感受语法。

在下面的入门代码中:

from datetime import datetime
from datetime import date

print( datetime.now() )
# print( now() ) # NameError: name 'now' is not defined

print( date(2005, 2, 27) )
# print( datetime.date(2005, 2, 27) ) # TypeError: descriptor 'date' requires a 'datetime.datetime' object but received a 'int'

... 为什么必须在now()中对datetime进行范围划分,但显然date(...)的范围是不正确的

我所引用的学习材料说这两个import statements表示我正在“ 从datetime标准模块导入日期和datetime类。”可能与我的{{1 }}背景下,我将C++等同于module,并认为这意味着(1)您需要使用它们来自的模块显式地作用于函数和类(例如{{1} })或(2)不需要显式作用域,因为namespace子句类似于std::sort()的{​​{1}}子句。所以上面的语法对我来说很奇怪,因为它看起来我正在使用来自日期时间“名称空间”的两个“事物”,因此我必须限定一件事,而不是另一个事物。。 / p>

FWIW,我使用from/import作为编辑器-我想知道:使用启用了图形/自动建议功能的编辑器,关于此的某些事情会更加透明吗?

对于任何回答者,如果您能解释一位经验丰富的Python程序员将如何找到此类问题的答案,我将不胜感激。我的意思是:在CC++ / using中,我会查找vim中的任何C来查找内容-您如何“查找”日期时间“模块”?

2 个答案:

答案 0 :(得分:4)

您是正确的-您无需进行范围调整!这种情况有点令人困惑,因为datetime模块具有一个也称为datetime的类。

那么每个这些都发生了什么:

print(datetime.now())#调用now()类的datetime类方法并打印其输出
print(now())#now()未在名称空间中定义,因此错误
print(date(2005, 2, 27))#实例化date对象并打印其表示形式
print(datetime.date(2005, 2, 27))#这正在尝试调用date()类的datetime方法,该方法不存在,因此出错。

在最后一种情况下,如果您刚刚完成import datetime,则整个datetime 模块都将被导入。在这种情况下,您可以通过执行datetime.date(2005,2,27)来实例化date类对象。

希望有点道理!

答案 1 :(得分:0)

在python中的导入很简单。导入时

from datetime import datetime

那么您从modul datetime中获取的仅会导入类/函数datetime。 (在这种情况下为一堂课)。您的解释器不知道函数“现在”,但是当您对导入的内容进行循环时,您可以访问它。

datetime.now()

第二次导入后

from datetime import date

您的编译器知道类date和datetime。尝试

print( datetime.date(2005, 2, 27) )

那不是您所期望的。您尝试从类datetime调用函数date,该函数date具有其他参数作为来自modul datetime的类日期。 模块化datetime的问题在于它包含一个带有datetime的类,因此有点令人困惑。