zope.i18n.format pytz usage (was Re: [Zope3-dev] XXX Roundup)

Gary Poster gary at zope.com
Fri Dec 16 16:56:52 EST 2005


On Dec 16, 2005, at 4:20 PM, Benji York wrote:
> Gary zope/i18n/format.py:141 and 149

Yup: the pytz StaticTzInfo is being used in a non-API way, and while  
pickling works, unpickling doesn't (ew!).

Here's the interactive prompt example, if anyone cares.

 >>> import pytz.tzinfo
 >>> tz = pytz.tzinfo.StaticTzInfo()
 >>> import pickle
 >>> import datetime
 >>> delta = datetime.timedelta(hours=-5)
 >>> delta
datetime.timedelta(-1, 68400)
 >>> tz._utcoffset = delta
 >>> pickle.dumps(tz)
'cpytz\n_p\np0\n(Ntp1\nRp2\n.'
 >>> pickle.loads(pickle.dumps(tz))
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "/home/gary/z4i/var/opt/python/lib/python2.4/pickle.py", line  
1394, in loads
     return Unpickler(file).load()
   File "/home/gary/z4i/var/opt/python/lib/python2.4/pickle.py", line  
872, in load
     dispatch[key](self)
   File "/home/gary/z4i/var/opt/python/lib/python2.4/pickle.py", line  
1153, in load_reduce
     value = func(*args)
   File "/home/gary/z4i/var/src/zope3/src/pytz/__init__.py", line  
163, in _p
     return unpickler(*args)
   File "/home/gary/z4i/var/src/zope3/src/pytz/tzinfo.py", line 340,  
in unpickler    tz = pytz.timezone(zone)
   File "/home/gary/z4i/var/src/zope3/src/pytz/__init__.py", line 47,  
in timezone    zone = _munge_zone(zone)
   File "/home/gary/z4i/var/src/zope3/src/pytz/__init__.py", line 71,  
in _munge_zone
     return zone.replace('+', '_plus_').replace('-', '_minus_')
AttributeError: 'NoneType' object has no attribute 'replace'

This is not pytz's fault: it wasn't designed to work the way that the  
format module is using it, as Stuart points out following Philipp's  
'XXX'.

I think I can fix it by using the pytz.reference.FixedOffset class.   
That's what I'll try to do now.

Gary






More information about the Zope3-dev mailing list