如何在棉花糖中设置 Int 字段的下限
How to set a lower bound for Int field in marshmallow
是否可以为 marshmallow
中的 filds.Int
设置下限/上限?
我想做的是
from marshmallow import Schema, fields
class User(Schema):
age = fields.Int()
u = User()
data = u.load({'age': -1})
>>> data
{'age': 0}
在这种情况下,我想将 0 作为年龄的下限值。
您似乎无法使用 Marshmallow
的 api 设置一个会在反序列化时更改输入值的界限;这可能是有充分理由的:看到 data = u.load({'age': -1})
之类的东西并返回 {'age': 0}
会让人非常困惑。
您可以做的是将一个函数传递给 fields.Int
的 validate
参数,这样您就可以捕获不需要的值。用法示例:
class User(Schema):
age = fields.Int(validate=lambda x: x > 0) # don't let anything <0 in
u = User()
data = u.load({'age': -1}
输出:
marshmallow.exceptions.ValidationError: {'age': ['Invalid value.']}
记住这些信息,你可以随意处理这个异常,例如:
try:
data = u.load({'age': -1})
except marshmallow.exceptions.ValidationError:
data = u.load({'age': 0})
如果您觉得 必须 为您的 fields.Int
使用创建一些界限,那么您可以按以下方式扩展 fields.Int
:
import typing
from marshmallow import fields, Schema
_T = typing.TypeVar("_T")
class BoundedInt(fields.Int):
def __init__(self, *a, bounds, **kw):
self._bounds: typing.Tuple[int] = bounds # bounds=(0, 10)
super().__init__(*a, **kw)
def _validated(self, value) -> typing.Optional[_T]:
if value < self._bounds[0]:
value = self._bounds[0]
elif value > self._bounds[1]:
value = self._bounds[1]
return super()._validated(value)
class User(Schema):
age = BoundedInt(bounds=(0, 10))
用法:
>>> u = User()
>>> data = u.load({'age': -1})
>>> data
{'age': 0}
是否可以为 marshmallow
中的 filds.Int
设置下限/上限?
我想做的是
from marshmallow import Schema, fields
class User(Schema):
age = fields.Int()
u = User()
data = u.load({'age': -1})
>>> data
{'age': 0}
在这种情况下,我想将 0 作为年龄的下限值。
您似乎无法使用 Marshmallow
的 api 设置一个会在反序列化时更改输入值的界限;这可能是有充分理由的:看到 data = u.load({'age': -1})
之类的东西并返回 {'age': 0}
会让人非常困惑。
您可以做的是将一个函数传递给 fields.Int
的 validate
参数,这样您就可以捕获不需要的值。用法示例:
class User(Schema):
age = fields.Int(validate=lambda x: x > 0) # don't let anything <0 in
u = User()
data = u.load({'age': -1}
输出:
marshmallow.exceptions.ValidationError: {'age': ['Invalid value.']}
记住这些信息,你可以随意处理这个异常,例如:
try:
data = u.load({'age': -1})
except marshmallow.exceptions.ValidationError:
data = u.load({'age': 0})
如果您觉得 必须 为您的 fields.Int
使用创建一些界限,那么您可以按以下方式扩展 fields.Int
:
import typing
from marshmallow import fields, Schema
_T = typing.TypeVar("_T")
class BoundedInt(fields.Int):
def __init__(self, *a, bounds, **kw):
self._bounds: typing.Tuple[int] = bounds # bounds=(0, 10)
super().__init__(*a, **kw)
def _validated(self, value) -> typing.Optional[_T]:
if value < self._bounds[0]:
value = self._bounds[0]
elif value > self._bounds[1]:
value = self._bounds[1]
return super()._validated(value)
class User(Schema):
age = BoundedInt(bounds=(0, 10))
用法:
>>> u = User()
>>> data = u.load({'age': -1})
>>> data
{'age': 0}