python中interable_Python中大小Iterable的类型提示

我有一个函数,它对它的一个参数使用len函数,并迭代该参数。现在我可以选择是用Iterable来注释类型,还是用Sized来注释类型,但是这两种方法都会在mypy中给出错误。在from typing import Sized, Iterable

def foo(some_thing: Iterable):

print(len(some_thing))

for part in some_thing:

print(part)

给予

^{pr2}$

同时def foo(some_thing: Sized):

...

给予error: Iterable expected

error: "Sized" has no attribute "__iter__"

由于没有this issue中讨论的Intersection,我需要一些混合类。在from abc import ABCMeta

from typing import Sized, Iterable

class SizedIterable(Sized, Iterable[str], metaclass=ABCMeta):

pass

def foo(some_thing: SizedIterable):

print(len(some_thing))

for part in some_thing:

print(part)

foo(['a', 'b', 'c'])

当将foo与list一起使用时,会出现错误。在error: Argument 1 to "foo" has incompatible type "List[str]"; expected "SizedIterable"

这并不奇怪,因为:>>> SizedIterable.__subclasscheck__(list)

False

所以我定义了一个__subclasshook__(参见docs)。在class SizedIterable(Sized, Iterable[str], metaclass=ABCMeta):

@classmethod

def __subclasshook__(cls, subclass):

return Sized.__subclasscheck__(subclass) and Iterable.__subclasscheck__(subclass)

然后子类检查起作用:>>> SizedIterable.__subclasscheck__(list)

True

但是mypy仍然抱怨我的list。在error: Argument 1 to "foo" has incompatible type "List[str]"; expected "SizedIterable"

当同时使用len函数并迭代我的参数时,如何使用类型提示?我认为铸造foo(cast(SizedIterable, ['a', 'b', 'c']))不是一个好的解决方案。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值