OK - I think this is it:

My last post fingering pickle was almost but not quite right*. Actually the cuplrit is marshal, which produces the incorrect result that was noted. The bug has nothing to do with IDLE, except that it uses marshal for inter-process communication.

Here's the failure case:
 >>> marshal.dumps(1e10000)
 'f\x061.#INF'
 >>> marshal.loads(_)
 1.0
 >>>

I speculate that this comes from marshal doing eval('1.#INF') rather than float('1.#INF'), and that it should be fixed to use float. Alternatively, it could detect this special case and raise its own exception. By analogy with pickle and cPickle it would make sense to raise ValueError on unmarshalling i.e., marshal.load(s).

 >>> import pickle
 >>> pickle.dumps(1e10000)
 'F1.#INF\n.'
 >>> pickle.loads(_)
 Traceback (most recent call last):
   File "<input>", line 1, in ?
   File "c:\python24\lib\pickle.py", line 1394, in loads
     return Unpickler(file).load()
   File "c:\python24\lib\pickle.py", line 872, in load
     dispatch[key](self)
   File "c:\python24\lib\pickle.py", line 968, in load_float
     self.append(float(self.readline()[:-1]))
 ValueError: invalid literal for float(): 1.#INF
 >>>


A more ambitious fix (which could be combined with option 1) would have the float constructor accept 1.#INF




Incidentally, the reason why this workaround is effective:
IDLE 1.1
 >>> 1e308*2
1.#INF
 >>>

is that it is the compiled code object (not what it evaluates to) that is 
marshalled

 >>> co = compile("1e308*2","<None>","single")
 >>> dis.dis(co)
   1           0 LOAD_CONST               0 (1e+308)
               3 LOAD_CONST               1 (2)
               6 BINARY_MULTIPLY
               7 PRINT_EXPR
               8 LOAD_CONST               2 (None)
              11 RETURN_VALUE
 >>> ma = marshal.dumps(co)
 >>> ma

'[EMAIL 
PROTECTED](\x03\x00\x00\x00f\x061e+308i\x02\x00\x00\x00N(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00t\x06\x00\x00\x00<None>t\x01\x00\x00\x00?\x01\x00\x00\x00s\x00\x00\x00\x00'
 >>>

Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to