首页 > 编程语言 >python中的泛型使用TypeVar

python中的泛型使用TypeVar

时间:2023-05-12 12:23:21浏览次数:40  
标签:Hashable TypeVar python mode 泛型 import data Iterable

引入为什么需要TypeVar

PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分。通过精巧的元编程技术,让类
支持[]运算不成问题。但是方括号内的T变量必须在某处定义,否则要大范围改动python解释器才能让泛型
支持特殊的[]表示法。鉴于此,我们增加了typing.TypeVar构造函数,把变量名称引入当前命名空间。由于
java,c#和TypingScript等语言不要求实现声明类型变量的名称,因此没有与python的TypeVar类对应的结构。

示例

from collections.abc import Iterable
from typing import TypeVar

T = TypeVar('T')


def mode(data: Iterable[T]) -> T:
    return data[1:]


if __name__ == '__main__':
    list1 = [1.1,1.2,1.3,1.4,1.5]
    list2 = [1,2,3,4,5]
    data1 = mode(list1)
    data2 = mode(list2)
    print(data1)
    print(data2)

受限的TypeVar

TypeVar还接受一些位置参数,以对类型参数施加限制。
from collections.abc import Iterable
from decimal import Decimal
from fractions import Fraction
from typing import TypeVar

NumberT = TypeVar('NumberT', float, Decimal, Fraction)
def mode(data: Iterable[NumberT]) -> NumberT:
  ...

有界的TypeVar

from collections.abc import Iterable, Hashable
def mode(data: Iterable[Hashable]) -> Hashable:
现在的问题是,返回的项是Hashable类型。Hashable是一个抽象基类。只实现了__hash__方法。因此,
除了调用hash(),类型检查工具不会允许对返回值做其它任何操作。所以,这么做没有任何意义。
解决方法是使用TypeVar的另一个可选参数,即关键字参数bound。这个参数会为可接受的类型设定一个
上边界。下面的实例使用bound=Hashable指明,类型参数可以是Hashable或它的任何子类型。
from collections  import Counter
from collections.abc import Iterable, Hashable
from typing import TypeVar

HashableT = TypeVar('HashableT', bound=Hashable)
def mode(data: Iterable[HashableT]) -> HashableT:
  pairs = Counter(data).most_common(1)
  if len(pairs) == 0:
    raise ValueError('no mode for empty data')
  return pairs[0][0]

标签:Hashable,TypeVar,python,mode,泛型,import,data,Iterable
From: https://www.cnblogs.com/weiweivip666/p/17393734.html

相关文章

  • python Django项目以Debug模式启动和外网访问启动
    一、Django介绍介绍:完善的web框架,包括前端和后端的管理,django项目管理;管理后台访问:后面补充前端页面访问:根据app/settings.py文件下配置的访问地址1.1项目结构1.1.1app项目配置文件存放settings.py、urls.py、wsgi.py等1.1.2子应用配置Migrations:数据库模型的脚本,......
  • python导出postgresql中的一个表到本地csv表格
     代码如下修改xxx即可:conn=psycopg2.connect(host=DB_SERVICES,user=DB_USERNAME,password=DB_PWD,database=DB_NAME)cur=conn.cursor(cursor_factory=psycopg2.extras.DictCursor)sql=f"select*fromxxx.xxx"cur.execute(sql)res=cur.fetchall()pand......
  • 关于Python爬虫使用代理的问题
    当我们使用爬虫程序进行数据采集时,经常会遇到一些网站对爬虫的限制,例如IP封禁、访问频率限制等。为了解决这些问题,我们可以使用代理服务器来进行爬虫操作。本文将介绍爬虫代理的相关知识。一、什么是爬虫代理?爬虫代理是指在爬虫程序中使用代理服务器进行数据采集的一种方式。代......
  • python将灰度图或三通道黑白图转换为像素值0或255的八位图
    fromPILimportImageimportnumpyasnpimportos#设置阈值(可根据具体情况调整)threshold=128path1=r'resultCD'path2=r'result1'ifnotos.path.exists(path2):os.makedirs(path2)#遍历文件夹中的所有图片forfile_nameinos.listdir(path1):i......
  • Python学习之三: 编译二进制
    Python学习之三:编译二进制摘要每次使用python执行py文件其实是比较麻烦的主要是还得安装python的虚拟机,以及安装对应的pip包.感觉比较繁杂理论上最快捷的方式是编译成二进制直接运行.所以这里主要是说一下通过pycharm和linux机器进行二进制编译的过程Pycharm的安......
  • 车辆路径问题——CVPR的Python实现
    车辆路径问题通常被定义为装运一系列点或接收点,通过他们组织车辆适当途径有序。在一定的约束条件,如对商品的需求,交货数量,交付的交付时间,车辆容量限制,行驶里程限制,时间限制,以实现某些目标。如果最短距离,最低的成本,尽可能少的时间,尽量少使用车辆。在物流和运输,因为运输点,更多的客户,......
  • python内置模块——logging
    内置模块-loggingloging模块是python提供的内置模块,用来做日志处理。日志等级:等级释义级别数值CRITICAL(fatal)致命错误,程序根本跑不起来50ERROR运行错误,程序运行发生错误的地方时就会退出程序40WARNING运行警告,程序运行发生警告的地方时会显示警告提示,但是......
  • Python学习之二:不同数据库相同表是否相同的比较方法
    摘要昨天学习了使用python进行数据库主键异常的查看.当时想我们有跨数据库的数据同步场景.对应的我可以对不同数据库的相同表的核心字段进行对比.这样的话能够极大的提高工作效率.我之前写过很长时间的shell.昨天跟着同事开始学python.感觉的确用python能够节约大量的时间.......
  • python读取txt文本匹配excel内容
    别人的需求,一个小脚本、代码如下:importopenpyxl#打开Excel文件path=r'D:\Paper\data_late.xlsx'workbook=openpyxl.load_workbook(path)#获取第一个工作表worksheet=workbook.active#获取字符串列的值,并将其转换为列表strings=[cell.valueforcelli......
  • python中的内置异常
    1关于异常代码中遇到错误时会引发异常,python中有许多内置的异常类来表示某种具体异常,当然也可以自定义异常类,当异常未被捕获或处理时,代码会在引发异常处终止,并将异常信息显示在回溯信息中(tarceback)如下上面可在traceback中看到一些关于异常的具体信息,由于改异常未被捕获或处......