我正在使用JSON将数据从Python发送到R(注意:我对R比Python更熟悉)。对于原语,json
模块工作得很好。对于许多其他Python对象(例如numpy
数组),您必须定义自定义编码器,如此stack overflow answer。但是,这需要您将编码器作为参数传递给json.dumps
,这对我的情况不起作用。
我知道还有像json_tricks
这样的其他软件包具有更高级的JSON序列化功能,但由于我无法控制用户拥有的Python分发,我不想依赖任何非默认模块用于将对象序列化为JSON。
我想知道是否有办法使用 装饰器来定义序列化JSON对象的其他方法。理想情况下,我正在寻找一种方法,允许用户重载我提供的一些标准函数contextlib
standard_wrapper
,为他们自己的类(或者他们加载的模块中的类型)添加新方法,而不需要他们修改{{ 1}}。下面有一些伪代码:
standard_wrapper
这实际上是按类型重载的函数 ---我在Python中看到了overloading by arguments的示例,但我没有看到如何按类型执行。
编辑我正在将装饰器与import json
def standard_wrapper(o):
return o
obj = [44,64,13,4,79,2,454,89,0]
json.dumps(obj)
json.dumps(standard_wrapper(obj))
import numpy as np
objnp = np.sort(obj)
json.dumps(objnp) # FAILS
@some_decorator_to_overload_standard_wrapper
# some code
json.dumps(standard_wrapper(objnp)) # HOPEFULLY WORKS
混合(我以前只见过装饰器)。
答案 0 :(得分:1)
从singledispatch
模块中使用functools
可以轻松地按类型重载函数,如此answer所示。但是,可以满足我需要的更简单的解决方案是创建一个函数字典,其中键对应于对象类型。
import numpy
func_dict = {}
a = [2,5,2,9,75,8,36,2,8]
an = numpy.sort(a)
func_dict[type(an)] = lambda x: x.tolist()
func_dict[type(a)] = lambda x: x
import json
json.dumps(func_dict[type(a)](a))
json.dumps(func_dict[type(an)](an))
通过在字典中添加另一个函数来实现对其他类型的支持。