from typing import Annotated,Optional,Union
from pydantic import Field, BaseModel
from uuid import uuid4
from dataclasses import dataclass
#pydantic用于数据校验
#一 pydantic Field
#default:为字段设置默认值
#default_factory:指定一个对象生成默认值,和default不能同时使用
# gt: 大于
# ge: 大于等于
# lt: 小于
# le: 小于等于
# min_length: int 最小长度
# max_length: int 最大长度
#pattern: str 正则表达式
#alias: 定义字段别名
class Human(BaseModel):
name:str = Field(description='name: ...', default=None,alias="my_name")
age:Annotated[int,Field(description='Age: 0-100', ge=0,le=100),"啥也不是"]#Annotated里的Field不能设置default ValueError: `Field` default cannot be set in `Annotated` for 'age'
gender:str = Field(description='Gender Type: Male; Female', default=None,min_length=4,max_length=6)
is_alive:bool = Field(description='True ;False', default=False)
uuid: str = Field(description='uuid4().hex', default_factory=lambda:uuid4().hex)
school:Annotated[str, Field(description="毕业院校")]
ret = Human(my_name="diaobaole",age=10,gender='male',is_alive=False,school="shanghai")
print(ret)
print(ret.name)
print(ret.age)
print(ret.gender)
print(ret.is_alive)
print(ret.uuid)
print(ret.school)
print(Human.__annotations__) #打印注解
#typing用于注解
#二 typing Annotated
# Annotated[类型, 元数据1, 元数据2, ...]
#x: Annotated[int, "这是一个整数", "用于计数"]
#三 typing Optional
#Optional 用于表示一个变量可以是某种类型,也可以是 None
def get_name(user_id: int) -> Optional[str]:
if user_id == 1:
return "Alice"
else:
return None
#这里的 Optional[str] 表示返回值可能是字符串,也可能是 None。
#等价写法 Optional[str] == Union[str, None]
#但 Optional[...] 更简洁,语义更清晰。
def get_name(user_id: int) -> Union[str, None]:
...
#在类中使用 Optional
@dataclass
class User:
name: str
nickname: Optional[str] = None
#表示 nickname 是可选字段,可以是字符串,也可以不提供(默认为 None)。
#结合 Annotated 使用
class User(BaseModel):
nickname: Annotated[Optional[str], Field(description="可选昵称")]
#表示nickname可以为str或空
#pydantic用于数据校验
一 pydantic Field
#default:为字段设置默认值
#default_factory:指定一个对象生成默认值,和default不能同时使用
# gt: 大于
# ge: 大于等于
# lt: 小于
# le: 小于等于
# min_length: int 最小长度
# max_length: int 最大长度
#pattern: str 正则表达式
#alias: 定义字段别名
#typing用于注解
二 typing Annotated
# Annotated[类型, 元数据1, 元数据2, ...]
#x: Annotated[int, "这是一个整数", "用于计数"]
#三 typing Optional
#Optional 用于表示一个变量可以是某种类型,也可以是 None