Python 中的注解

Vaibhav Vaibhav 2023年1月30日 2022年5月17日
  1. Python 中的变量注解
  2. Python 中的函数注解
Python 中的注解

Python 是一种健壮的动态类型编程语言。它具有类似于编写简单英语的简单语法,并得到大量库和功能的支持。

一个这样的特征是注解。注解是任意 Python 表达式,它授予有关变量数据类型、函数参数和函数返回类型的提示。

注解旨在提高源代码的可读性和理解力,并由第三方库解释以提供有效且省时的服务,例如语法提示、数据类型检查、IDE 中的数据类型提示或集成开发环境自动完成代码,以及自动化或人工智能驱动的文档生成。

Python 中有两种类型的注解:函数注解和变量注解。在本文中,我们将借助相关示例来讨论 Python 中的两种注解类型。

Python 中的变量注解

变量注解是旨在提供有关 Python 中变量数据类型的详细信息的表达式。变量注解具有以下语法。

<variable>: <expression> = <initial value>

注解表达式写在变量名和它的初始值之间,以冒号或:为前缀。让我们看一些例子来更好地理解这一点。请参考以下 Python 代码。

name: str = "Vaibhav"
age: int = 20
language: str = "Python"
student: bool = True
height: float = 5.9
print("name:", name)
print("age:", age)
print("language:", language)
print("student:", student)
print("height:", height)

输出:

name: Vaibhav
age: 20
language: Python
student: True
height: 5.9

在上面的示例中,我们使用内置的 Python 数据类型来表示表达式。我们还可以使用字符串并提供变量的详细和简短描述。

下面的 Python 代码描述了这一点。

name: "Name of the person" = "Vaibhav"
age: "Age of the person" = 20
language: "Favorite programming language of the person" = "Python"
student: "Is the person a student?" = True
height: "Height of the person in feet" = 5.9
print("name:", name)
print("age:", age)
print("language:", language)
print("student:", student)
print("height:", height)

输出:

name: Vaibhav
age: 20
language: Python
student: True
height: 5.9

我们可以使用 __annotations___ 属性来访问所有注解。

该属性是一个字典,其中键是变量,值是注解表达式。请注意,此属性将仅提供有关变量而不是函数的详细信息。

请参阅以下 Python 代码。

name: "Name of the person" = "Vaibhav"
age: "Age of the person" = 20
language: "Favorite programming language of the person" = "Python"
student: "Is the person a student?" = True
height: "Height of the person in feet" = 5.9
print(__annotations__)

输出:

{'name': 'Name of the person', 'age': 'Age of the person', 'language': 'Favorite programming language of the person', 'student': 'Is the person a student?', 'height': 'Height of the person in feet'}

对于第一个示例,输出将如下所示。

{'name': <class 'str'>, 'age': <class 'int'>, 'language': <class 'str'>, 'student': <class 'bool'>, 'height': <class 'float'>}

到目前为止,我们只讨论了诸如 intfloatstr 之类的原始数据类型。

现在让我们了解如何为诸如 listtuplesetlist 对象等复杂数据类型编写注解表达式。为此,我们将使用 typing 模块。

typing 模块是 Python 标准库的一部分。让我们通过示例了解如何将其用于复杂的数据类型。

请参阅以下 Python 代码。

from typing import List, Tuple, Set

def user():
    return {
        "name": "Vaibhav",
        "username": "vaibhav",
        "password": "vaibhav"
    }

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

middlewares: List[str] = []
points: Tuple[Point] = tuple([Point(0, 0), Point(1, 1)])
numbers: Set[int] = set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
users: List[dict] = [user()]
utils: List["function"] = [sum, len, sorted]
pairs: List[List[int]] = [[1, 2], [2, 3], [3, 4]]
print("middlewares:", middlewares, end = "\n\n")
print("points:", points, end = "\n\n")
print("numbers:", numbers, end = "\n\n")
print("utils:", utils, end = "\n\n")
print("users:", users, end = "\n\n")
print("pairs:", pairs, end = "\n\n")
print(__annotations__)

输出:

middlewares: []

points: (<__main__.Point object at 0x7fc658e454c0>, <__main__.Point object at 0x7fc658cef610>)

numbers: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

utils: [<built-in function sum>, <built-in function len>, <built-in function sorted>]

users: [{'name': 'Vaibhav', 'username': 'vaibhav', 'password': 'vaibhav'}]

pairs: [[1, 2], [2, 3], [3, 4]]

{'middlewares': typing.List[str], 'points': typing.Tuple[__main__.Point], 'numbers': typing.Set[int], 'users': typing.List[dict], 'utils': typing.List[ForwardRef('function')], 'pairs': typing.List[typing.List[int]]}

typing 模块有 ListTupleSet 分别对应 listtupleset 的类,它们充当它们的通用版本。除了这三个之外,还有其他泛型类,例如 DictFrozenSetDefaultDictOrderedDict

这些泛型类可用于为变量提供注解表达式。在这些类旁边,在 [] 括号内放置原始数据类型、字符串描述、类或来自同一模块的其他通用类。

请注意,它们可用于为函数提供表达式,我们稍后会学习。要了解 typing 模块,请参阅官方文档此处

Python 中的函数注解

函数注解是旨在提供有关 Python 中函数参数数据类型和函数返回值数据类型的详细信息的表达式。函数注解具有以下语法。

def function(<parameter>: <expression>, <parameter>: <expression> = <default value>) -> <expression>:

注解表达式放置在由冒号或 : 分隔的参数旁边。

如果有任何默认值,则将它们放在注解表达式之后。对于函数的返回类型,函数签名后跟一个 -> 或箭头和注解表达式。

请注意,冒号放在最后。让我们借助一些相关示例来理解函数注解。

请参阅以下 Python 代码。

from typing import List, Tuple

def create_user(name: str, age: int, hobbies: List[str] = []) -> dict:
    return {
        "name": name,
        "age": age,
        "hobbies": hobbies
    }
    
def create_users(users: List[Tuple]) -> List[dict]:
    result = []
    
    for user in users:
        result.append(create_user(name = user[0], age = user[1], hobbies = user[2]))    
        
    return result
    
u1: dict = create_user("Vaibhav", 20, ["Football", "Video Games"])
data = [
    ("Rick", 40, ["Shooting"]),
    ("Derly", 38, ["Archery", "Tracking"]),
    ("Maggie", 25, []),
    ("Carol", 32, ["Cooking"]),
]
users: List[dict] = create_users(data)
print(u1)
print(users)
print(__annotations__)

输出:

{'name': 'Vaibhav', 'age': 20, 'hobbies': ['Football', 'Video Games']}
[{'name': 'Rick', 'age': 40, 'hobbies': ['Shooting']}, {'name': 'Derly', 'age': 38, 'hobbies': ['Archery', 'Tracking']}, {'name': 'Maggie', 'age': 25, 'hobbies': []}, {'name': 'Carol', 'age': 32, 'hobbies': ['Cooking']}]
{'u1': <class 'dict'>, 'users': typing.List[dict]}

正如我们所见,create_user() 函数接受三个值,即 nameagehobbies,并返回一个字典或 dict

create_users() 方法接受表示用户列表的元组列表。此方法返回字典列表。

create_user() 方法的方法调用的结果存储在变量 u1 中,该变量是 dict 类型。并且,对 create_users() 方法的函数调用的结果存储在变量 users 中,该变量的类型为 List[dict]

__annotations__ 属性只会提供有关变量的详细信息。要获取有关函数的注解详细信息,我们可以使用 __annotations__ 属性。

下面的 Python 代码描述了这一点。

from typing import List, Tuple

def create_user(name: str, age: int, hobbies: List[str] = []) -> dict:
    return {
        "name": name,
        "age": age,
        "hobbies": hobbies
    }
    
def create_users(users: List[Tuple]) -> List[dict]:
    result = []
    
    for user in users:
        result.append(create_user(name = user[0], age = user[1], hobbies = user[2]))    
        
    return result
    
print(create_user.__annotations__)
print(create_users.__annotations__)

输出:

{'name': <class 'str'>, 'age': <class 'int'>, 'hobbies': typing.List[str], 'return': <class 'dict'>}
{'users': typing.List[typing.Tuple], 'return': typing.List[dict]}

输出字典将包含所有注解详细信息。请注意,对于返回类型,return 是字典中的键。对于参数,参数名称是关键。

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub