gpt4 book ai didi

python - 如何在棉花糖中设置 Int 字段的下限

转载 作者:行者123 更新时间:2023-12-04 03:58:29 24 4
gpt4 key购买 nike

是否可以在 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.Intvalidate 参数,这样您就可以捕获不需要的值。用法示例:

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}

关于python - 如何在棉花糖中设置 Int 字段的下限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63479528/

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