如何检查 Python 字典是否仅包含特定类型

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Python 字典的键和值是否仅包含特定类型。本实验重点在于理解字典中类型检查对于确保数据完整性的重要性。

你将从创建一个示例字典并探索类型检查的概念开始。然后,你将学习如何结合使用 isinstance() 函数和 all() 函数来验证字典中的所有键和值是否符合预期的数据类型。通过这个实践经验,你将掌握验证字典内容和维护代码可靠性的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/DataStructuresGroup -.-> python/dictionaries("Dictionaries") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") subgraph Lab Skills python/variables_data_types -.-> lab-559505{{"如何检查 Python 字典是否仅包含特定类型"}} python/type_conversion -.-> lab-559505{{"如何检查 Python 字典是否仅包含特定类型"}} python/conditional_statements -.-> lab-559505{{"如何检查 Python 字典是否仅包含特定类型"}} python/dictionaries -.-> lab-559505{{"如何检查 Python 字典是否仅包含特定类型"}} python/build_in_functions -.-> lab-559505{{"如何检查 Python 字典是否仅包含特定类型"}} end

理解字典中的类型检查

在这一步中,我们将探讨在 Python 字典中进行类型检查的重要性。字典是一种通用的数据结构,可以存储键值对。然而,为了确保代码的完整性和可靠性,了解如何检查字典中存储的键和值的类型至关重要。

Python 中的字典使用花括号 {} 来定义。字典中的每个元素由一个键和一个对应的值组成,键和值之间用冒号 : 分隔。

让我们从创建一个简单的字典开始:

## Create a dictionary
my_dict = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

print(my_dict)

将上述代码保存到 ~/project 目录下一个名为 type_checking.py 的文件中。你可以使用 VS Code 编辑器来创建和编辑这个文件。

现在,在终端中使用以下命令执行脚本:

python ~/project/type_checking.py

你应该会看到以下输出:

{'name': 'Alice', 'age': 30, 'city': 'New York'}

在这个字典中,键是字符串("name""age""city"),值分别是一个字符串("Alice")、一个整数(30)和另一个字符串("New York")。

当你希望确保字典中存储的数据符合你的预期时,类型检查就变得很重要。例如,你可能想验证年龄始终是一个整数,或者姓名始终是一个字符串。

让我们考虑这样一个场景:你想向字典中添加一个新的键值对,但你希望确保该值是特定类型。

在 VS Code 中打开 type_checking.py 文件,并按如下方式修改:

## Create a dictionary
my_dict = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

## Function to add a key-value pair with type checking
def add_item(dictionary, key, value, expected_type):
    if isinstance(value, expected_type):
        dictionary[key] = value
        print(f"Added {key}: {value} to the dictionary.")
    else:
        print(f"Error: {key} must be of type {expected_type.__name__}.")

## Example usage
add_item(my_dict, "occupation", "Engineer", str)
add_item(my_dict, "salary", 75000, int)
add_item(my_dict, "is_active", True, bool)
add_item(my_dict, "height", "5.8", float) ## Intentionally incorrect type

print(my_dict)

在这段代码中,我们定义了一个 add_item 函数,它接受一个字典、一个键、一个值和一个预期类型作为输入。该函数使用 isinstance() 函数来检查值是否为预期类型。如果是,则将键值对添加到字典中;否则,打印一条错误消息。

再次执行脚本:

python ~/project/type_checking.py

你应该会看到以下输出:

Added occupation: Engineer to the dictionary.
Added salary: 75000 to the dictionary.
Added is_active: True to the dictionary.
Error: height must be of type float.
{'name': 'Alice', 'age': 30, 'city': 'New York', 'occupation': 'Engineer', 'salary': 75000, 'is_active': True}

如你所见,add_item 函数成功地将 "occupation"、"salary" 和 "is_active" 键值对添加到了字典中,因为它们的值与预期类型匹配。然而,对于 "height",它打印了一条错误消息,因为提供的值("5.8")是一个字符串,而预期类型是 float

这个示例展示了字典中类型检查的基本概念。在接下来的步骤中,我们将探索更多在 Python 代码中确保类型安全的高级技术。

检查键和值的类型

在上一步中,我们学习了在向字典中添加值时如何检查值的类型。现在,让我们深入探究如何检查字典中键和值的类型。

确保字典中的键是不可变类型(如字符串、数字或元组)至关重要。而值可以是任何类型。让我们修改 type_checking.py 文件,以包含键类型检查。

在 VS Code 中打开 type_checking.py 文件,并按如下方式修改:

## Create a dictionary
my_dict = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

## Function to add a key-value pair with type checking for both key and value
def add_item(dictionary, key, value, expected_key_type, expected_value_type):
    if not isinstance(key, expected_key_type):
        print(f"Error: Key must be of type {expected_key_type.__name__}.")
        return
    if not isinstance(value, expected_value_type):
        print(f"Error: Value must be of type {expected_value_type.__name__}.")
        return
    dictionary[key] = value
    print(f"Added {key}: {value} to the dictionary.")

## Example usage
add_item(my_dict, "occupation", "Engineer", str, str)
add_item(my_dict, "salary", 75000, str, int)
add_item(my_dict, 123, "Some Value", str, str) ## Intentionally incorrect key type

print(my_dict)

在这段更新后的代码中,add_item 函数现在接受 expected_key_typeexpected_value_type 作为参数。它使用 isinstance() 检查提供的键和值是否为预期类型。如果键或值的类型不正确,将打印一条错误消息,并且函数会在不将该条目添加到字典的情况下返回。

现在,执行脚本:

python ~/project/type_checking.py

你应该会看到以下输出:

Added occupation: Engineer to the dictionary.
Added salary: 75000 to the dictionary.
Error: Key must be of type str.
{'name': 'Alice', 'age': 30, 'city': 'New York', 'occupation': 'Engineer', 'salary': 75000}

输出显示,"occupation" 和 "salary" 键值对已成功添加到字典中,因为它们的键和值都与预期类型匹配。然而,当我们尝试添加一个键为整数(123)的键值对时,函数打印了一条错误消息,因为预期的键类型是 str

检查键和值的类型有助于维护数据的一致性和正确性。它可以防止意外错误,并确保字典按预期运行。

结合使用 all()isinstance()

在这一步中,我们将探讨如何结合使用 all() 函数和 isinstance() 函数,以高效地检查字典中所有键和值的类型。当你需要根据一组预期类型验证整个字典时,这种方法特别有用。

Python 中的 all() 函数会在可迭代对象中的所有元素都为真时返回 True。我们可以使用这个函数遍历字典,检查所有键和值是否与预期类型匹配。

让我们修改 type_checking.py 文件以采用这种方法。

在 VS Code 中打开 type_checking.py 文件,并按如下方式修改:

## Create a dictionary
my_dict = {
    "name": "Alice",
    "age": 30,
    "city": "New York"
}

## Function to check types of all keys and values in a dictionary
def check_dictionary_types(dictionary, expected_key_type, expected_value_type):
    key_types_correct = all(isinstance(key, expected_key_type) for key in dictionary)
    value_types_correct = all(isinstance(value, expected_value_type) for value in dictionary.values())

    if key_types_correct and value_types_correct:
        print("All keys and values have the correct types.")
        return True
    else:
        print("Not all keys and values have the correct types.")
        return False

## Example usage
check_dictionary_types(my_dict, str, (str, int)) ## Expecting keys to be strings and values to be either strings or integers

my_dict["zip"] = "10001"
check_dictionary_types(my_dict, str, (str, int))

my_dict["country"] = 123
check_dictionary_types(my_dict, str, (str, int))

在这段代码中,check_dictionary_types 函数接受一个字典、一个预期的键类型和一个预期的值类型作为输入。它使用 all() 函数和生成器表达式来检查所有键是否为预期类型,以及所有值是否为预期类型。如果两个条件都为真,它会打印一条成功消息并返回 True;否则,它会打印一条错误消息并返回 False

执行脚本:

python ~/project/type_checking.py

你应该会看到以下输出:

All keys and values have the correct types.
All keys and values have the correct types.
Not all keys and values have the correct types.

第一次调用 check_dictionary_types 返回 True,因为所有键都是字符串,所有值要么是字符串,要么是整数。在添加 "zip" 键后,第二次调用也返回 True。然而,在添加值为整数的 "country" 键后,第三次调用返回 False,因为现在有一个键是整数,违反了预期的键类型。

结合使用 all()isinstance() 提供了一种简洁而高效的方式来验证字典中所有元素的类型,确保数据的完整性,并防止 Python 代码中出现意外错误。

总结

在本次实验中,我们首先了解了在 Python 字典(一种用于存储键值对的通用数据结构)中进行类型检查的重要性。我们创建了一个示例字典,其中包含字符串键和混合类型的值(字符串和整数),并强调了通过验证键和值的类型来确保数据完整性的必要性。

第一步着重强调了类型检查的重要性,以确保字典中存储的数据符合预期类型,例如验证年龄始终为整数,或者姓名始终为字符串。实验设置包括创建一个 type_checking.py 文件并执行它,以显示字典的内容。