AttributeError出现在datetime表达式中

时间:2018-05-27 15:45:06

标签: python python-3.x datetime

在关注Python教程的同时,我开始了解内置的repr()函数,根据官方文档:

  

返回包含对象的可打印表示的字符串。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象,否则表示形式是包含在尖括号中的字符串,其中包含类型的名称。对象以及通常包括对象的名称和地址的附加信息。类可以通过定义__repr__()方法来控制此函数为其实例返回的内容。

     

https://docs.python.org/3/library/functions.html#repr

总而言之,对于包含大多数内置插件的许多对象类型,eval(repr(obj)) == obj(或等效的obj == eval(repr(obj))返回 True ,也在上面的文档中提到过。

但是,在执行以下代码时,AttributeError: type object 'datetime.datetime' has no attribute 'datetime'出现在最后一个语句中,即print(today == eval(repr(today))

from datetime import datetime

s = 'Hello, Pythoneers'
print(s == eval(repr(s)))  # no errors here

today = datetime.now()
print(today == eval(repr(today))) # error occurs here

有人可以解释这种行为背后的原因吗?

1 个答案:

答案 0 :(得分:0)

datetime在表示中使用datetime.datetime(...)

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 5, 27, 16, 46, 59, 491342)

那是模块名称,后跟类名,它是模块的一个属性:

>>> datetime
<module 'datetime' from '/.../lib/python3.6/datetime.py'>
>>> datetime.datetime
<class 'datetime.datetime'>

示例中的名称datetime 并不引用模块,而是引用模块中的类:

>>> from datetime import datetime  # the form used in your question
>>> datetime
<class 'datetime.datetime'>

改为使用import datetime,然后使用today = datetime.datetime.now()

repr()调用object.__repr__() method,但未传递有关您的代码如何引用该类的任何信息;因此实例无法调整它生成的字符串。即使有更多信息可供使用,您仍然不希望生成不同的字符串 ;你真的想知道某人在某个地方开玩笑地使用fluzborx.datetime()时会发现import datetime as fluzborx是什么意思吗?

请注意,repr()的目标是帮助调试,而不是提供数据类型的完整序列化支持。如果您要序列化datetime个实例,请使用正确的序列化格式,例如pickle,或编写您自己的日期时间 - &gt;字符串和字符串 - &gt;日期时间转换(例如,对于JSON,可能使用ISO8601字符串转换)。