在python中序列化一个函数

时间:2014-03-24 20:09:19

标签: python

我正在尝试序列化代码并将其作为json发送...

def f(x): return x*x
def fi(x): return int(x[0])

code_string = marshal.dumps(fi.func_code)

jsn = {"code":code_string)
json.dumps(jsn) # doesnt work if code_string is from fi

所以...如果我的函数是f(x)

,上面的代码块就可以工作

但是对于fi(x)

失败了

最初的例外是:

Traceback (most recent call last):
  File "/home/mohitdee/Documents/python_scala/rdd.py", line 41, in <module>
    send_data(json.dumps(jsn))
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 32: invalid start byte
[48001 refs]

我如何在python中解决这个问题

4 个答案:

答案 0 :(得分:5)

Marshall是一种二进制协议,即一堆具有非常自定义解释的字节。它不是文本,它不符合任何特定的文本编码。在大多数情况下,它只是一个比特序列。如果您绝对需要将它们嵌入到像JSON这样的文本协议中,则需要转义不在相关编码中生成有效字符的字节(为了安全起见,假设是ASCII的子集)。规范解决方案是base64

import base64

code_string = marshal.dumps(fi.func_code)
code_base64 = base64.b64encode(code_string)

jsn = {"code": code_base64}

答案 1 :(得分:3)

您可以使用cloud的{​​{1}}库实现序列化所有类型的活动对象,包括函数。

pickle

答案 2 :(得分:3)

尝试使用base64或其他类似算法对其进行编码。

答案 3 :(得分:2)

使用pickle(或cPickle):

  

pickle模块实现了一个基本但强大的算法   序列化和反序列化Python对象结构。

>>> import cPickle
>>> import json
>>> def fi(x):
...     return int(x[0])
... 
>>> fi(['1'])
1
>>> code_string = cPickle.dumps(fi)
>>> jsn = {"code": code_string}
>>> serialized = json.dumps(jsn)

>>> deserialized = json.loads(serialized)
>>> f = cPickle.loads(str(deserialized['code']))
>>> print f(['1'])
1