Python 代码智能感知类型标注与特殊注释详解

目录
  • 一、代码智能感知
  • 二、类型标注
    • 函数返回值的类型标注
    • 变量的类型标注
  • 三、特殊的注释
  • 四、特殊的类型

一个不会写好的类型标注注释的Python程序员,是让使用TA的代码的人都痛苦无比的事情……

—— 某某大佬

一、代码智能感知

想必大部分现代的集成开发环境(IDE)都有代码智能感知功能吧!

智能感知(IntelliSense),就是在我们写代码的时候,代码编辑器自动弹出我们代码中需要补全的部分,而这些补全的部分就是代码编辑器通过智能感知得到的,最重要的是,代码编辑器智能地感知补全的部分是通过代码中的变量的类型来得到的。

一般的智能感知

说了这么多之后,大家一定都清楚智能感知是什么了,但有些时候,代码却没有智能感知(如下)

智能感知失效

当代码量很大的时候,代码的智能感知是十分重要的,它可以帮你迅速了解到这个变量那个变量是个什么东西,以减少你生产BUG!

写一个好的注释(或者类型标注),不仅仅是方便未来复用你代码的人,也是为了自己,实际上,“为了自己”可不只是简单的方便自己了解代码,更多的是让IDE智能地感知到你的代码,IDE理解了你的代码,它就会为你提供对应的信息(如代码补全和提示作用),这对程序员是极其友好的!

通过了解后面的类型标注特殊的注释,你将解决几乎所有的智能感知失效的问题!

二、类型标注

Python的类型标注有几种,在下面我给出我所知道的一些

函数参数的类型标注 【简单操作】

def function(num: int, string: str):
    pass

在上面的代码中,函数参数的后面跟了一个冒号和一个类名,代表参数的数据类型,这个类名可以是内置的类,如str、int、float等,也可以是自己定义的类、也可以是模块、库中的类,如tkinter.Tk

num参数是int类型的,string参数是str类型的,这些类型标注不仅仅在函数被定义的地方可以被看见,在调用该函数的时候也能通过IDE的智能感知而被看见(如下)

函数参数的类型标注

这个类型标注之后,并不会强制该参数使用该类型,它只是起提示作用,相当于注释,同时,IDE会通过智能感知该类型标注,给出相应的代码提示

代码提示作用

【高级操作】

import typing

def function(num: int,
             lis: list[int],
             key: typing.Literal[4, 5, 6],
             string: str | None = '123'):
    pass

上面的代码中:

list[int] 的意思是,lis参数的数据类型为一个内含整数数据的列表类型

typing是一个官方的内置模块,专门用于类型标注,typing.Literal[4, 5, 6] 表示参数key的预期值只能为4或者5或者6,也就是说,该函数接收的key参数,它只希望它是4、5或者6这三个值中的一个

str | None 的意思是,string参数的数据类型可以为str或者是None类型,此处说明一下,类型标注中用 “|” 代表或者的这种操作是在 Python3.10 的时候才加入的,在之前的版本中,这种用法只在 pyi 文件(Python存根文件)中可以用

下面的代码提示中,我们就能看到类似于上面的类型标注的作用

高级操作

顺便一提,那个省略号(三个连续的小数点)的意思的默认值(一般用于pyi存根文件中)

函数返回值的类型标注

def pow(m: int, n: int) -> int:
    return m**n

函数返回值的类型标注类似于上面所说的参数类型标注,只不过这里标注的类型只的是函数的返回值的数据类型,同样的,只起提示作用,没有强制效果

这个标注也有高级用法,与上面的完全,一样,此处不再赘述

顺便一提,list[int, int, int] 表示一个含有三个整数数据的列表类型

变量的类型标注

传言有一种从天而降的写法,不知大家见过没有

key: int
key = 3

"""
或者这样写:
key: int = 3
"""

print(key) # 输出3

这个变量名后面加一个冒号、再加一个类名的写法也是类型标注的一种,只不过它不是函数的参数,而是一般变量而已,用法同上

那么,这个类型标注有什么用呢?直接赋值给该变量一个列表,那么IDE不也能识别它么?

这对于一般的变量确实没啥用,但是,下面的这种操作,你可看好了

变量的类型标注

上面的这种情况,当变量没有提前做好类型标注时,后面写代码就因为没有IDE的提示而极其麻烦

变量的类型标注还有一种方法,将在后面的 特殊的注释 中讲到

三、特殊的注释

一段看似普通的注释,实际也有着特殊的作用,就像C#中的特殊注释一样(三条斜杠“///”),Python也有着它特殊的注释

【三引号注释】

想必一个合格的Python程序员,都知道三引号注释的特殊作用吧

它不仅仅是一段普通的注释,它可以换行(都知道的),它写在函数和类下面表示帮助文档等等……这里就不再赘述了

【特殊的 # 注释】

它只能单行注释……除此之外难道它还有别的特性???对!别的特性!

当 # 注释以这样一种格式写的时候,它有着和类型标注同样的效果!!!

key = [] # type: list[float]

# 注释后面写上 type,再加一个冒号、然后加上数据类型,它就成了类型标注!!!

特殊的 # 注释

是不是大多数人都不知道这个特性呢?

四、特殊的类型

有一些比较特别的数据类型,有些不是内置的但又算是内置的,但你又不容易找到它,比如迭代器类型、生成器类型、函数类型(Python里函数实际也是个对象,也有类型)等等,下面给出一个表格方便大家进行类型的标注

类型名称 数据类型 引用方式
函数 function
function

types.FunctionType

方法 method
types.MethodType

迭代器 Iterator
typing.Iterator

collections.abc.Iterator

生成器 Generator
typing.Generator

collections.abc.Generator

序列 Sequence
typing.Sequence

collections.abc.Sequence

以上就是Python 代码智能感知类型标注与特殊注释详解的详细内容,更多关于Python 智能感知类型标注的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python3 类型标注支持操作

    typing为Python的一个标注库,此默认支持PEP 484和PEP 526指定的类型提示.最基本的支持由Any.Union.Tuple.Callable.TypeVar和Generic类型组成. 有关完整的规范,请参阅PEP 484,有关任何类型提示的简单介绍,请参阅PEP 483. 举个栗子,函数接收并返回一个字符串,如下所示: def func(name: str) -> str: return "Hello" + name 在函数func中,参数预期是str类型,并且

  • 浅谈怎么给Python添加类型标注

    Python 添加类型标注 Python 如此简洁,书写者在声明变量时甚至无需考虑类型. 但是简洁与复杂间,是存在一个平衡点的.当我们书写较为复杂的项目时,还是希望可以拥有「静态类型语言」强大的类型检查和智能的提示. 好消息是,并不需要像 TypeScript 那样,引入一个新的编译器来给 JavaScript 做"升级"来进行类型检查, Python 自带的 typing 工具可以在一定程度上把 Python 变成「静态类型语言」:坏消息是, Python 归根结底不是「静态类型语言

  • vscode如何安装汉化和Python智能感知

    Visual Studio Code是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT 等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化.软件跨平台支持 Win.Mac 以及 Linux. 本文将介绍如何安装汉化和Python智能感知. 下载&安装 VSCode是免费的,因此我们不必像Pycharm一样想办法寻找绿化方法 直接官网下载安装包 https://code.visualstud

  • Python类和方法注释规范说明

    目录 Python类和方法注释规范 注释风格 小技巧 代码规范(含代码注释) 代码缩进和冒号 空行分隔代码段 包.模块的命名规范 类和对象的命名规范 函数的命名规范 代码注释 Python类和方法注释规范 注释风格 reStructuredText(PyCharm默认) def func(path, field_storage, temporary): '''基本描述 详细描述 :param path: The path of the file to wrap :type path: str :

  • Python类的基本写法与注释风格介绍

    目录 Python类基本写法与注释风格 1.python中的类 Class 2.语言风格规范 Example Python类的简单写法 Python类基本写法与注释风格 python是一种面向对象的语言,利用类的抽象可以大大提高代码的复用和结构,减少重复造轮子的过程,也让代码变得更加清晰易懂.便于维护. 1.python中的类 Class python中的类提供了一系列数据和方法的组合,类是python的一种对象,可以由它构建出新的实例.实例包含了类所具有的属性和类中声明的方法.首先来看一个基本

  • Python 代码智能感知类型标注与特殊注释详解

    目录 一.代码智能感知 二.类型标注 函数返回值的类型标注 变量的类型标注 三.特殊的注释 四.特殊的类型 一个不会写好的类型标注和注释的Python程序员,是让使用TA的代码的人都痛苦无比的事情…… —— 某某大佬 一.代码智能感知 想必大部分现代的集成开发环境(IDE)都有代码智能感知功能吧! 智能感知(IntelliSense),就是在我们写代码的时候,代码编辑器自动弹出我们代码中需要补全的部分,而这些补全的部分就是代码编辑器通过智能感知得到的,最重要的是,代码编辑器智能地感知补全的部分是

  • 利用Python代码实现数据可视化的5种方法详解

    前言 数据科学家并不逊色于艺术家.他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解.更有趣的是,一旦接触到任何可视化的内容.数据时,人类会有更强烈的知觉.认知和交流. 数据可视化是数据科学家工作中的重要组成部分.在项目的早期阶段,你通常会进行探索性数据分析(Exploratory Data Analysis,EDA)以获取对数据的一些理解.创建可视化方法确实有助于使事情变得更加清晰易懂,特别是对于大型.高维数据集.在项目结束时,以清晰.简洁和引人注目的方式展现最终结果是非常

  • Python中的异常类型及处理方式示例详解

    目录 前言 正文 一.什么是异常 二.异常的类型 三.异常处理 四.try 介绍 五.finally 介绍 六.raise 介绍 结尾 前言 Python 是一种面向对象的.解释型的.通用的.开源的脚本编程语言.现在市面上 Python 非常的流行,主要是因为它简单易用,学习成本低,比如要实现某个功能,Python 可能只需要几行代码,而用C语言可能需要上百行代码,因为C语言什么都要得从头开始编码,而 Python 已经内置了很多功能模块,所以,我们只需要导入特定的包,就可以实现想要的效果. 正

  • python发qq消息轰炸虐狗好友思路详解(完整代码)

    因为我的某个好友在情人节的时候秀恩爱,所以我灵光一闪制作了qq消息轰炸并记录了下来. 首先 我的编程环境是: windows 10系统 python3.6 记得要下载win32 pip install win32 思路介绍 其实也非常简单 将要发出去的句子储存在列表中 然后用随机模块调用 将随机出来的元素储存在剪贴板中 连接QQ 找到指定对象 疯狂输出 怎么样,简单吧 开始打代码吧 import random import win32gui as a import win32con as b i

  • python 接口_从协议到抽象基类详解

    抽象基类的常见用途:实现接口时作为超类使用.然后,说明抽象基类如何检查具体子类是否符合接口定义,以及如何使用注册机制声明一个类实现了某个接口,而不进行子类化操作.最后,说明如何让抽象基类自动"识别"任何符合接口的类--不进行子类化或注册. Python文化中的接口和协议 接口在动态类型语言中是怎么运作的呢?首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem_

  • python目标检测SSD算法训练部分源码详解

    目录 学习前言 讲解构架 模型训练的流程 1.设置参数 2.读取数据集 3.建立ssd网络. 4.预处理数据集 5.框的编码 6.计算loss值 7.训练模型并保存 开始训练 学习前言 ……又看了很久的SSD算法,今天讲解一下训练部分的代码.预测部分的代码可以参照https://blog.csdn.net/weixin_44791964/article/details/102496765 讲解构架 本次教程的讲解主要是对训练部分的代码进行讲解,该部分讲解主要是对训练函数的执行过程与执行思路进行详

  • Python+OpenCV实现鼠标画瞄准星的方法详解

    目录 函数说明 cv2.circle() cv2.line() 简单的例子 利用鼠标回调函数画瞄准星 所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样.这里并不是直接在图上画一个瞄准星,而是让这个瞄准星跟着鼠标走.在图像标注任务中,可以利用瞄准星进行一些辅助,特别是回归类的任务,使用该功能可以使得关键点的标注更加精准. 关于鼠标回调函数的说明可以参考:opencv-python的鼠标交互操作 函数说明 import cv2后,可以分别help(cv2.circle

  • TS 中的类型推断与放宽实例详解

    目录 简介 类型推断与放宽概念 常规类型推断 最佳通用类型 按上下文归类 类型放宽 常规类型放宽 非严格类型检查模式 严格类型检查模式 字面量类型放宽 对象.数组字面量类型的放宽 类字面量类型的放宽 函数返回值字面量类型的放宽 TS 内部类型放宽规则 实例分析 开篇问题解答 简介 我们知道在编码时即使不标注变量类型,TypeScript 编译器也能推断出变量类型,那 TypeScript 编译器是怎么进行类型推断,在类型推断时又是如何判断兼容性的呢? 此文,正好为你解开这个疑惑的,掌握本文讲解的

  • 基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解

    Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在画布中创建一个绘图区.在绘图区上画几条线.给图像添加文字说明等.下面我们就通过实例代码来领略一下他的魅力. import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() 上图是我们通

  • 基于Python的Post请求数据爬取的方法详解

    为什么做这个 和同学聊天,他想爬取一个网站的post请求 观察 该网站的post请求参数有两种类型:(1)参数体放在了query中,即url拼接参数(2)body中要加入一个空的json对象,关于为什么要加入空的json对象,猜测原因为反爬虫.既有query参数又有空对象体的body参数是一件脑洞很大的事情. 一开始先在apizza网站 上了做了相关实验才发现上面这个规律的,并发现该网站的请求参数要为raw形式,要是直接写代码找规律不是一件容易的事情. 源码 import requests im

随机推荐