我在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可能不会为您提供自动建议。如果这让您感到困扰,请考虑使用Currency
enum的常规类定义。