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

python中的泛型使用TypeVar

时间:2023-12-28 16:55:19浏览次数:37  
标签:Hashable TypeVar python mode 泛型 import data Iterable

1.引入为什么需要TypeVar

PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分。通过精巧的元编程技术,让类支持[]运算不成问题。但是方括号内的T变量必须在某处定义,否则要大范围改动python解释器才能让泛型支持特殊的[]表示法。

鉴于此,我们增加了typing.TypeVar构造函数,把变量名称引入当前命名空间。

由于java,c#和TypingScript等语言不要求实现声明类型变量的名称,因此没有与python的TypeVar类对应的结构。

2.示例

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)

3.受限的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:
  ...

4.有界的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
#Python学习交流群:711312441
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/Pythonmiss/p/17933079.html

相关文章

  • 无涯教程-Java泛型 - 无限类型擦除
    如果使用无限制的类型参数,则JavaCompiler会将通用类型的类型参数替换为对象。packagecom.learnfk;publicclassGenericsTester{publicstaticvoidmain(String[]args){Box<Integer>integerBox=newBox<Integer>();Box<String>stringBox=newBo......
  • python 四数之和 多种解法
    方法一:暴力枚举暴力枚举方法比较容易想到,就是将四个数的组合进行遍历,找到符合要求的组合。代码如下:deffourSum(nums,target):length=len(nums)nums.sort()result=[]foriinrange(length-3):forjinrange(i+1,length-2):......
  • `pip` 和 `pip3` 是 Python 的包管理工具,它们可以用来查找、下载、安装和卸载 Python
    `pip`和`pip3`是Python的包管理工具,它们可以用来查找、下载、安装和卸载Python包¹。这两个命令的区别主要取决于你的系统中安装的Python版本¹³⁴⁵:-如果你的系统中只安装了Python2,那么只有`pip`可以使用³。-如果你的系统中只安装了Python3,那么`pip`和`pi......
  • 羽毛球比赛python
    importrandomimportosprint("2班17向悦")#介绍比赛以及程序defprint_introduce():print("Thisisabadmintongamesimulationprogram")print("Theprogramrequirestwoplayers'abilityvalues(expressedindecimalsfrom0to1)&q......
  • python 将文件移入回收站
     python如果要删除一个文件,通常使用os.remove(filename)但是这样就直接从磁盘删除了。有些文件需要删除到回收站,以便误删后还能找回文件fromwin32com.shellimportshell,shellcondebug=Falsedefdeltorecyclebin(filename):print('deltorecyclebin',filename)......
  • python 数据存储,写入
    '''以下是同一个功能的代码段落,但是所耗时间却是天差地别'''st=time.time()#字典格式共耗时40sdsd={}#forkey,valueinfile_h.items():#ifvalueinhash_values:#dsd[value]=dsd.get(value,[])+[key]#......
  • python 文件读写权限 PermissionError: [Errno 13] Permission denied
    概述os.chmod()方法用于更改文件或目录的权限。语法chmod()方法语法格式如下:os.chmod(path,mode)参数path --文件名路径或目录路径。flags --可用以下选项按位或操作生成,目录的读权限表示可以获取目录里文件名列表,,执行权限表示可以把工作目录切换到此目录,删......
  • python word预设样式
    通过预设样式,来控制段落文本样式,来达到批量调节段落的格式样式。   大纲级别中:1级-9级代表的是标题级别。在word自动生成目录时才能正确生成。请正确设置docx:doc=Document()doc.styles["Normal"]  "Normal"表示正文的样式,[“Heading2”]表示2级标题的样式,当然......
  • 如何在 Python 程序中读取和写入文件
     在Python编程中,文件读写是一项常见的操作。通过文件读写,我们可以从文件中读取数据,或将数据写入到文件中。本文将介绍在Python程序中进行文件读写的基本操作。 读取文件 要读取文件,我们可以使用Python内置的`open()`函数。`open()`函数接受文件路径和打开模式作为参数,并返回一......
  • Python编程该怎么实现socket文件传输
    在网络编程中,Socket是一种常用的通信协议,它可以在计算机之间进行数据传输。在Python中,我们可以使用内置的socket模块来实现Socket文件传输。本文将介绍如何使用Python编程实现Socket文件传输的步骤和示例代码。步骤一:创建服务器端首先,我们需要创建一个服务器端来接收文件。以下是创......