导入
typing 模块简介
让我们来讨论一下 typing 模块及其示例。
Python 3.5 引入了一个有趣的库,名为 typing。它为 Python 添加了类型提示功能。
类型提示 类似于声明函数的参数应具有特定类型。然而,类型提示并非强制性的,它只是提供一种建议,因此程序员仍然可以传递不合适的参数。毕竟这是 Python。我们可以在 PEP 484 中阅读类型提示规范,或者在 PEP 483 中了解其理论基础。
typing 模块的简单示例
来看一个简单的例子:
1def some_function(number: int, name: str) -> None: 2 print("%s entered %s" % (name, number)) 3 4print(some_function(13, 'Mike'))
这表示 some_function 预期接收两个参数:第一个是整数,第二个是字符串(第 1 行)。同时需要注意的是,我们还提示该函数返回 None。
带布尔返回值的示例
我们先以常规方式编写一个函数,然后再为其添加类型提示。以下示例中,函数接收一个列表和一个名字(此处为字符串),检查名字是否存在于列表中,并返回相应的布尔值。
1def process_data(my_list, name): 2 if name in my_list: 3 return True 4 else: 5 return False 6 7if __name__ == '__main__': 8 my_list = ['Mike', 'Nick', 'Toby'] 9 print(process_data(my_list, 'Mike')) 10 print(process_data(my_list, 'John'))
现在为这个函数添加类型提示:
1def process_data(my_list: list, name: str) -> bool: 2 return name in my_list 3 4if __name__ == '__main__': 5 my_list = ['Mike', 'Nick', 'Toby'] 6 print(process_data(my_list, 'Mike')) 7 print(process_data(my_list, 'John'))
在这段代码中,我们提示第一个参数是列表,第二个参数是字符串,返回值是布尔类型(第 1 行)。
使用 typing 模块的类示例
根据 PEP 484,类型提示可以使用内置类(包括标准库或第三方扩展模块定义的类)、抽象基类、types 模块中的类型,以及用户自定义的类。这意味着我们可以创建自己的类并添加类型提示。
1class Fruit: 2 def __init__(self, name, color): 3 self.name = name 4 self.color = color 5 6 7def salad(fruit_one: Fruit, fruit_two: Fruit) -> list: 8 print(fruit_one.name) 9 print(fruit_two.name) 10 return [fruit_one, fruit_two] 11 12if __name__ == '__main__': 13 f = Fruit('orange', 'orange') 14 f2 = Fruit('apple', 'red') 15 salad(f, f2)
这里我们创建了一个简单的类,然后定义了一个函数,要求传入两个该类的实例,并返回一个列表对象。
使用 typing 模块创建别名
另一个有趣的功能是可以创建类型别名。下面是一个非常简单的例子:
1Animal = str 2 3def zoo(animal: Animal, number: int) -> None: 4 print("The zoo has %s %s" % (number, animal)) 5 6if __name__ == '__main__': 7 zoo('Zebras', 10)
正如我们所猜测的,我们只是将字符串类型别名为变量 Animal。然后在函数中使用这个别名进行类型提示。