我正在尝试根据PEP 484在 Python 2 中键入注释函数。该函数接受一个应该同时实现__len__
和的容器__iter__
。我要添加此注释的原始代码非常复杂,因此考虑一个示例函数,如果是偶数则返回int
容器中所有 s的乘积,否则返回 1。s
len(s)
如果我想在__len__
需要的地方注释容器,我会将它注释为type: (Sized) -> int
. 如果我想在__iter__
需要的地方注释容器,我会将它注释为type: (Iterable[int]) -> int
. 但是我如何完美地注释一个我需要两者的容器呢?
我按照Piotr-Ćwiek的建议尝试了这个:
from __future__ import print_function
from typing import Sized, Iterable
class SizedIterable(Sized, Iterable[int]):
pass
def product2(numbers):
# type: (SizedIterable) -> int
if len(numbers)%2 == 1:
return 1
else:
p = 1
for n in numbers:
p*= n
return p
print(product2([1, 2, 3, 4]))
print(product2({1, 2, 3, 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"