Python中的Typing hints

Typing hints使用

0、Markdown语法

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

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 + y

print(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

TypedDicttyping模块提供的特殊类型,用于为字典对象提供结构化类型提示,通过继承TypedDict并标注键值类型。

TypeDict可如下问题,让字典:

  • 定义必须的键
  • 指定键的类型
  • 在静态检查时发现问题
  • 保持运行时的灵活性
3.1、基本定义

定义一个模板类,该模板类继承TypedDict

# total表示所有字段是否是必填,True:所有字段必填,False:所有字段非必填
class User(TypedDict, total=False):
    name: str
    age: int
    email: str
    is_active: bool

user1: 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: int
    mobiles: NotRequired[List[str]]
    
class AdminUser(BaseUser):
    permissions: List[str]
    is_superuser: bool
    
admin: AdminUser = {
    "id": 1,
    "permissions": ["add","delete","query"],
    "is_superuser": True,
}

print(admin)

4、类型别名

类型别名,一切皆对象,类型也是变量,把类型(复杂的)赋值给另一个变量

var_int = int
stu_age: var_int = 25

list_alias = Optional[List[Union[str, int]]]
stu_list___: list_alias = ["alex", 23, "root", 29, 30]
# stu_list___: list_alias = None

tuple_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 func

get_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 = name

    def get_name(self) -> T3:
        return self.name

stu = 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 = name

    def get_name(self) -> str:
        return self.name

stu3 = Student2("alex")
print(stu3.get_name())
posted @ 2025-08-21 15:27  小熊熊8910  阅读(18)  评论(0)    收藏  举报