codeutil.py
31 lines
| 1.0 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3557 | # encoding: utf-8 | |
"""Utilities to enable code objects to be pickled. | |||
Any process that import this module will be able to pickle code objects. This | |||
Bernardo B. Marques
|
r4872 | includes the func_code attribute of any function. Once unpickled, new | |
MinRK
|
r3557 | functions can be built using new.function(code, globals()). Eventually | |
we need to automate all of this so that functions themselves can be pickled. | |||
Reference: A. Tremols, P Cogolo, "Python Cookbook," p 302-305 | |||
""" | |||
MinRK
|
r4155 | import sys | |
Thomas Kluyver
|
r13354 | import types | |
try: | |||
import copyreg # Py 3 | |||
except ImportError: | |||
import copy_reg as copyreg # Py 2 | |||
MinRK
|
r3557 | ||
def code_ctor(*args): | |||
MinRK
|
r4161 | return types.CodeType(*args) | |
Bernardo B. Marques
|
r4872 | ||
MinRK
|
r3557 | def reduce_code(co): | |
MinRK
|
r4155 | args = [co.co_argcount, co.co_nlocals, co.co_stacksize, | |
co.co_flags, co.co_code, co.co_consts, co.co_names, | |||
co.co_varnames, co.co_filename, co.co_name, co.co_firstlineno, | |||
MinRK
|
r16514 | co.co_lnotab, co.co_freevars, co.co_cellvars] | |
MinRK
|
r4155 | if sys.version_info[0] >= 3: | |
args.insert(1, co.co_kwonlyargcount) | |||
return code_ctor, tuple(args) | |||
MinRK
|
r3557 | ||
Thomas Kluyver
|
r13354 | copyreg.pickle(types.CodeType, reduce_code) |