python - 在 Python 中序列化函数的源代码

标签 python python-2.x

<分区>

我正在尝试序列化代码并将其作为 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) 失败

原来的异常(exception)是:

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 中解决这个问题

最佳答案

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

import base64

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

jsn = {"code": code_base64}

关于python - 在 Python 中序列化函数的源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22619592/

相关文章:

python - 如何编写与 Python 2 和 Python 3 兼容的异常重新引发代码?

python - 将变量与多个值进行比较的简洁方法

python - 如何在 Python 的初始化程序中访问类变量?

python - 如何在 2.7 中为 'newline' 使用 'open' 关键字参数?

python - 检测具有不同比特率和/或不同 ID3 标签的重复 MP3 文件?

python - Python 脚本通常有什么类型的换行符?

类主体中类的 Python 名称

python - SWIG:将 2d numpy 数组传递给 C 函数 f(double a[])

python - Pandas:解析 Excel 中的合并标题列

python - 将 openpyxl 单元格格式设置为货币