Webargs 的字典与 Marshmallow 数据类模式
Dictionary vs Marshmallow dataclass schemas for webargs
webargs
模块允许将参数模式描述为纯字典或棉花糖数据类模式:
# Dictionary variant
@use_args({'field1': field.Int(required=True, validate=validate.Range(min=1))}, location='json')
def post(args: Dict[str, any]):
controller.post(args)
# Marshmallow dataclass schema
@dataclass()
class Arg:
field1: int = field(metadata=dict(required=True, validate=validate.Range(min=1)))
@use_args(Arg.Schema(), location='json')
def post(arg: Arg):
controller.post(arg)
第一个变体看起来更短更快,但我们在 IDE 中丢失了语法高亮和类型检查(因为它是字典),而且它会导致更长的调用,即 args['field1']
而不是 arg.field1
.
您在大型项目中使用哪种变体?在使用第一个或第二个变体时是否有一些最佳实践?
没有最佳实践。这是一个偏好问题,真的。
有时,人们认为模式对于仅一两个查询参数来说代码太多,而字典就足够了。
我喜欢到处使用模式。我发现它更一致,它允许所有模式从基本模式派生以继承元参数。
我不使用棉花糖数据类,只使用纯棉花糖,所以我总是得到一个命令。
webargs
模块允许将参数模式描述为纯字典或棉花糖数据类模式:
# Dictionary variant
@use_args({'field1': field.Int(required=True, validate=validate.Range(min=1))}, location='json')
def post(args: Dict[str, any]):
controller.post(args)
# Marshmallow dataclass schema
@dataclass()
class Arg:
field1: int = field(metadata=dict(required=True, validate=validate.Range(min=1)))
@use_args(Arg.Schema(), location='json')
def post(arg: Arg):
controller.post(arg)
第一个变体看起来更短更快,但我们在 IDE 中丢失了语法高亮和类型检查(因为它是字典),而且它会导致更长的调用,即 args['field1']
而不是 arg.field1
.
您在大型项目中使用哪种变体?在使用第一个或第二个变体时是否有一些最佳实践?
没有最佳实践。这是一个偏好问题,真的。
有时,人们认为模式对于仅一两个查询参数来说代码太多,而字典就足够了。
我喜欢到处使用模式。我发现它更一致,它允许所有模式从基本模式派生以继承元参数。
我不使用棉花糖数据类,只使用纯棉花糖,所以我总是得到一个命令。