mirror of
https://github.com/python/cpython.git
synced 2025-11-24 20:30:18 +00:00
#1330538: Improve comparison of xmlrpclib.DateTime and datetime instances.
Remove automatic handling of datetime.date and datetime.time. This breaks backward compatibility, but python-dev discussion was strongly against this automatic conversion; see the bug for a link.
This commit is contained in:
parent
8328bbc57d
commit
085f75a851
4 changed files with 74 additions and 85 deletions
|
|
@ -357,13 +357,6 @@ class DateTime:
|
|||
if datetime and isinstance(value, datetime.datetime):
|
||||
self.value = value.strftime("%Y%m%dT%H:%M:%S")
|
||||
return
|
||||
if datetime and isinstance(value, datetime.date):
|
||||
self.value = value.strftime("%Y%m%dT%H:%M:%S")
|
||||
return
|
||||
if datetime and isinstance(value, datetime.time):
|
||||
today = datetime.datetime.now().strftime("%Y%m%d")
|
||||
self.value = value.strftime(today+"T%H:%M:%S")
|
||||
return
|
||||
if not isinstance(value, (TupleType, time.struct_time)):
|
||||
if value == 0:
|
||||
value = time.time()
|
||||
|
|
@ -371,10 +364,57 @@ class DateTime:
|
|||
value = time.strftime("%Y%m%dT%H:%M:%S", value)
|
||||
self.value = value
|
||||
|
||||
def __cmp__(self, other):
|
||||
def make_comparable(self, other):
|
||||
if isinstance(other, DateTime):
|
||||
other = other.value
|
||||
return cmp(self.value, other)
|
||||
s = self.value
|
||||
o = other.value
|
||||
elif datetime and isinstance(other, datetime.datetime):
|
||||
s = self.value
|
||||
o = other.strftime("%Y%m%dT%H:%M:%S")
|
||||
elif isinstance(other, (str, unicode)):
|
||||
s = self.value
|
||||
o = other
|
||||
elif hasattr(other, "timetuple"):
|
||||
s = self.timetuple()
|
||||
o = other.timetuple()
|
||||
else:
|
||||
otype = (hasattr(other, "__class__")
|
||||
and other.__class__.__name__
|
||||
or type(other))
|
||||
raise TypeError("Can't compare %s and %s" %
|
||||
(self.__class__.__name__, otype))
|
||||
return s, o
|
||||
|
||||
def __lt__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s < o
|
||||
|
||||
def __le__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s <= o
|
||||
|
||||
def __gt__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s > o
|
||||
|
||||
def __ge__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s >= o
|
||||
|
||||
def __eq__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s == o
|
||||
|
||||
def __ne__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return s != o
|
||||
|
||||
def timetuple(self):
|
||||
return time.strptime(self.value, "%Y%m%dT%H:%M:%S")
|
||||
|
||||
def __cmp__(self, other):
|
||||
s, o = self.make_comparable(other)
|
||||
return cmp(s, o)
|
||||
|
||||
##
|
||||
# Get date/time value.
|
||||
|
|
@ -736,19 +776,6 @@ class Marshaller:
|
|||
write("</dateTime.iso8601></value>\n")
|
||||
dispatch[datetime.datetime] = dump_datetime
|
||||
|
||||
def dump_date(self, value, write):
|
||||
write("<value><dateTime.iso8601>")
|
||||
write(value.strftime("%Y%m%dT00:00:00"))
|
||||
write("</dateTime.iso8601></value>\n")
|
||||
dispatch[datetime.date] = dump_date
|
||||
|
||||
def dump_time(self, value, write):
|
||||
write("<value><dateTime.iso8601>")
|
||||
write(datetime.datetime.now().date().strftime("%Y%m%dT"))
|
||||
write(value.strftime("%H:%M:%S"))
|
||||
write("</dateTime.iso8601></value>\n")
|
||||
dispatch[datetime.time] = dump_time
|
||||
|
||||
def dump_instance(self, value, write):
|
||||
# check for special wrappers
|
||||
if value.__class__ in WRAPPERS:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue