Index: datetime.py =================================================================== --- datetime.py (revision 82218) +++ datetime.py (working copy) @@ -1761,19 +1761,23 @@ return week1monday class timezone(tzinfo): - def __init__(self, offset, *args): + def __new__(cls, offset, *args): # Reproduce C behavior n = len(args) if n > 1: raise TypeError("timezone() takes at most 2 arguments (%d given)" % n) if n == 0: - name = None + name = None else: name = args[0] if not isinstance(name, str): raise TypeError("name must be a string") if isinstance(offset, timedelta): + if (offset == timedelta(0) and name is None and + _utc is not None): + return _utc + self = tzinfo.__new__(cls) if self._minoffset <= offset <= self._maxoffset: if (offset.microseconds != 0 or offset.seconds % 60 != 0): @@ -1786,7 +1790,13 @@ raise TypeError("offset must be timedelta") self.__name = name + return self + def __reduce__(self): + if self is _utc: + return '_utc' + return tzinfo.__reduce__(self) + def __getinitargs__(self): """pickle support""" if self.__name is None: @@ -1845,7 +1855,8 @@ minutes = rest // timedelta(minutes=1) return 'UTC{}{:02d}:{:02d}'.format(sign, hours, minutes) -timezone.utc = timezone(timedelta(0)) +_utc = None +_utc = timezone.utc = timezone(timedelta(0)) timezone.min = timezone(timezone._minoffset) timezone.max = timezone(timezone._maxoffset)