Pydantic constr 与 Field args
Pydantic constr vs Field args
我想知道有什么区别:
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(..., min_length=1)
并且:
from pydantic import BaseModel, constr
class Person(BaseModel):
name: constr(min_length=1)
两者似乎执行相同的验证(甚至在 name
为空字符串时引发完全相同的异常信息)。这只是代码风格的问题吗?他们中的一个比另一个更受欢迎吗?
此外,如果我想包含一个非空字符串列表作为属性,您认为以下哪种方式更好?:
from typing import List
from pydantic import BaseModel, constr
class Person(BaseModel):
languages: List[constr(min_length=1)]
或者:
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str]
@validator('languages', each_item=True)
def check_nonempty_strings(cls, v):
if not v:
raise ValueError('Empty string is not a valid language.')
return v
编辑:
FWIW,我正在将其用于 FastAPI 应用程序。
编辑2:
对于我的第二个问题,我认为第一个选择更好,因为它在架构中包含长度要求(因此在文档中)
constr 和 Fields 的用途不同。
constr 是一种特定类型,它给出了关于该特定类型的验证规则。您拥有所有经典 python 类型的等价物。
arguments 的构造:
strip_whitespace: bool = False: removes leading and trailing whitespace
to_lower: bool = False: turns all characters to lowercase
strict: bool = False: controls type coercion
min_length: int = None: minimum length of the string
max_length: int = None: maximum length of the string
curtail_length: int = None: shrinks the string length to the set value when it is longer than the set value
regex: str = None: regex to validate the string against
如您所见,这些参数允许您操纵 str 本身,而不是 pydantic 对该字段的行为。
Field不是同一个目的,它是一种自定义字段的方式,所有字段不仅是str,它还添加了18个您可以找到的自定义变量here。
Is it just a matter of code style? Is one of them preferred over the other?
对于 str 的特定情况,这是代码风格的问题,首选什么并不重要,只有您的用例才重要。
一般来说,最好不要将不同的语法混合在一起,因为您经常需要 Field(),所以您会经常发现它。
一个典型的用例是 api 响应发送 json 驼峰式或 PascalCase 对象,您可以使用字段别名来匹配这些对象并使用它们在 snake_case 中的变量.
class Voice(BaseModel):
name: str = Field(None, alias='ActorName')
language_code: str = None
mood: str = None
在你的第二个问题中,你可以使用字段来实现相同的行为。
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str] = Field(..., min_items=1)
如果您想了解有关限制和现场规则执行的更多信息,请检查 this。
此 link 显示了同时适用于 pydantic 和 mypy 的方法:https://lyz-code.github.io/blue-book/coding/python/pydantic_types/#using-constrained-strings-in-list-attributes
我的用例的最佳选择是制作一个从 pydantic.ConstrainedStr
继承的 class,如下所示:
import pydantic
from typing import List
...
class Regex(pydantic.ConstrainedStr):
regex = re.compile("^[0-9a-z_]*$")
class Data(pydantic.BaseModel):
regex: List[Regex]
# regex: list[Regex] if you are on 3.9+
我想知道有什么区别:
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(..., min_length=1)
并且:
from pydantic import BaseModel, constr
class Person(BaseModel):
name: constr(min_length=1)
两者似乎执行相同的验证(甚至在 name
为空字符串时引发完全相同的异常信息)。这只是代码风格的问题吗?他们中的一个比另一个更受欢迎吗?
此外,如果我想包含一个非空字符串列表作为属性,您认为以下哪种方式更好?:
from typing import List
from pydantic import BaseModel, constr
class Person(BaseModel):
languages: List[constr(min_length=1)]
或者:
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str]
@validator('languages', each_item=True)
def check_nonempty_strings(cls, v):
if not v:
raise ValueError('Empty string is not a valid language.')
return v
编辑: FWIW,我正在将其用于 FastAPI 应用程序。
编辑2: 对于我的第二个问题,我认为第一个选择更好,因为它在架构中包含长度要求(因此在文档中)
constr 和 Fields 的用途不同。
constr 是一种特定类型,它给出了关于该特定类型的验证规则。您拥有所有经典 python 类型的等价物。
arguments 的构造:
strip_whitespace: bool = False: removes leading and trailing whitespace
to_lower: bool = False: turns all characters to lowercase
strict: bool = False: controls type coercion
min_length: int = None: minimum length of the string
max_length: int = None: maximum length of the string
curtail_length: int = None: shrinks the string length to the set value when it is longer than the set value
regex: str = None: regex to validate the string against
如您所见,这些参数允许您操纵 str 本身,而不是 pydantic 对该字段的行为。
Field不是同一个目的,它是一种自定义字段的方式,所有字段不仅是str,它还添加了18个您可以找到的自定义变量here。
Is it just a matter of code style? Is one of them preferred over the other?
对于 str 的特定情况,这是代码风格的问题,首选什么并不重要,只有您的用例才重要。
一般来说,最好不要将不同的语法混合在一起,因为您经常需要 Field(),所以您会经常发现它。
一个典型的用例是 api 响应发送 json 驼峰式或 PascalCase 对象,您可以使用字段别名来匹配这些对象并使用它们在 snake_case 中的变量.
class Voice(BaseModel):
name: str = Field(None, alias='ActorName')
language_code: str = None
mood: str = None
在你的第二个问题中,你可以使用字段来实现相同的行为。
from typing import List
from pydantic import BaseModel, Field
class Person(BaseModel):
languages: List[str] = Field(..., min_items=1)
如果您想了解有关限制和现场规则执行的更多信息,请检查 this。
此 link 显示了同时适用于 pydantic 和 mypy 的方法:https://lyz-code.github.io/blue-book/coding/python/pydantic_types/#using-constrained-strings-in-list-attributes
我的用例的最佳选择是制作一个从 pydantic.ConstrainedStr
继承的 class,如下所示:
import pydantic
from typing import List
...
class Regex(pydantic.ConstrainedStr):
regex = re.compile("^[0-9a-z_]*$")
class Data(pydantic.BaseModel):
regex: List[Regex]
# regex: list[Regex] if you are on 3.9+