codeutil.py
46 lines
| 1.7 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 | |||
""" | |||
__docformat__ = "restructuredtext en" | |||
#------------------------------------------------------------------------------- | |||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | |
MinRK
|
r3557 | # | |
# Distributed under the terms of the BSD License. The full license is in | |||
# the file COPYING, distributed as part of this software. | |||
#------------------------------------------------------------------------------- | |||
#------------------------------------------------------------------------------- | |||
# Imports | |||
#------------------------------------------------------------------------------- | |||
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): | |
if co.co_freevars or co.co_cellvars: | |||
raise ValueError("Sorry, cannot pickle code objects with closures") | |||
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, | |||
co.co_lnotab] | |||
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) |