Terry J. Reedy added the comment:
Code is really a code object, so the compile does not seem to be the problem.
In 2.7, on Win7, I get exactly the same output after removing the possibly
spurious space in the string posted. (ppperry), what system (OS) are you
using. (In the future, please report both system and Python version).
3.4 gives a mild variation
b'\x80\x03cidlelib.rpc\nunpickle_code\nq\x00CZ\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00s\x08\x00\x00\x00e\x00\x00\x01d\x00\x00S)\x01N)\x01Z\ndummy_code\xa9\x00r\x01\x00\x00\x00r\x01\x00\x00\x00z\x06<test>\xda\x08<module>\x01\x00\x00\x00s\x00\x00\x00\x00q\x01\x85q\x02Rq\x03.'
I ran both test_pickle and test_pickletools from both the command line
>python -m test -v test_pickletools
and from an Idle editor with F5, with no errors and apparently identical output.
import pickle
code = compile("dummy_code", "this is a file name", "exec")
print(type(code))
print('pickle: ', pickle.dumps(code))
>>> produces
<class 'code'>
pickle: b'\x80\x03cidlelib.rpc ... \x13this is a file name\...'
which shows that the bytes come from picke, not from a garbled traceback.
Since the bytes look like an actual pickle, I tried unpickling and it works:
import pickle
code = compile("'a string'", "", "eval")
pick = pickle.dumps(code)
code2 = pickle.loads(pick)
print(eval(code), eval(code2))
>>>
a string a string
import pickle
code1 = compile("print('a string')", "", "exec")
pick = pickle.dumps(code1)
code2 = pickle.loads(pick)
exec(code1)
exec(code2)
>>>
a string
a string
I do not see any Idle bug here, so this might be closed unless you want to make
this a pickle enhancement issue to work on code objects in the standard
interpreter. The 3.4 interpreter traceback gives more info on why the pickle
fails there.
>>> code0 = compile("'abc'", '', 'eval')
>>> pick = pickle.dumps(code0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'code'>: attribute lookup code on
builtins failed
In Idle, __builtins__.code fails, just as in the interpreter, so pickle is
doing something different, and more successful, in the slightly altered Idle
user-process execution environment.
----------
components: +Library (Lib) -IDLE
nosy: +pitrou
stage: -> needs patch
versions: +Python 2.7, Python 3.4, Python 3.5
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue21986>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com