【问题标题】:Setting a default value based on another value根据另一个值设置默认值
【发布时间】:2022-01-08 01:40:41
【问题描述】:

我有以下 Pydantic 模型:

from pydantic import BaseModel
import key

class Wallet(BaseModel):
    private_key: str = Field(default_factory=key.generate_private_key)
    address: str

我希望 address 有一个 default_factory 作为函数,它以 private_key 作为输入并返回一个地址。我的意图大致如下:

address: str = Field(default_factory=key.generate_address(self.private_key)

我怎样才能做到这一点?

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    另一种选择是只使用@validator,因为您可以在其中访问以前验证过的字段。来自the documentation

    • 验证器是“类方法”,因此它们接收的第一个参数值是 UserModel 类,而不是 UserModel 的实例。
    • 第二个参数始终是要验证的字段值;可以随意命名
    • 您还可以将以下参数的任何子集添加到签名(名称必须匹配):
      • values:包含任何先前验证字段的名称到值映射的字典

    例子:

    class Wallet(BaseModel):
        private_key: str = Field(default_factory=key.generate_private_key)
        address: str = "" # "" seems better than None to use the correct type
    
        @validator("address", always=True)
        def get_address(cls, address: str, values: Dict[str, Any]) -> str:
            if address is None:
                return key.generate_address(values["private_key"])
            return address
    

    如果您只想为单个字段生成值,可以说@validator 应该优先于@root_validator

    必须考虑此方法的两个重要方面:

    1. 文档中的“先前验证的字段”意味着在您的情况下,private_key 必须在 address 之前定义。在被验证的字段之后定义的字段的值对验证器不可用。

    2. 如果验证的字段具有默认值,并且您仍希望在这种情况下执行验证器,则必须使用always=True

    【讨论】:

      【解决方案2】:

      我能够使用root_validator 实现它:

      class Wallet(BaseModel):
          address: str = None
          private_key: str = Field(default_factory=key.generate_private_key)
      
          @root_validator
          def get_address(cls, values) -> dict:
              if values.get("address") is None:
                  values["address"] = key.generate_address(values.get("private_key"))
              return values
      

      不确定这是否是实现这一目标的最佳方式

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 2021-06-22
        • 1970-01-01
        • 2013-05-20
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2014-12-19
        相关资源
        最近更新 更多