翼度科技»论坛 编程开发 python 查看内容

python中的泛型使用TypeVar

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
1.引入为什么需要TypeVar

PEP484的作者希望借助typing模块引入类型提示,不改动语言的其它部分。通过精巧的元编程技术,让类支持[]运算不成问题。但是方括号内的T变量必须在某处定义,否则要大范围改动python解释器才能让泛型支持特殊的[]表示法。
鉴于此,我们增加了typing.TypeVar构造函数,把变量名称引入当前命名空间。
由于java,c#和TypingScript等语言不要求实现声明类型变量的名称,因此没有与python的TypeVar类对应的结构。
2.示例
  1. from collections.abc import Iterable
  2. from typing import TypeVar
  3. T = TypeVar('T')
  4. def mode(data: Iterable[T]) -> T:
  5.     return data[1:]
  6. if __name__ == '__main__':
  7.     list1 = [1.1,1.2,1.3,1.4,1.5]
  8.     list2 = [1,2,3,4,5]
  9.     data1 = mode(list1)
  10.     data2 = mode(list2)
  11.     print(data1)
  12.     print(data2)
复制代码
3.受限的TypeVar

TypeVar还接受一些位置参数,以对类型参数施加限制。
  1. from collections.abc import Iterable
  2. from decimal import Decimal
  3. from fractions import Fraction
  4. from typing import TypeVar
  5. NumberT = TypeVar('NumberT', float, Decimal, Fraction)
  6. def mode(data: Iterable[NumberT]) -> NumberT:
  7.   ...
复制代码
4.有界的TypeVar
  1. from collections.abc import Iterable, Hashable
  2. def mode(data: Iterable[Hashable]) -> Hashable:
复制代码
现在的问题是,返回的项是Hashable类型。Hashable是一个抽象基类。只实现了__hash__方法。因此,除了调用hash(),类型检查工具不会允许对返回值做其它任何操作。
所以,这么做没有任何意义。解决方法是使用TypeVar的另一个可选参数,即关键字参数bound。这个参数会为可接受的类型设定一个上边界。
下面的实例使用bound=Hashable指明,类型参数可以是Hashable或它的任何子类型。
  1. from collections  import Counter
  2. from collections.abc import Iterable, Hashable
  3. from typing import TypeVar
  4. #Python学习交流群:711312441
  5. HashableT = TypeVar('HashableT', bound=Hashable)
  6. def mode(data: Iterable[HashableT]) -> HashableT:
  7.   pairs = Counter(data).most_common(1)
  8.   if len(pairs) == 0:
  9.     raise ValueError('no mode for empty data')
  10.   return pairs[0][0]
复制代码
来源:https://www.cnblogs.com/Pythonmiss/p/17933079.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具