将静态类变量序列化为JSON的Pythonic方法

问题描述

我希望将整个类序列化为json。但是,我需要的大多数变量都是静态变量(未在__init__()中定义)。除了朴素的解决方案之外,是否还有Python的方法可以做到这一点,即按名称调用所有变量?

到目前为止,我尝试使用编码器调用json.dump()来处理numpy数组:

cfg = MyConfig(Config)

class NumpyEncoder(json.JSONEncoder):
    def default(self,obj):
        if isinstance(obj,np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self,obj)

with open(os.path.join(logs_dir,'config.json'),'w') as file:
    json.dump(cfg.__dict__,file,cls = NumpyEncoder)

但是(当然),此代码段仅处理__init__()中声明的三个变量,而忽略了静态变量。

更多信息,以防万一: 我想序列化一个Mask RCNN中的config继承的类。

解决方法

因此,我做了一些研究并找到了解决方案,以防万一有人通过Google到达这里。保存所有类变量(甚至是静态变量)的方法是使用类名而不是实例名调用json.dump(),就像这样:

with open(os.path.join(logs_dir,'config.json'),'w') as file:
        json.dump(Config.__dict__.copy(),file,cls = NumpyEncoder)

我在copy()上调用Config.__dict__的原因是,在类(不是实例)上调用__dict__返回了一个mappingproxy对象,该对象不能使用幼稚地写入json dump()。处理对象会将其变成字典,从而解决了该问题。