欢迎访问宙启技术站
智能推送

TypedDict()和类型断言:确保代码的正确类型使用

发布时间:2023-12-23 17:55:03

TypedDict 是 Python3.8 引入的一种数据结构,官方文档称之为 "字典的子类,用于给字典的结构增加类型注释"。

在 Python 中,字典是一种无序、可变且可嵌套的数据类型,它由一系列键和对应的值组成。字典中的键是 的,可以是任何不可变的数据类型(如整数、字符串、元组),而值可以是任何数据类型(如整数、字符串、列表、字典)。

然而,Python 的字典没有提供对值的类型进行注释的功能,因此在编写代码时,我们无法准确地确定字典中键对应的值的类型。这就给代码的可读性、可维护性和可扩展性带来一些困扰。TypedDict 类型就是为了解决这个问题而引入的。

在使用 TypedDict 时,我们可以定义一个类继承自 TypedDict 类,并在类中指定键和对应值的类型,然后我们可以创建符合该类型注释的字典。这样一来,我们在编写代码时就可以准确地确定字典中键对应的值的类型,从而提高代码的可读性和可维护性。

下面是一个使用 TypedDict 的示例:

from typing import TypedDict

class Employee(TypedDict):
    id: int
    name: str
    age: int
    salary: float

employee1: Employee = {'id': 1, 'name': 'Alice', 'age': 25, 'salary': 5000.0}
employee2: Employee = {'id': 2, 'name': 'Bob', 'age': 30}  # 缺少 salary 字段,会报错

在上述示例中,我们定义了一个 Employee 类,继承自 TypedDict 类。在类中,我们指定了 id、name、age 和 salary 字段的类型。然后,我们可以创建符合 Employee 类型注释的字典 employee1,并指定键和对应的值。如果我们创建的字典缺少某个字段,或者某个字段的类型不符合注释的要求,Python 解释器会在静态类型检查时给出相应的错误。

需要注意的是,TypedDict 类型注释只是在静态类型检查时发挥作用,它并不能约束字典在运行时的行为。也就是说,在运行时,我们仍然可以往符合 TypedDict 注释的字典中添加任意字段,或者改变字段的值的类型。因此,TypedDict 类型注释只能在一定程度上提高代码的可靠性。

除了使用 TypedDict,我们还可以使用类型断言来确保代码的正确类型。类型断言是一种将一个对象强制转换为相应类型的操作。在 Python 中,我们可以使用 isinstance 函数进行类型断言。下面是一个使用类型断言的示例:

def calculate_total(salaries: dict) -> float:
    total = 0.0
    for salary in salaries.values():
        assert isinstance(salary, float), 'Salary must be a float'
        total += salary
    return total

salaries = {'Alice': 5000.0, 'Bob': 6000.0, 'Charlie': '7000.0'}  # Charlie 的 salary 类型错误,会报错
total_salaries = calculate_total(salaries)
print(total_salaries)

在上述示例中,我们定义了一个 calculate_total 函数,它接受一个包含员工薪水的字典作为参数,并返回所有薪水的总和。在函数体内,我们使用了类型断言来确保字典中每个值的类型为 float。如果类型不符合要求,Python 解释器会在运行时给出相应的错误。

需要注意的是,类型断言只对运行时数据起作用,它不会对静态类型检查产生任何影响。因此,在使用类型断言时,我们需要保证对应的值在运行时确实具有指定的类型,否则可能会导致运行时错误。

总结起来,TypedDict 和类型断言都可以用于确保代码的正确类型。TypedDict 提供了一种在字典结构上增加类型注释的方式,它在静态类型检查时可以发挥作用。而类型断言则是一种将对象转换为相应类型的操作,它在运行时可以发挥作用。对于需要在静态类型检查和运行时均保证代码的类型正确性的场景,我们可以同时使用 TypedDict 和类型断言来提高代码的可靠性。