Python标准库typing

  • python3.5+才有
  • Python 运行时不强制执行函数和变量类型注解,但这些注解可用于类型检查器、IDE、静态检查器等第三方工具。
  • 作用
  • 类型检查,防止运行时出现参数和返回值类型不符合。(pycharm会自动联想类型)
  • 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  • 该模块加入后并不会影响程序的运行,不会报正式的错误, 只有提醒
  • 最早接触是在leetcode做题的时候看到的,后面在各种源码中广泛有看到。
  • 比如LeetCode算法第一题:两数之和,的解题模板(python3)
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
  • 比如Selenium中get方法的源码
def get(self, url: str) -> None:
"""
        Loads a web page in the current browser session.

"""
    self.execute(Command.GET, {'url': url})

变量定义

  • 示例代码
name:str
name = 'wuxianfeng'
print(name.upper())
  • PEP8中有提及,在声明变量类型时,变量后方紧跟一个冒号,冒号后面跟一个空格,再跟上变量的类型。
  • 其实我们很少这么做就是了。更多是放在函数或者方法中

函数参数(基础类型)

  • 示例代码
def greeting(name: str) -> str:
    return 'Hello ' + name
  • 声明name参数是str类型,格式是 参数名冒号类型
  • 返回对象也是str类型,格式是 ->类型,注意是一个-
  • ->先写,再写冒号!
  • 语法
参数名:类型

def 函数名(参数...) -> 类型:
  • 一个好处就是用pycharm在输入代码的时候
def func(name:str) ->None:
    print(name.)   #输入到name.的时候能自动补齐出来str类型的方法,如果不声明绝对是没有的
  • str是默认类型,你发现跟typing模块好像并没任何关系,因为这是 *基础的模块,无需导入即可使用。类似的还有int,float,bool等

函数参数默认值

  • 示例代码:Faker类的初始化方法
    def __init__(
        self,
        locale: Optional[Union[str, Sequence[str], Dict[str, Union[int, float]]]] = None,
        providers: Optional[List[str]] = None,
        generator: Optional[Generator] = None,
        includes: Optional[List[str]] = None,
        use_weighting: bool = True,
        **config: Any,
    ) -> None:
  • 语法
参数名:类型=默认值

实例: use_weighting: bool = True
  • 跟以前相比就是加了冒号和类型

高级类型List和Tuple

  • 此处的中级类型指的是List和Tuple,Dict这些
  • 示例代码:文章开头提到的leetcode第一题,两数之和
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
  • 意思是nums这个参数是一个list,其中每个元素是int类型的
  • 注意,代码模板不会显示所有的细节,其实这是需要导入的
from typing import Dict,  List,  Tuple
  • 实例代码1
from typing import List
def func(names:List[str]) -> None:
    for name in names:   #如果你输入names.,会产生列表的方法
        print(name)      #如果你输入name.,会产生字符串的方法

names = ['wuxianfeng','qianyuli']
func(names)
  • 注意上述代码跟以下代码的区别
def func1(*names):
    for name in names:
        print(name)
classes = ['c1','c2']
func1(*classes)
  • 实例代码2:多个相同类型可以用…来替代,但要注意是Tuple[]
from typing import Tuple
def func(ages: Tuple[int, ...]) -> None:
    for age in ages:
        print(age)

ages = (18, 19, 22, 34,)
func(ages)
  • 此处比较诡异的是如果我写
from typing import Tuple
def func(ages: Tuple[int,int]) -> None:
    for age in ages:
        print(age)

ages = (18, 19, 22, 34,)  #这里只能写2个值,多或者少都会警告!
func(ages)  #应为类型Tuple[int,int],实为类型Tuple[int,int,int,int]
  • 但是List却没有这个问题,后续有空查下

高级类型Dict

  • dict是key:value形式
  • 注意跟Tuple一样,都是[]的形式,不能是{}
  • 实例代码
from typing import Dict

def func(info: Dict[str, str]) -> None:
    for k, v in info.items():
        print(k)
        print(v)

nanjings = {'wuxianfeng': 'male', 'qianyuli': 'female'}
func(nanjings)

类型别名

  • 示例
from typing import List

Alias = List[int]  #这里可以是List或者list

def scale(orgin_num: int, vector: Alias) -> Alias:
    return [orgin_num * vec for vec in vector]

print(scale(2, [3,4,5]))

类型嵌套

  • 示例
from typing import List

def func(vars: List[List[int]]) -> None:
    for _ in vars:
        for __ in _:
            print(__)

func([[1, 2], [2, 3]])

可选类型Optional

  • 示例代码
from typing import Optional

def func(arg: Optional[int] = None):
    print(arg)

func()
func(1)

  • 显然你去掉=None是不行的,func()的时候会提示错误
  • Optional[int] 等价于 Union[int, None]

  • str、int、float、bool无需声明,直接用即可

  • List是list的泛型,其后紧跟一个方括号,里面代表了构成这个列表的元素类型。
age:List[int]
var: List[int or float] = [2, 3.5]
vars: List[List[int]] = [[1, 2], [2, 3]]
  • Tuple、元组,是 tuple 的泛型,其后紧跟一个方括号,方括号中按照顺序声明了构成本元组的元素类型
Tuple[X, Y] 代表了构成元组的第一个元素是 X 类型,第二个元素是 Y 类型
person: Tuple[str, int, float] = ('Mike', 22, 1.75)
  • NamedTuple,是 collections.namedtuple 的泛型,实际上就和 namedtuple 用法完全一致
  • Dict、字典,是 dict 的泛型;Mapping,映射,是 collections.abc.Mapping 的泛型。根据官方文档,Dict 推荐用于注解返回类型,Mapping 推荐用于注解参数。它们的使用方法都是一样的,其后跟一个中括号,中括号内分别声明键名、键值的类型
def size(rect: Mapping[str, int]) -> Dict[str, int]:
 return {'width': rect['width'] + 100, 'height': rect['width'] + 100}
  • MutableMapping 则是 Mapping 对象的子类,在很多库中也经常用 MutableMapping 来代替 Mapping
  • Set、集合,是 set 的泛型;AbstractSet、是 collections.abc.Set 的泛型。根据官方文档,Set 推荐用于注解返回类型,AbstractSet 用于注解参数。它们的使用方法都是一样的,其后跟一个中括号,里面声明集合中元素的类型
def describe(s: AbstractSet[int]) -> Set[int]:
 return set(s)

Original: https://www.cnblogs.com/wuxianfeng023/p/16612610.html
Author: 松勤吴老师
Title: Python标准库typing

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/602687/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python—-pathlib模块的用法

    推荐文章 很多小伙伴都发现了,用户自主「申请上首页」的按钮取消了,那博主们写的文章还有上首页曝光的机会吗?我们的回答是”当然有!!!”虽然我们取消了上首页申…

    Python 2023年5月24日
    064
  • tsak4:第二章:第四节数据可视化

    DataWhale 动手学数据分析 Task04 * – 第二章:数据可视化 – + 2.7 如何让人一眼看懂你的数据? + * 2.7.1 任务一:跟着书…

    Python 2023年8月8日
    061
  • pytest — Allure报告

    执行和生成报告: 1)在main文件中加入如下代码: 1)在main文件中加入如下代码: if __name__ == ‘__main__’: # 指定临时json文件生成位置 p…

    Python 2023年9月11日
    046
  • Flask-数据库

    Flask本身不限定数据库的选择,可以选择SQL或NOSQL的任何一种,也可以选择更方便的SQLALchemy,类似于Django的ORM。SQLALchemy实际上是对数据库的抽…

    Python 2023年8月9日
    052
  • Pandas学习(二)

    一. datetime再了解 1.pd.to_datetime(df[‘date’]).dt.date ==>得到的是含有精确到天的日期,格式为obj…

    Python 2023年8月22日
    047
  • python调用android的接口_Python写Android接口一步到位

    最近想自己写 Android 的接口,之前学过一点 Python 基础,打算用 Flask 框架实现,请看下边 一、准备 PyCharm 编译工具 Mysql 数据库 Flask …

    Python 2023年8月15日
    072
  • AIS数据下载并处理(python)

    最近由于项目需求,需要下载AIS数据,其实也就是船舶位置数据。 首先通过百度发现目前一些网站下载的AIS数据都是收费的,如船达通等等。 船达通是只能查找近一个月的船舶轨迹信息,下载…

    Python 2023年8月2日
    060
  • 13行python代码实现对微信进行推送消息

    Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息,今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具 pushplus 单人推送 实现步骤…

    Python 2023年5月23日
    068
  • 哈工大 面向服务的软件系统 实验4

    一、环境准备 1.在主节点上下载jdk8、zookeeper jdk8可以在官网下载,下载好后需要配置环境变量JAVA_HOME zookeeper自行下载,下载好后需要改data…

    Python 2023年9月17日
    030
  • 从 0 开始最详细的 ChatGPT 注册教程

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月3日
    033
  • 2023跨年代码(烟花+雪花)

    一眨眼,马上就2023年了,祝大家在新的一年里:身体健康平安,生活充实饱满,事业步步高升,心情阳光灿烂,财运滚滚而来,家庭美满幸福,新年开心快乐! 本文将给大家分享一些跨年代码,基…

    Python 2023年9月5日
    0128
  • 面试突击91:MD5 加密安全吗?

    MD5 是 Message Digest Algorithm 的缩写,译为信息摘要算法,它是 Java 语言中使用很广泛的一种加密算法。MD5 可以将任意字符串,通过不可逆的字符串…

    Python 2023年10月18日
    063
  • 虚拟人实时互动之基于Android驱动表情随动

    ZEGO Avatar表情随动功能简介 ZEGO Avatar SDK 提供了 表情随动功能…

    Python 2023年10月25日
    041
  • python panda3d从入门_笔记:Python之Pandas的使用技巧

    Pandas的使用技巧相关知识点总结 pandas的使用技巧相关知识点总结表.png 一、数学计算与统计基础 (1)基本参数axis和skipna 基本参数:axis、skipna…

    Python 2023年8月17日
    039
  • 深度学习使用Float而不是Long/Int

    DeepLearning 使用 Float、 Complex数据类型,而不使用 Int、 Long等类型 Int64(即Long类&am…

    Python 2023年6月10日
    072
  • scrapy-redis分布式爬虫部署

    1.settings.py ————–Scrapy-Redis分布式爬虫相关设置—————- 启用Redis调度器存储请求队列,使用Scrap…

    Python 2023年10月5日
    034
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球