如果没有传递值,则如何将默认值传递给变量?
如果没有传递值,则如何将默认值传递给变量?
在Pydantic中,如果在字段中传入None,我可以设置一个默认值吗?
我有以下代码,但我觉得这里的验证器只在模型初始化时起作用,而不是其他时候。
我的代码:
class User(BaseModel): name: Optional[str] = '' password: Optional[str] = '' email: EmailStr @validator('name') def set_name(cls, name): return name or 'foo'
遇到的问题:
user = User(name=None, password='some_password', email='example@example.com') print("Name is ", user.name) # > 'Name is foo' user.name = None print("Name is ", user.name) # > 'Name is None'
期望的输出:
user = User(name='some_name', password='some_password', email='example@example.com') user.name = None print("Name is ", user.name) # > 'Name is foo'
有什么想法可以实现期望的输出吗?我认为使用getter和setter可以解决这个问题。然而,我无法在Pydantic模型中使其工作:
尝试实现getter和setter:
class User(BaseModel): name: Optional[str] = '' password: Optional[str] = '' email: EmailStr def get_password(self): return self.password def set_password(self, password): self.password = hash_password(password) password = property(get_password, set_password) user = User(name='some_name', password='some_password', email='example@example.com') # > RecursionError: maximum recursion depth exceeded
我还尝试了使用property装饰器:
class User(BaseModel): name: Optional[str] = '' password: Optional[str] = '' email: EmailStr @property def password(self): return self._password @password.setter def password(self, password): pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") self._password = pwd_context.hash(password) user = User(name='some_name', email='example@example.com') user.password = 'some_password' # > ValueError: "User" object has no field "password"
我还尝试重写init方法:
class User(BaseModel): name: Optional[str] = "" password: Optional[str] = "" email: EmailStr def __init__(self, name, password, email): pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") password = pwd_context.hash(password) super().__init__(name=name, password=password, email=email) user = User(name="some_name", password="some_password", email='example@example.com') print(user.password) # > AYylwSnbQgCHrl4uue6kO7yiuT20lazSzK7x # 正常工作 user.password = "some_other_password" print(user.password) # > "some_other_password" # 不起作用 user.password = None print(user.password) # > None # 也不起作用