最近在看transformers包的源码。

在文件src/transformers/tokenization_utils.py里面发现了这个用法,感觉还是挺有意思的。

在看到前几行导入的时候,导入了typingoverload

定位到代码中,竟然是装饰一个函数:convert_ids_to_tokens。这个函数在类里面,出现了3次。

  1. 其中前面两次出现都是被overload装饰了。前面两个函数唯一的区别就是参数类型组合不一样。比如,第一个函数是int,第二个是List[int].
  2. 但是第三个函数,就没有被overload装饰。这是为什么?
from typing import Any, Dict, List, Optional, Tuple, Union, overloadclass PreTrainedTokenizer(PreTrainedTokenizerBase):def __init__(self, **kwargs):super().__init__(**kwargs)# Added tokens - We store this for both slow and fast tokenizers# until the serialization of Fast tokenizers is updatedself.added_tokens_encoder: Dict[str, int] = {}self.added_tokens_decoder: Dict[int, str] = {}self.unique_no_split_tokens: List[str] = []self.tokens_trie = Trie()self._decode_use_source_tokenizer = False@overloaddef convert_ids_to_tokens(self, ids: int, skip_special_tokens: bool = False) -> str:...@overloaddef convert_ids_to_tokens(self, ids: List[int], skip_special_tokens: bool = False) -> List[str]:...def convert_ids_to_tokens(self, ids: Union[int, List[int]], skip_special_tokens: bool = False) -> Union[str, List[str]]:if isinstance(ids, int):if ids in self.added_tokens_decoder:return self.added_tokens_decoder[ids]else:return self._convert_id_to_token(ids)tokens = []for index in ids:index = int(index)if skip_special_tokens and index in self.all_special_ids:continueif index in self.added_tokens_decoder:tokens.append(self.added_tokens_decoder[index])else:tokens.append(self._convert_id_to_token(index))return tokens

官网是这么说的:

@overload 装饰器可以修饰支持多个不同参数类型组合的函数或方法。@overload - 装饰定义的系列必须紧跟一个非 @overload-装饰定义(用于同一个函数/方法)。@overload-装饰定义仅是为了协助类型检查器, 因为该装饰器会被非 @overload-装饰定义覆盖,后者用于运行时,而且会被类型检查器忽略。在运行时直接调用 @overload 装饰的函数会触发 NotImplementedError。下面的重载示例给出了比联合类型或类型变量更精准的类型:

这个overload就是重载的意思:函数(或者叫方法)名称可以相同,但是类型组合不同。

比如上面出现了convert_ids_to_tokens三次。

  1. overload装饰的函数(方法),就是用于被类型器检查的.
  2. 最后一个没有加overload,就是在运行的时候用的,而且类型监测器不检查他的类型了.
  3. 最后一个不能加overload,也不需要加overload,最后一个就是用来运行的,当然不可以加。

可是这么做有什么好处呢?多写了6行代码。

优点

  1. 重载给出了比联合类型或类型变量更精准的类型,也就是类型检查更精确了.
  2. 用来做类型检查器的,用来运行的。面向这两个需求,分工明确.
  3. 检查的时候,直接查看被overload装饰器的函数(方法).
  4. 运行的时候,直接用没有被overload装饰的函数(方法).

缺点

  1. 我感觉唯一的缺点,就是要多写一些代码。(但是着没什么缺点)

参考链接

  1. https://docs.python.org/zh-cn/3/library/typing.html#typing.overload

python typing overload相关推荐

  1. Python3中装饰器@typing.overload的使用

    typing.py的源码在:https://github.com/python/cpython/blob/main/Lib/typing.py .此模块为类型提示(Type Hints)提供运行时支持 ...

  2. python typing.Literal 与sqlalchemy中的Literal

    python typing.Literal是用于限制函数传参,例如: from typing import Literal def func(a:Literal[1,2,3]): print(a) 那 ...

  3. python typing optional_python类型检测最终指南--Typing模块的使用

    正文共:30429 字 预计阅读时间:76分钟 原文链接:https://realpython.com/python-type-checking/ 作者:Geir Arne Hjelle 译者:陈祥安 ...

  4. python Typing模块-类型注解

    写在篇前   typing 是python3.5中开始新增的专用于类型注解(type hints)的模块,为python程序提供静态类型检查,如下面的greeting函数规定了参数name的类型是st ...

  5. Python typing —— 类型提示(type hint)

    https://www.rddoc.com/doc/Python/3.6.0/zh/library/typing/ 1. 基础类型 指定参数类型和返回值类型: def greeting(name: s ...

  6. python typing typescript_Python的价值,对比Java/Typescript

    我的工作语言是java/kotlin/typescript, 本来是不喜欢它的,不理解它存在的价值,觉得它是个很难在实际工作中使用的语言,比如说做web app的后台,它肯定比不上java,因为不太可 ...

  7. python typing typescript_将 python 数据转化为 TypeScript 格式

    前段时间写过这篇文章将 python 数据转化为 lua 格式, 这段时间因为新项目改用 Creator + TypeScript 的原因, 需要导出 ts 格式的数据. 当然我们可以选择使用 jso ...

  8. python typing与之配合_python 代码实例1

    python 代码实例1 Contributor:游客36044959 Type:代码 Date time:2018-05-26 16:32:38 Favorite:308 Score:1 返回上页 ...

  9. python typing typescript_typescript

    使用官方脚手架构建 npm install -g @vue/cli # OR yarn global add @vue/cli 复制代码 新的Vue CLI工具允许开发者 使用 TypeScript ...

最新文章

  1. 在线作图|在线做扩增子抽平
  2. 《LeetCode力扣练习》剑指 Offer 11. 旋转数组的最小数字 Java
  3. iOS网络编程-配置iCloud-图文解说
  4. java构造方法的签名_如何在 Java 中构造对象(学习 Java 编程语言 034)
  5. 谷歌浏览器外贸版_针对谷歌SEO,你有哪些值得推荐的工具、插件、网站、app,或者技巧分享?...
  6. ip 十进制 整型 java_IP地址转换成10进制整数(zt)
  7. 昔年浅谈做害虫消杀防护的用什么推广效果好?
  8. java筛选excel数据_Excel中的筛选技巧有哪些,总结四种筛选技巧分享给大家
  9. authorization 传 就跨域_将Token添加到请求头Heade
  10. 裴礼文《数学分析中的典型问题与方法》P31~60
  11. Vue.js实际开发案例(不断整理中...)
  12. 医院管理系统/医院药品管理系统
  13. 电影:换肤(Replace)
  14. androidx中app.startup组件官方指南
  15. 红外额温枪方案ZHW3548作主控开发程序
  16. Visual Paradigm在 Windows系统电脑上安装
  17. 计算机显卡调研,75%以上的人都想换显卡! MC调研报告告诉你吃鸡“帧”香
  18. 谈古论津丨天津杨柳青年画为何要用娃娃作主题?
  19. linux 防火墙黑名单
  20. 华为鲲鹏HCIA考试-练习02

热门文章

  1. 2021年浙江省跨境电商行业发展概况及发展趋势分析[图]
  2. Unity UV基于中心点旋转/缩放/位移 Shader
  3. 【QScrollBar | QSlider | QDial | QProgressBar | QLCDNumber】
  4. 使用VNC连接树莓派4b如何全屏1080p分辨率,一次更改永久有效!
  5. 腾讯视频怎么下载_QQ视频如何下载到本地保存
  6. kindle操作:传输下载的书籍、更改书籍封面
  7. linux 7 开启远程桌面,CentOS 7 安装使用 VNC 远程桌面
  8. 会火吗?苹果软件新专利:用户自拍照可组成合影
  9. php 化学泥浆,天水化学泥浆
  10. android10rom包,安卓10的刷机教程,教你刷好Killer的精简包