python中的泛型使用TypeVar,通过精巧的元编程技术
python中的泛型使用TypeVar,通过精巧的元编程技术
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]
相关内容
- Python random模块(获取随机数)常用方法和使用例子,如
- 【Python】【OpenCV】定位二维码,我们直接上代码1im
- Python笔记一之excel的读取,使用的库的版本如下:
- 一个完整Python实战项目:selenium识别验证码实现自动登
- 简单的用Python采集下微博评论,制作可视化词云图,首
- 【Python微信机器人】第六七篇: 封装32位和64位Python ho
- 【Python】【OpenCV】关于cv2.findContours()轮廓索引(编号)
- Python 中 key 参数的含义及用法,该函数返回此计数,用
- Python 潮流周刊第 32 期(摘要),愿景:帮助所有读者
- Python 学习路线:介绍、基础语法、数据结构、算法、高
评论关闭