Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何应用';从'加载#u;和';转储到';到棉花糖模式中的每个字段?_Python_Marshmallow - Fatal编程技术网

Python 如何应用';从'加载#u;和';转储到';到棉花糖模式中的每个字段?

Python 如何应用';从'加载#u;和';转储到';到棉花糖模式中的每个字段?,python,marshmallow,Python,Marshmallow,我一直在尝试实现一个“抽象”模式类,该类将自动将CamelCase(序列化)中的值转换为snake_case(反序列化) 虽然使用类似的方法可以很好地工作,但将load\u from和dump\u to应用到字段并不能实现所有功能。也就是说,当反序列化出现问题时,它无法提供正确的字段名。例如,我得到: {'something\u id':[u'不是有效整数。]}而不是{'somethingId':[u'不是有效整数。]} 虽然我可以对这些发出的错误进行后期处理,但如果要使模式的使用完全透明,我希

我一直在尝试实现一个“抽象”模式类,该类将自动将CamelCase(序列化)中的值转换为snake_case(反序列化)

虽然使用类似的方法可以很好地工作,但将
load\u from
dump\u to
应用到字段并不能实现所有功能。也就是说,当反序列化出现问题时,它无法提供正确的字段名。例如,我得到:
{'something\u id':[u'不是有效整数。]}
而不是
{'somethingId':[u'不是有效整数。]}

虽然我可以对这些发出的错误进行后期处理,但如果要使模式的使用完全透明,我希望避免这种不必要的耦合


有什么想法吗?我试着处理涉及的元类,但复杂度有点高,而且一切都异常丑陋。

您正在使用棉花糖2。棉花糖3现在已经过时了,我建议使用它。我的答案适用于棉花糖3

在棉花糖3中,
load\u from
/
dump\u to
已被单个属性替换:
data\u key

在实例化模式时,您需要更改每个字段中的
data\u key
。这将在字段实例化之后发生,但我认为这无关紧要

您希望在实例化模式时尽快这样做,以避免不一致性问题。这样做的正确时机将在 Schema的中间。在代码> > DATAYKEY < /COD>属性检查一致性之前。但复制这种方法将是一种遗憾。此外,由于camel/snake case转换的性质,无论如何都可以在转换之前应用一致性检查

由于
\u init\u字段
是私有API,我建议在
\u init\u
末尾进行修改

class CamelCaseSchema(Schema):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        for field_name, field in self.fields.items():
            fields.data_key = utils.CaseConverter.snake_to_camel(field_name)

我没有试过,但我认为它应该会起作用。

虽然我同意切换到棉花糖3是可取的,但在我目前的情况下是不可能的。对于其他使用版本2的用户,将
load_from
dump_设置为
也同样有效。感谢您周到的回复,解决方案似乎非常有效!
class CamelCaseSchema(Schema):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        for field_name, field in self.fields.items():
            fields.data_key = utils.CaseConverter.snake_to_camel(field_name)