Python类型提示

304 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

介绍

  • 类型提示是Python3.6+版本加入的功能。
  • 类型提示就是在定义变量时顺便指定一个类型,比如定义一个str类型的变量name
  • 类型提示在大型工程项目中非常必要,配合静态检查、减少bug,方便团队协同开发。
  • 类型提示的使用非常简单直观。

基本使用

  • 编写一个函数:两个形参(字符串类型),一个字符串类型返回值
 # 使用方式
 get_full_name("john", "doe")    # 预期返回值 John Doe
 ​
 ​
 # 实现方式1(无类型提示)
 def get_full_name(first_name, last_name):
     full_name = first_name.title() + " " + last_name.title()
     return full_name
 ​
 # 实现方式2(类型提示)
 def get_full_name(first_name: str, last_name: str) -> str:
     full_name = first_name.title() + " " + last_name.title()
     return full_name

基本使用:

  • 在变量或形参后面加上:,后面节类型str,就好了
  • 返回值使用->箭头符号后面接返回值类型即可。

通过上面的简单例子可以看到,结合类型提示可以至少有两个好处:

  • 在IDE中编写代码时first_name.title()可以有自动补全功能,及时忘记字符串类型下面有哪些方法,点一下就有提示。
  • 可以做类型检查,比如下面代码中ageint类型,函数内就不能直接使用字符串拼接,需要修改为str(age)再做拼接,否则代码直接报错。
 def get_name_with_age(name: str, age: int) -> str:
     name_with_age = name + " is this old: " + age
     return name_with_age

类型的,如果你定义了函数的返回值,函数实际返回值的类型一定要符合定义的返回值类型。

简单类型

对于简单的基本数据类型,我们可以使用的有

  • str
  • int
  • float
  • bool
  • bytes
 def get_items(item_a: str, item_b: int, item_c: float, item_d: bool, item_e: bytes):
     return item_a, item_b, item_c, item_d, item_d, item_e

容器类型

  • 对于有容器型变量,比如列表、字典、集合等,我们可以也直接使用listdictset等,但是这样做的缺点是不能提示到内部元素的类型。此时我们一般使用内置模块typing
  • 列表:typing.List,可以定义列表内的元素类型
 from typing import List
 ​
 def process_items(items: List[str]):
     for item in items:
         print(item)
  • 字典:typing.Dict,可以定义字典的key和value的类型
 from typing import Dict
 ​
 def process_items(goods: Dict[str, float]):
     for name, price in goods.items():
         print(name, price)
  • 元组和集合:typing.Tuple, typing.Set,可定义元组的个数和类型,定义集合内元素的类型
 from typing import Set, Tuple
 ​
 def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
     return items_t, items_s
  • 可能存在多个数据类型时可以使用typing.Union,如下面的num1可以是int也可以是float
 from typing import Union
 ​
 def add(num1: typing.Union[int, float], num2: typing.Union[int, float]):
     return num1 + num2
  • 可能为空:此时使用typing.Optional
 from typing import Optional
 ​
 def get_full_name(name: Optional[str]) -> str:
     return name or ""
 ​
 # 或者使用 typing.Union[str, None],即Optional是此时Union的简化使用方式

类作为类型

我们自定通过关键字class定义的类可以作为类实例化对象的类型

 class Person:
     def __init__(self, name: str):
         self.name = name
 ​
         
 def get_person_name(one_person: Person) -> str:
     return one_person.name
 ​
 ​
 jack = Person("jack")
 print(get_person_name(jack))

补充

  • 对于嵌套数据类型,我们使用typing模块是可以支持任意格式的嵌套。
  • 使用typing模块可以定义函数、方法、可调用对象等等任何数据类型。
  • Python10以后,对于像容器类型和可能存在多个数据类型的支持更加简单