Pydantic предотвращает преобразование неправильного типа

Pydantic выполняет автоматическое преобразование типа, когда тип свойства не соответствует ожидаемому. Я считаю, что именно поэтому (удобно) можно присвоить значение свойства int enum класса через его необработанное значение int.

Однако у меня есть сценарий, в котором я хочу избежать такого поведения и вместо этого получить сообщение об ошибке проверки, если свойство не относится к ожидаемому типу. См. Следующий пример:

from pydantic import BaseModel
from typing import List

class Common(BaseModel):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        print(f"created {self.__class__.__name__} with {kwargs}")

class Child(Common):
    child_prop: int = None

class Parent(Common):
    child: Child

class Imposter(Common):
    imposter_prop: int

parent = Parent(
    child=Imposter(imposter_prop=0)
)
print(f"is child: {isinstance(parent.child, Child)}")

Результат выполнения этого модуля:

created Imposter with {'imposter_prop': 0}
created Child with {'imposter_prop': 0}
created Parent with {'child': Imposter(imposter_prop=0)}
is child: True

Как видите, Pydantic с радостью позволяет мне создать Parent с объектом Imposter для свойства, которое должно быть Child. Он поддерживает это, создавая Child, используя свойства Imposter. Я не хочу, чтобы это случилось.

Я просмотрел документацию Pydantic, но ни один из вариантов конфигурации не бросается мне в глаза как кандидат на изменение этого поведения. Могу ли я что-нибудь сделать, чтобы предотвратить эту попытку преобразования типа?


person tomfumb    schedule 03.02.2021    source источник


Ответы (1)


Если вы использовали что-то со встроенными типами и хотели предотвратить принуждение, вы можете использовать pydantic строгие типы. Учитывая, что вы являетесь пользовательскими типами, я считаю, что вам может потребоваться явно определить свой собственный validate(cls, v) @classmethod и т. Д. В своих пользовательских типах. Они предоставляют пример для проверки пользовательского типа данных, включая использование isinstance, которое вы захотите использовать.

person shawnwall    schedule 04.02.2021