Python类型提示入门类型与事物的名称无关,而是与事物本身相关联。这使得Python语言对开发人员来说灵活方便,因为如果您只是想编写一个快速且不合逻辑的脚本,则不必严格定义和跟踪变量类型。但对于较大的项目,尤其是第三方使用的库,了解哪些对象类型与哪些变量相关联会很有帮助。一段时间以来,Python已经能够以某种形式使用类型信息“注释”名称。在Python3.5中,类型提示正式成为语言的一部分(PEP484)。使用linters或代码检查工具,开发人员可以检查变量及其类型以确保跨代码库的一致性,并对以前难以或不可能执行的代码执行静态分析。所有这些都是在代码运行之前提前完成的。在本文中,我们将探索Python类型提示的一些基本示例。但首先,我们要介绍一个关于什么是Python类型提示及其用途的常见误解。Python如何使用类型提示关于Python类型提示的一个主要误解是如何使用它们。运行时不使用Python类型提示。实际上,您提供的所有类型信息在程序运行时都会被删除。Python类型提示仅被使用中的类型检查系统抢占(例如在编辑器或IDE中)。换句话说,Python的类型提示是针对开发人员的,而不是运行时。这听起来可能违反直觉,尤其是对于使用过类型声明不是可选的语言的开发人员而言。但是Python开发团队已经明确表示,类型提示并不是核心Python语言变成静态类型的征兆。它们是开发人员向代码库添加元数据以便在开发过程中更轻松地执行静态分析的一种方式。一些人推测Python类型提示可能会导致语言的静态类型分支,这可能是使Python更快的一种方式。在某些方面,这种猜测得到了证实。Cython使用类型提示(尽管主要是它自己的特殊类型)从Python生成C代码,而mypyc项目使用Python的本机类型提示来执行相同的操作。然而,这些项目更恰当地被认为是对核心Python语言的补充,而不是Python方向的标志。Python中类型提示的主要目的是为开发人员提供一种方法,使他们的代码尽可能自描述,这既是为了他们自己的利益,也是为了其他开发人员的利益。Python类型提示的语法Python中的类型提示在第一次调用命名空间中的名称后涉及冒号和类型声明。例如:name:strage:intname=input("Yourname?")age=int(input("Yourage?"))类型提示name和age的第一个声明确保将来在这个命名空间中使用这些名称将被检查针对这些类型。例如,这段代码将不起作用:name:intage:intname=input("Yourname?")age=int(input("Yourage?"))因为我们已经将name声明为一个int,而input返回一个字符串默认情况下,类型检查员将无法找到它。Python类型检查系统将尽可能地推断类型。例如,假设我们使用了以下代码,但没有前面的类型声明:name=input("Yourname?")age=int(input("Yourage?"))在这种情况下,类型检查器可以推断该名称是一个字符串(因为input()不返回任何其他内容),而age是一个int(因为int()不返回任何其他内容)。TypeHintingPythonFunctionsPython函数也可以进行类型提示,以便它们接受和返回的值被提前记录下来。例如,以下代码:greeting="Hello,{},you're{}yearsold"defgreet(user,age):returngreeting.format(user,age)name=input("Yourname?")age=int(input("Howoldareyou?"))print(greet(name,age))这段代码中的一个歧义是greet()理论上可以接受任何类型的用户和年龄,并且可以返回任何类型。以下是我们如何使用类型提示来消除歧义:greeting="Hello,{},you're{}yearsold"defgreet(user:str,age:int)->str:returngreeting.format(user,age)name=input("Yourname?")age=int(input("Howoldareyou?"))print(greet(name,age))给定greet()的这些类型提示,当你在代码中插入对greet()的调用时,小编可以提前告诉你接受哪些类型的greet()。此外,有时Python可以自动推断函数返回的类型,但如果您对函数使用类型提示,最好提示有关它的所有内容——它接受什么类型以及它返回什么类型。类型提示容器对象列表、字典和元组等对象包含其他对象,因此我们需要类型提示来指示它们包含什么类型的对象。为此,我们需要求助于Python的typing模块,它提供了描述这些东西将拥有的类型的工具。fromtypingimportDict,Listdict_of_users:Dict[int,str]={1:"Jerome",2:"Lewis"}list_of_users:List[str]=["Jerome","Lewis"]字典由键和值组成,可以是不同的类型。您可以通过将字典作为列表提供给typing.Dict来描述字典的类型。也可以通过将类型提供给typing.List来描述列表的对象类型。某些Optional和Union类型的对象可能包含两种不同类型之一的对象。在这些情况下,可以使用Union或Optional。使用Union表示对象可以是几种类型之一,使用Optional表示对象是给定类型之一还是没有。例如:fromtypingimportDict,Optional,Uniondict_of_users:Dict[int,Union[int,str]]={1:"Jerome",2:"Lewis",3:32}user_id:Optional[int]user_id=None#validuser_id=3#alsovalduser_id="你好"#notvalid!在此示例中,我们有一个以int为键但以int或str为值的字典。user_id变量(我们可以用它来与字典键进行比较)可以是int或None(“无有效用户”),而不是str。类型提示和类要为类提供类型提示,只需引用与任何其他类型相同的名称:fromtypingimportDictclassUser:def__init__(self,name):self.name=nameusers:Dict[int,User]={1:User("Serdar"),2:User("Davis")}definspect_user(user:User)->None:print(user.name)user1=users[1]inspect_user(user1)注意inspect_user()的返回类型是None,因为它只打印输出并且不返回任何内容。(另外,我们通常会把这样的函数做成一个类的方法,但在这种情况下会单独说明。)在对自定义对象使用类型提示时,我们有时需要为尚未定义的对象提供类型提示.在这种情况下,您可以使用字符串来提供对象名称:self,owner:User,address_line:str):self.owner=ownerself.address_line=address_line【翻译请注明原文译者及出处为.com,合作站点转载】
