typing库学习

This module provides runtime support for type hints。

 

下面的函数接收与返回的都是字符串,注解方式如下:

def greeting(name: str) -> str:
    return name

greeting 函数中,参数 name 的类型是 str,返回类型也是 str

其实是提示,并没有强制报错:不过有了类型注解,一些 IDE 是可以识别出来并提示的,比如 PyCharm 就可以识别出来在调用某个方法的时候参数类型不一致

复杂结构

对于一些结构的数据类型就不能用上述简单的方法表示了,比如:

names: list = ['lily', 'tom']
version: tuple = (6, 6, 6)
operations: dict = {'sad': False, 'happy': True}

以上虽然定义了最外层的数据结构,如列表、元组、字典,但他们每个元素的类型是什么也没有定义清楚,因此需要在 typing 库的帮助下来定义准确内部的结构:

from typing import List, Tuple, Dict

names: List[str] = ['lily', 'tom']
version: Tuple[int, int, int] = (6, 6, 6)   # 仅有元祖类型支持,List不支持多个  List[int, int, int]汇报错
operations: Dict[str, bool] = {'sad': False, 'happy': True}

自定义:NewType

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

Any 类型

Any 是一种特殊的类型。静态类型检查器认为所有类型均与 Any 兼容,同样,Any 也与所有类型兼容。

也就是说,可对 Any 类型的值执行任何操作或方法调用,并赋值给任意变量

标记没有返回值的函数的特殊类型

from typing import NoReturn

def stop() -> NoReturn:
    raise RuntimeError('no way')

用于显式声明 类型别名 的特殊标注

from typing import TypeAlias

Factors: TypeAlias = list[int]
name_list: Factors = [1,2,3,4]

元祖类型(支持[])

from typing import List, Tuple, Dict, NewType

user: Tuple[str, int] = ('fanjiexiong', 27)

 

二选一类型

from typing import List, Tuple, Dict, NewType, Union

user: Tuple[Union[str, int], int] = ('fanjiexiong', 27)
user1: Tuple[Union[str, int], int] = (22, 27)

可选类型

from typing import Optional


def foo(arg: Optional[int] = None) -> None:  # arg为可选参数且仅为int型
    return None

print(foo())
print(foo(1))
print(foo('1'))

 

 

 

常见的几种嵌套类型:

列表

例如,让我们来定义一个由 str 组成的 list 变量。

从 typing 模块导入 List(注意是大写的 L):

from typing import List


def process_items(items: List[str]):
    for item in items:
        print(item)

同样以冒号(:)来声明这个变量。

输入 List 作为类型。

由于列表是带有"子类型"的类型,所以我们把子类型放在方括号中:

from typing import List


def process_items(items: List[str]):
    for item in items:
        print(item)

这表示:"变量 items 是一个 list,并且这个列表里的每一个元素都是 str"。

这样,即使在处理列表中的元素时,你的编辑器也可以提供支持。

没有类型,几乎是不可能实现下面这样:

注意,变量 item 是列表 items 中的元素之一。

而且,编辑器仍然知道它是一个 str,并为此提供了支持。

元组和集合

声明 tuple 和 set 的方法也是一样的:

from typing import Set, Tuple


def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
    return items_t, items_s

 

这表示:

  • 变量 items_t 是一个 tuple,其中的每个元素都是 int 类型。
  • 变量 items_s 是一个 set,其中的每个元素都是 bytes 类型。

字典

定义 dict 时,需要传入两个子类型,用逗号进行分隔。

第一个子类型声明 dict 的所有键。

第二个子类型声明 dict 的所有值:

from typing import Dict


def process_items(prices: Dict[str, float]):
    for item_name, item_price in prices.items():
        print(item_name)
        print(item_price)

这表示:

  • 变量 prices 是一个 dict
    • 这个 dict 的所有键为 str 类型(可以看作是字典内每个元素的名称)。
    • 这个 dict 的所有值为 float 类型(可以看作是字典内每个元素的价格)。

 

参考文档:

  • https://www.gairuo.com/p/python-type-annotations
  • https://docs.python.org/zh-cn/3/library/typing.html

 

posted @ 2022-01-26 10:48  Tarzen  阅读(471)  评论(0)    收藏  举报