我试图比较两个日期。此代码有效:
import datetime
todays_date = datetime.date.today()
date1 = datetime.date(2006, 3, 15)
date2 = datetime.date(2009, 4, 30)
print(date1 != date2)
print(date1 == 0)
它产生:
True
False
这些代码不起作用,我不知道原因:
import datetime
todays_date = datetime.date.today()
date1 = datetime.date(2006, 3, 15)
date2 = datetime.date(2009, 4, 30)
print(date1 != date2)
print(date1 >= 0)
它产生了这个错误:
File 'datetime.py', Line 363: AttributeError: 'int' object has no attribute '__name__'
请注意,我更改的所有内容为==
到>=
,为什么相等比较会产生True
或False
,而大于比较会导致错误?
我将不胜感激任何帮助!
答案 0 :(得分:10)
这是因为比较方法的定义方式。
以下是time
对象source code的副本:
def __eq__(self, other):
if isinstance(other, time):
return self._cmp(other, allow_mixed=True) == 0
else:
return False
def __ge__(self, other):
if isinstance(other, time):
return self._cmp(other) >= 0
else:
_cmperror(self, other)
__eq__
返回False
,而不是time
个实例,而__ge__
则调用_cmperror
,其定义如下:
def _cmperror(x, y):
raise TypeError("can't compare '%s' to '%s'" % (
type(x).__name__, type(y).__name__))
虽然这个答案已经获得了一些积极的分数,但我错过了阅读你的问题,你使用了date
个对象,而不是time
个对象。
首先,与date
个对象不同,time
个对象的实现与__eq__
和__ge__
相同。它们都实际返回NotImplemented
,因此对date
对象的方法没有什么特别之处:
def __eq__(self, other):
if isinstance(other, date):
return self._cmp(other) == 0
return NotImplemented
def __ge__(self, other):
if isinstance(other, date):
return self._cmp(other) >= 0
return NotImplemented
然而,与int
__eq__
对其他方法的比较有所不同。当int
的对象具有无法比较的类型且False
的{{1}}为__eq__
时,NotImplemented
会返回__ge__
。
NotImplemented
返回的date
将导致int
方法的回退。由于int
始终具有可比性,date == 0
不会导致错误。
以下是一个例子:
class LikeDate:
def __eq__(self, other):
if isinstance(other, LikeDate):
return True
else:
return NotImplemented
def __ge__(self, other):
if isinstance(other, LikeDate):
return True
else:
return NotImplemented
class LikeInt:
def __eq__(self, other):
if isinstance(other, LikeInt):
return True
else:
return False
def __ge__(self, other):
if isinstance(other, LikeInt):
return True
else:
return NotImplemented
a = LikeDate()
b = LikeInt()
print(a == b) # False
print(a == 0) # False, because int provides an __eq__ method that returns False
print(a >= 0) # Error, because nether LikeDate nor int provides a definite comparison for __ge__
print(a >= b) # Error, because neither objects provide a comparable __ge__
You can run this example here.
如果您不知道return NotImplemented
是什么,请参阅doc的简短说明和引用:
当二进制[(
__eq__
,__ge__
...)](或就地)方法返回NotImplemented
时 解释器将尝试反射操作在另一种类型(或 其他一些后备,取决于运营商)。如果所有的尝试 返回NotImplemented
,口译员会提出适当的答案 例外。错误地返回NotImplemented将导致a 误导性错误消息或返回的NotImplemented
值 Python代码。
当从二进制方法返回NotImplemented
时,它指的是二进制方法无法将自己与目标进行比较'类型。二进制方法的结果将取决于其他对象'二元方法。如果两个对象都返回NotImplemented
,则会引发错误。
答案 1 :(得分:1)
正如其他人已经指出的那样,你不能使用date1 >= 0
,因为两者的类型不同。
date1 == 0
有效,因为您正在检查两个对象是否彼此相等。如果他们的类型不同,则答案自动为否,因此您将返回False
。
但是,在使用<
,>
,<=
,>=
时,您会检查某些内容是否大于或小于其他内容。如果你使用两个不同类型的对象,这些对象无法轻易地相互转换,那么就不会定义大于&#39;大于&#39;或者小于&#39;手段。因此,在您的情况下,date1
的类型为datetime.date
,而0
的类型为int
。
答案 2 :(得分:0)
您正在尝试将date1
与0进行比较。
这不起作用,因为date1
是datetime.date
(请参阅最初如何定义)。所以基本上你要将date
与int
进行比较。
您只能比较相似的类型。