Как создать несколько ограниченных типов в Pydantic

Я пытаюсь установить ограничение на секретную строку. Если бы я мог, например, я хотел бы что-то вроде этого:

from pydantic import constr, SecretStr

class SimpleModel(BaseModel):
    password: (SecretStr, constr(min_length=8, max_length=32))

И если возможно сделать что-то, что позволит это сделать, мой следующий вопрос будет таким: могу ли я также добавить ограничение, что необходим символ, не являющийся словом? Я могу выполнять проверки регулярных выражений самостоятельно, но я пытаюсь более полно внедрить pydantic.


person Mike Williamson    schedule 12.07.2020    source источник


Ответы (1)


В настоящее время это невозможно с SecretStr. Пока PR не отправлен, вы можете использовать валидаторы для достижения такого же поведения:

import re
from pydantic import AnyStrMinLengthError, AnyStrMaxLengthError, BaseModel, SecretStr, StrRegexError, validator

class SimpleModel(BaseModel):
    password: SecretStr

    @validator('password')
    def has_min_length(cls, v):
        min_length = 8
        if len(v.get_secret_value()) < min_length:
            raise AnyStrMinLengthError(limit_value=min_length)
        return v

    @validator('password')
    def has_max_length(cls, v):
        max_length = 32
        if len(v.get_secret_value()) > max_length:
            raise AnyStrMaxLengthError(limit_value=max_length)
        return v

    @validator('password')
    def matches_regex(cls, v):
        regex = r'.*\W'
        if not re.match(regex, v.get_secret_value()):
            raise StrRegexError(pattern=regex)
        return v
person zxzak    schedule 13.07.2020
comment
Спасибо! Я также не был на 100% уверен, как это сделать с помощью валидаторов, так что это помогает. :) - person Mike Williamson; 14.07.2020