函数标注
通过Python 3的PEP 3107引入的,函数参数和返回值都可以使用标注。用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。:和类型之间,->和类型之间有一个半角空格。
例如:
1
2
3
4
5
6
7
8
9
10
11
12
|
#定义未使用标注函数add_no_annotation
def add_no_annotation(x,y):
return x + y
#定义使用标注函数add_annotation
def add_annotation(x: int, y: int) -> int:
return x + y
result1 = add_no_annotation(3,5)
result2 = add_annotation(3,5)
print(result1) # 输出8
print(result2) # 输出8
|
然后特别要强调的是,Python并不会因为这些标注而提供额外的校验,没有任何的类型检查工作。也就是说,加了类型标注,也不会对参数和函数返回值进行类型判断。
例如:
1
2
3
4
5
6
7
8
|
#定义使用标注函数add_annotation
def add_annotation(x: int, y: int) -> int:
return x + y
result1 = add_annotation(3,5)
result2 = add_annotation("Hello ","World") #虽然标注写的是int类型,字符串类型也是可以的
print(result1) #输出8
print(result2) #输出Hello World
|
但这么做的好处是:
让别的程序员看得更明白。让IDE了解类型,从而提供更准确的代码提示、补全和语法检查。
在函数的annotations属性中会有你设定的标注。annotations属性是字典对象。
例如:
1
2
3
4
5
6
7
|
#定义使用标注函数add_annotation
def add_annotation(x: int, y: int) -> int:
return x + y
s = add_annotation.__annotations__
print(type(s))
print(s)
|
执行以上程序会输出如下结果:
1
2
|
<class 'dict'>
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
|
带有参数默认值的标注函数
我们知道函数参数还可以有默认值,当然,默认值的参数也可以标注。
例如:
1
2
3
4
5
6
7
8
9
10
11
|
#定义使用标注函数add_annotation
def add_annotation(x: int=10, y:int=5) -> int:
return x + y
print(add_annotation()) # 没有传递参数,使用默认的参数10和5,结果是15
print(add_annotation(15)) # 仅传递了参数x,使用y默认的参数5,结果是20
print(add_annotation(15,20)) # 结果是35
s = add_annotation.__annotations__
print(type(s))
print(s)
|
执行以上程序会输出如下结果:
1
2
3
4
5
|
15
20
35
<class 'dict'>
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
|
变量标注
通过Python 3.6的PEP 526,又引入了对变量类型进行标注的方法,包括类变量和实例变量。用 : 类型 的形式指定变量的类型。:和类型之间有一个半角空格。
例如:
1
2
|
a: int = 123 # 声明初始值是123,int类型的变量a
b: str = 'hello' # 声明初始值是hello,str类型的变量b
|
变量标注和初始值可以分别进行。
例如:
1
2
3
4
5
6
7
|
a: int # 声明int类型的变量a
a = 123 # 初始值是123
b: str # 声明strt类型的变量b
b = 'hello' # 初始值是'hello'
print(a) # 输出123
print(b) # 输出hello
|
更进一步,如果你需要指明一个全部由整数组成的列表:
例如:
1
2
|
from typing import List
l: List[int] = [1, 2, 3]
|
同函数标注一样,虽然是强制变量类型,在运行时也不会对其进行类型检查判断。需要注意的是,在IDE编辑器中,有标注的变量,最好初始化成和标注声明的类型,要不然编辑器会报错。但是运行起来的话,不受影响。
例如:
1
2
3
4
5
6
7
|
a: int # 声明int类型的变量a
a = 'world' # 初始值是world
b: str # 声明strt类型的变量b
b = 'hello' # 初始值是'hello'
print(a) # 输出world,不受标注类型int的影响。
print(b) # 输出hello
|
在函数的annotations属性中会有你设定的标注。annotations属性是字典对象。
类变量标注和实例变量标注
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Student:
name: str = "Student" #实例变量标注
def __init__(self,age,score):
self.age = age
self.score = score
s = Student(20,80.5)
s.weight: float = 50.5
cls = Student.__annotations__
instance =s.__annotations__
print(type(cls))
print(cls)
print(type(instance))
print(instance)
|
执行以上程序会输出如下结果:
1
2
3
4
|
<class 'dict'>
{'name': <class 'str'>}
<class 'dict'>
{'name': <class 'str'>}
|
转载请注明本网址。