Typing hints使用
0、Markdown语法
- 标题
# H1
## H2
- 粗体
**粗体xx**
- 斜体
*斜体xx*
- 引用块
> 引用内容
- 有序列表
1. 第一项
2. 第二项
- 无序列表
- 第一项
- 第二项
- 代码 ``中间夹的文本
- 代码块 ````python\java...`
- 水平线
---
- 删除线
~~世界和平~~
- 任务列表
- [x] 纂写新闻稿
- [] 更新网站
- [] 联系媒体
- 连接
[titile](https://xxx/y/zz)
- 图片

1、简单类型注解
1.1、变量类型注解
age: int = 23
msg: str = "早安,中国"
user_list: list = [1, 2, 3, 4]
user_tuple: tuple = (1, 2, 3, 4)
1.2、函数(方法)注解
def cal(x: int, y: int) -> int:return x + yprint(cal(1, 2))
print(cal.__annotations__)
2、复杂类型注解
2.1、容器类型
List Tuple Set Dict
stu_list: List[str | int] = ["张三", "李四", "王五", 23, 68, 79]
stu_tuple: Tuple[str, int, bool | str] = ("张三", 23, "ok")
stu_set: Set[str | int] = {"alex", 23}
stu_dict: Dict[str, str | int] = {"name": "alex", "age": 23}
2.2、Union
允许一个变量被注解为多种可能得类型,可用
|
代替
stu_list_: List[Union[str, int]] = ["张三", "李四", "王五", 23, 68, 79]
stu_tuple_: Tuple[str, int, Union[bool, str]] = ("张三", 23, "ok")
stu_set_: Set[Union[str, int]] = {"alex", 23}
stu_dict_: Dict[str, Union[str, int]] = {"name": "alex", "age": 23}
2.3、Optional
Optional[Type]
等价于Union[Type,None]
,用于标注可能缺失的值
stu_list__: Optional[List[Union[str, int]]] = ["张三", "李四", "王五", 23, 68, 79]
# stu_list__: Optional[List[Union[str, int]]] = None
stu_tuple__: Optional[Tuple[str, int, Union[bool, str]]] = ("张三", 23, "ok")
stu_set__: Optional[Set[Union[str, int]]] = {"alex", 23}
stu_dict__: Optional[Dict[str, Union[str, int]]] = {"name": "alex", "age": 23}
3、TypeDict
TypedDict
是typing
模块提供的特殊类型,用于为字典对象提供结构化类型提示,通过继承TypedDict
并标注键值类型。
TypeDict可如下问题,让字典:
- 定义必须的键
- 指定键的类型
- 在静态检查时发现问题
- 保持运行时的灵活性
3.1、基本定义
定义一个模板类,该模板类继承TypedDict
# total表示所有字段是否是必填,True:所有字段必填,False:所有字段非必填
class User(TypedDict, total=False):name: strage: intemail: stris_active: booluser1: User = {"name": "alex","age": 22,"email": "564466411@qq.com","is_active": True,
}user2: User = {"name": "alex", # name属性都可以不填写
}print(user1,user2)
3.2、继承使用
class BaseUser(TypedDict):id: intmobiles: NotRequired[List[str]]class AdminUser(BaseUser):permissions: List[str]is_superuser: booladmin: AdminUser = {"id": 1,"permissions": ["add","delete","query"],"is_superuser": True,
}print(admin)
4、类型别名
类型别名,一切皆对象,类型也是变量,把类型(复杂的)赋值给另一个变量
var_int = int
stu_age: var_int = 25list_alias = Optional[List[Union[str, int]]]
stu_list___: list_alias = ["alex", 23, "root", 29, 30]
# stu_list___: list_alias = Nonetuple_alias = Optional[Tuple[str, int, Union[bool, str]]]
stu_tuple___: tuple_alias = ("alex", 23, True)
# stu_tuple___: tuple_alias = ("alex", 23, "39")
# stu_tuple___: tuple_alias = None
5、Callable,可调用对象
Callable[[ParamType1, ParamType2,....], ReturnType],用于标注可调用对象(如函数、方法或实现
__call__
的类)的参数和返回值类型Callable[..., str]表示任意参数类型,用于不确定的场景
def print_name(name: str, age_: int = 23) -> None:print("name:{},age:{}".format(name, age_))def get_name(func: Callable[[str, int], None]) -> Callable[[str, int], None]:return funcget_name(print_name)("alex", 25)
6、TypeVar和Generic 泛型
6.1、泛型 类型变量声明
TypeVar,用于声明可代表多种类型的占位符变量,支持类型参数化
T = TypeVar("T")def print_list(my_list: List[T]) -> None:print("list:{}".format(my_list))
6.2、约束泛型类型变量
不能混用,只能选择其中一种
# 带约束类型的泛型,使用时只能是 int,bool,str其中一种,并且不能混用
T2 = TypeVar("T2", int, bool, str)def print_list2(my_list: List[T2]) -> None:print("list:{}".format(my_list))print_list2([1, 3, 2])
print_list2([True, False, False])
print_list2(["a", "b", "c"])
# print_list2([1, 2, 3, "str"]) # 不能混用,提示有问题
6.3、泛型类继承
继承
Generic[T]
并应用泛型类型变量到类成员
T3 = TypeVar("T3")class Student(Generic[T3]):def __init__(self, name: T3) -> None:self.name = namedef get_name(self) -> T3:return self.namestu = Student[str]("alex")
# stu = Student("alex")
print(stu.get_name())# 比较Student2类与Student类
# 功能一样,但灵活性没有Student好,Student的可以指代任何类型,如int,float,str等等,而Student2只能是str,这就是泛型类的好处
class Student2:def __init__(self, name: str) -> None:self.name = namedef get_name(self) -> str:return self.namestu3 = Student2("alex")
print(stu3.get_name())