如何将动态字符串传递给pydantic字段



我在Python 3.10 + Pydantic框架中有这段代码

class DataInclude(BaseModel):
currencyAccount: Literal["CNY счет", "AMD счет", "RUB счет", "USD счет", "EUR счет", "GBP счет", "CHF счет"]

我想学习如何在字符串

中正确使用动态参数
name = (CNY, AMD, RUB, USD, EUR, GBP, CHF)
class DataInclude(BaseModel):
currencyAccount: Literal[f"{name}счет"]

在正则表达式的帮助下我不能

正如我在评论中已经提到的,您不能动态指定typing.Literal类型。

不这样做,您可以创建自己的enum.Enum来表示有效的货币选项。Pydantic很好地处理了这些问题。并且Enum功能API允许您动态设置它。

from enum import Enum
from pydantic import BaseModel, ValidationError

CURRENCIES = (
"CNY",
"AMD",
"RUB",
"USD",
"EUR",
"GBP",
"CHF",
)
Currency = Enum(
"Currency",
((curr, f"{curr} счет") for curr in CURRENCIES),
type=str,
)

class Data(BaseModel):
currency: Currency

if __name__ == "__main__":
obj = Data(currency="CNY счет")
print(obj, "n")
try:
Data(currency="foo")
except ValidationError as e:
print(e)

输出:

currency=<Currency.CNY: 'CNY счет'> 
1 validation error for Data
currency
value is not a valid enumeration member ...

枚举函数API的缺点是,一般的静态类型检查器将无法推断任何枚举成员。因此,如果您想使用像Currency.AMD这样的成员,您的IDE可能不会为您提供自动建议。如果这让您感到困扰,请考虑使用Currencyenum的常规类定义。