键入一个函数参数,该函数参数派生自Python中的多个抽象基类

键入一个函数参数,该函数参数派生自Python中的多个抽象基类,第1张

概述我试图根据 PEP 484在Python 2中键入一个函数注释.该函数接受一个应该同时实现__len__和__iter__的容器.我想要添加此注释的原始代码非常复杂,因此请考虑一个示例函数,如果len(s)是偶数,则返回容器中所有int的乘积,否则返回1. 如果我想要注释只需要__len__的容器,我会将其注释为类型:(大小) – > INT.如果我想注释一个只​​需要__iter__的容器,我会 我试图根据 PEP 484在Python 2中键入一个函数注释.该函数接受一个应该同时实现__len__和__iter__的容器.我想要添加此注释的原始代码非常复杂,因此请考虑一个示例函数,如果len(s)是偶数,则返回容器中所有int的乘积,否则返回1.

如果我想要注释只需要__len__的容器,我会将其注释为类型:(大小) – > INT.如果我想注释一个只​​需要__iter__的容器,我会将其注释为类型:( Iterable [int]) – > INT.但是,如何在我需要的容器中完美地注释容器?

编辑:

我根据piotr-ĆwIEk的建议尝试了这个:

from __future__ import print_functionfrom tyPing import Sized,Iterableclass SizedIterable(Sized,Iterable[int]):    passdef product2(numbers):    # type: (SizedIterable) -> int    if len(numbers)%2 == 1:        return 1    else:        p = 1        for n in numbers:            P*= n        return pprint(product2([1,2,3,4]))print(product2({1,4}))

但是这个错误失败了:

prod2.py:17: error: Argument 1 to "product2" has incompatible type List[int]; expected "SizedIterable"prod2.py:18: error: Argument 1 to "product2" has incompatible type Set[int]; expected "SizedIterable"
解决方法 在python 3.6中,有一个types.Collection几乎完全适合你的用例(它也来自Container,但实际上你想要使用的任何东西都可能有__contains__).不幸的是,python 2没有解决方案.

SizedIterable不起作用的原因是通过从Sized和Iterable派生它,你只是告诉mypy它是这两种类型的子类型; mypy并不认为任何类型为Sized和Iterable的子类型也是SizedIterable的子类型.

Mypy是完全合乎逻辑的;毕竟,您不希望此代码键入check:

class A(Sized,Iterable[int]):  def g(self) -> None:    ...def f(x: A) -> None:  a.g()# passes type check because [1,2] is Sized and Iterable# but fails in run-timef([1,2])

如果mypy以不同的方式处理你的类定义只是因为它的类体是空的,那就太麻烦了.

为了让mypy理解你的意图,mypy需要为其类型系统添加一个新功能.

目前正在考虑这种功能的两个选项:

> intersections(由@PiotrĆwIEk指出);你要求的是Iterable和Sized的交集
> structural typing;这比一般的交叉点简单得多,但对于你的用例来说已经足够了,因为你需要的只是number参数有__len__和__iter__方法

模仿输入类定义或使用__instancecheck__将无法工作,因为(正如有人最近向我解释过的)在任何情况下mypy都不会运行您编写的代码(即,它永远不会导入您的模块,永远不会调用您的函数等) .这是因为mypy是一个静态分析工具,它不会假设运行代码的环境在执行期间甚至可用(例如,python版本,库等).

总结

以上是内存溢出为你收集整理的键入一个函数参数,该函数参数派生自Python中的多个抽象基类全部内容,希望文章能够帮你解决键入一个函数参数,该函数参数派生自Python中的多个抽象基类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存