gpt4 book ai didi

python - 需要一种方法从 marshmallow 加载函数而不是字典中获取 python 对象,而不使用 post_load 装饰器

转载 作者:行者123 更新时间:2023-12-02 07:56:44 24 4
gpt4 key购买 nike

class ProfileSchema(Schema):

id = fields.Integer()
first_name = fields.String(required=True)
last_name = fields.String()
phone = fields.Str()
email = fields.Email()
gender = fields.String()
city = fields.Str()
state = fields.Str()
country = fields.Str()
age = fields.Int()
id_proof = fields.Str()
id_number = fields.Str()
id_kyc_url = fields.Str()
image_url = fields.Str()
profile_type = fields.Str()
country_code = fields.String()

@validates('gender')
def validate_gender(self, value):
"""
validates gender
:param value:
:return:
"""
if value not in genders:
raise ValidationError('Incorrect gender value it should be either Male or Female')

@post_load
def make_profile(self, data):
"""
make profile obj
:param data:
:return:
"""
return Profile(**data)

在上面的模式中,我使用 post_load 将字典转换为对象。有没有办法在不使用 post_load 装饰器的情况下得到这个?

最佳答案

如果我理解正确的话,你遇到的问题不是 post_load 装饰器,而是维护两个对象定义的冗余。如果是这种情况,您可以使用 namedtupledataclasses实现你想要的。您仍然可以在架构上定义 post_load 方法,但不再需要维护第二个类定义。

namedtuple解决方案

from collections import namedtuple

def make_object(class_name, members):
obj = namedtuple(class_name, ' '.join(members.keys()))
for k, v in members.items():
setattr(obj, k, v)
return obj

数据类解决方案

from dataclasses import make_dataclass

def make_object(class_name, members):
obj = make_dataclass(class_name, [(k, type(v)) for k,v in members.items()])
for k, v in members.items():
setattr(obj, k, v)
return obj
class ProfileSchema(Schema):

id = fields.Integer()
first_name = fields.String(required=True)
last_name = fields.String()
phone = fields.Str()
email = fields.Email()
gender = fields.String()
city = fields.Str()
state = fields.Str()
country = fields.Str()
age = fields.Int()
id_proof = fields.Str()
id_number = fields.Str()
id_kyc_url = fields.Str()
image_url = fields.Str()
profile_type = fields.Str()
country_code = fields.String()

@validates('gender')
def validate_gender(self, value):
"""
validates gender
:param value:
:return:
"""
if value not in genders:
raise ValidationError('Incorrect gender value it should be either Male or Female')

@post_load
def make_profile(self, data):
"""
make profile obj
:param data:
:return:
"""
return make_object(data)

关于python - 需要一种方法从 marshmallow 加载函数而不是字典中获取 python 对象,而不使用 post_load 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43232722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com