4.0 KiB
Python 3 -类型提示介绍
原文:https://www.blog.pythonlibrary.org/2016/01/19/python-3-an-intro-to-type-hinting/
Python 3.5 增加了一个有趣的新库,叫做 typing 。这给 Python 增加了类型提示。类型提示就是声明你的函数参数具有某种类型。但是,类型提示没有绑定。这只是一个提示,所以没有什么可以阻止程序员传递他们不应该传递的东西。这毕竟是 Python。你可以在 PEP 484 中阅读类型提示规范,或者你可以在 PEP 483 中阅读其背后的理论。
让我们看一个简单的例子:
>>> def some_function(number: int, name: str) -> None:
print("%s entered %s" % (name, number))
>>> some_function(13, 'Mike')
Mike entered 13
这意味着 some_function 需要两个参数,第一个是整数,第二个是字符串。还需要注意的是,我们已经暗示过这个函数不返回任何值。
让我们后退一点,用正常的方法写一个函数。然后我们将添加类型提示。在下面的例子中,我们有一个接受 list 和 name 的函数,在这个例子中是一个字符串。它所做的只是检查名字是否在列表中,并返回一个适当的布尔值。
def process_data(my_list, name):
if name in my_list:
return True
else:
return False
if __name__ == '__main__':
my_list = ['Mike', 'Nick', 'Toby']
print( process_data(my_list, 'Mike') )
print( process_data(my_list, 'John') )
现在让我们给这个函数添加类型提示:
def process_data(my_list: list, name: str) -> bool:
return name in my_list
if __name__ == '__main__':
my_list = ['Mike', 'Nick', 'Toby']
print( process_data(my_list, 'Mike') )
print( process_data(my_list, 'John') )
在这段代码中,我们暗示第一个参数是一个列表,第二个参数是一个字符串,返回值是一个布尔值。
根据 PEP 484,“类型提示可以是内置类(包括标准库或第三方扩展模块中定义的类)、抽象基类、类型模块中可用的类型以及用户定义的类”。这意味着我们可以创建自己的类并添加一个提示。
class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color
def salad(fruit_one: Fruit, fruit_two: Fruit) -> list:
print(fruit_one.name)
print(fruit_two.name)
return [fruit_one, fruit_two]
if __name__ == '__main__':
f = Fruit('orange', 'orange')
f2 = Fruit('apple', 'red')
salad(f, f2)
这里我们创建了一个简单的类,然后创建了一个函数,该函数需要该类的两个实例并返回一个列表对象。另一个我认为有趣的话题是你可以创建一个别名。这里有一个超级简单的例子:
Animal = str
def zoo(animal: Animal, number: int) -> None:
print("The zoo has %s %s" % (number, animal))
if __name__ == '__main__':
zoo('Zebras', 10)
您可能已经猜到了,我们只是用变量动物作为字符串类型的别名。然后,我们使用动物别名向我们的函数添加了一个提示。
包扎
当我第一次听说类型暗示时,我很感兴趣。这是一个很好的概念,我肯定能看到它的用途。我想到的第一个用例就是自我记录你的代码。我工作过太多的代码库,在那里很难判断一个函数或类接受什么,虽然类型提示不强制任何东西,但它肯定会使一些模糊的代码变得清晰。如果一些 Python IDEs 添加了一个可选标志,可以检查代码的类型提示,并确保正确调用代码,那就太好了。
我强烈建议查看官方文档,因为那里有更多的信息。pep 也包含了很多好的细节。开心快乐编码!