我正在使用Pymango自定义bson编码器。因为编码器不能被继承,所以需要为每个类创建它,所以我想动态地为它创建一个编码器
问题是基本编码器(TypeEncoder
)是从ABC类创建的。当我尝试使用以下代码创建类时:
from bson.codec_options import TypeEncoder
cls_encoder = type(f"Flag{cls.__name__}Encoder",
(TypeEncoder,),
{"transform_python": lambda self, value: value.code,
"python_type": property(lambda self: cls)})
结果将是
>> isinstance(cls_encoder, TypeEncoder)
False
>> type(cls_encoder)
<class 'abc.FlagAutoReplyContentTypeEncoder'>
>> super(cls_encoder)
<super: <class 'FlagAutoReplyContentTypeEncoder'>, NULL>
预期结果应该是
>> isinstance(cls_encoder, TypeEncoder)
True
注意:cls
变量将是一个枚举
注:python_type
是一个abstractproperty
transform_python
是一个函数,它接受python_type
类型的值并返回type is valid for bson serialization类型的值
我试过这个:
class FlagBsonEncoder(TypeEncoder):
def transform_python(self, value):
return value.code
cls_encoder = type(f"Flag{cls.__name__}Encoder",
(FlagBsonEncoder,),
{"python_type": property(lambda self: cls)})
但结果还是一样:
>> isinstance(cls_encoder, TypeEncoder)
False
下面是如何使用自定义类型编码的官方示例: http://api.mongodb.com/python/current/api/bson/codec_options.htmlhttp://api.mongodb.com/python/current/examples/custom_type.html#custom-type-type-codec
我想你误解了
isinstance
的作用isinstance(cls_encoder, TypeEncoder)
询问类对象cls_encoder
是否是TypeEncoder
的实例。当然不是-它是一种类型您想要的是
isinstance(cls_encoder(), TypeEncoder)
,它询问cls_encoder
的实例是否也是TypeEncoder
的实例,当然这必须是真的如果要检查类
cls_encoder
是否是TypeEncoder
的子类,可以使用issubclass(cls_encoder, TypeEncoder)
相关问题 更多 >
编程相关推荐