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' > }
到目前为止,我们只讨论了诸如 int
、float
和 str
之类的原始数据类型。
现在让我们了解如何为诸如 list
、tuple
、set
、list
对象等复杂数据类型编写注解表达式。为此,我们将使用 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
模块有 List
、Tuple
和 Set
分别对应 list
、tuple
和 set
的类,它们充当它们的通用版本。除了这三个之外,还有其他泛型类,例如 Dict
、FrozenSet
、DefaultDict
和 OrderedDict
。
这些泛型类可用于为变量提供注解表达式。在这些类旁边,在 []
括号内放置原始数据类型、字符串描述、类或来自同一模块的其他通用类。
请注意,它们可用于为函数提供表达式,我们稍后会学习。要了解 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()
函数接受三个值,即 name
、age
和 hobbies
,并返回一个字典或 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
是字典中的键。对于参数,参数名称是关键。