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

了解使用typing_extensions的TypedDict()为字典定义可选键值

发布时间:2023-12-16 17:59:51

在 Python 中,字典是一种非常常见的数据结构,用于存储键值对。然而,字典在类型注释中通常会有一些问题,因为它们的键和值可以是任意类型,这在一些情况下可能会导致类型错误。为了解决这个问题,Python 3.8 引入了 typing_extensions 模块,其中提供了一个 TypedDict 类型,用于定义字典类型的结构。

TypedDict 类型通过在字典的键和值之间建立关联,并在类型注释中指定它们的类型,以提供更严格的类型检查。例如,可以使用 TypedDict 类型定义一个表示人的字典,其中包含姓名和年龄:

from typing_extensions import TypedDict

class Person(TypedDict):

    name: str

    age: int

使用 TypedDict 类型时,可以将类型注释添加到字典类的定义中,以指定键的类型和值的类型。在上面的例子中,键 "name" 的类型为 str,键 "age" 的类型为 int。

使用 TypedDict 类型定义的字典类型可以像普通字典一样使用,但是在类型检查期间会比普通字典更严格。例如,如果尝试将错误类型的值赋给 "name" 或 "age",类型检查器将会报错。

以下是一个使用 TypedDict 类型定义的字典实例的示例:

def create_person(name: str, age: int) -> Person:

    return {

        'name': name,

        'age': age

    }

person = create_person("John", 25)

在上述示例中,create_person 函数接受一个字符串参数 name 和一个整数参数 age,并返回一个符合 Person 类型的字典。在创建和返回字典时,类型检查器将验证键的类型和值的类型是否与定义的 Person 类型匹配。

此外,TypedDict 类型还允许指定一些键是可选的,也就是说,可以在字典中省略这些键。要实现此功能,可以在键的类型注释中使用 Union 类型,并将其与 None 类型相结合。例如,以下是一个定义了可选键的 Person 字典类型的示例:

from typing import Union

class Person(TypedDict):

    name: str

    age: int

    address: Union[str, None]

在上述示例中,键 "address" 是一个可选的键,可以是字符串类型或 None 类型。这意味着在创建符合 Person 类型的字典时,可以选择不指定键 "address" 或将其赋值为字符串或 None。

以下是一个使用定义了可选键的 Person 字典类型的示例:

def create_person(name: str, age: int, address: Union[str, None] = None) -> Person:

    person: Person = {

        'name': name,

        'age': age

    }

    if address is not None:

        person['address'] = address

    return person

person1 = create_person("John", 25) 

# 在此示例中,address 键将被忽略

person2 = create_person("Jane", 30, "123 Street")

在上述示例中,create_person 函数接受一个必需的字符串参数 name 和一个必需的整数参数 age,还接受一个可选的字符串参数 address,默认值为 None。根据传递给函数的参数,函数将创建符合 Person 类型的字典,并根据 address 参数确定是否包含键 "address"。

总之,使用 typing_extensions 模块的 TypedDict 类型,可以为字典定义严格的类型注释,包括可选键。这有助于提供更强大的类型检查,并在开发过程中减少潜在的类型错误。