(파이썬 3.6, mypy 0.521)을위한 완벽한 서명을 찾고 코드와 함께 작동하고, int
, float
, complex
뿐만 아니라 datetime.timedelta
에 대한 올바른 결과를 생성합니다. 서명을 추가 할 때 문제가 나타납니다. 나는 다음을 시도했다 :Mypy :</p> <pre><code>def avg(xs): it = iter(xs) try: s = next(it) i = 1 except StopIteration: raise ValueError("Cannot average empty sequence") for x in it: s += x i += 1 return s/i </code></pre> <p>이의 좋은 점 : 나는 다음과 같은 기능을위한 완벽한 기능의 서명을 마련하기 위해 노력하고있어 평균 기능
def avg(xs: t.Iterable[t.Any]) -> t.Any: ...
그러나 이제 호출자는 결과를 캐스팅해야한다.
def avg(xs: t.Iterable[T]) -> T: ...
T
은 더하기 또는 나눗셈을 지원하지 않으므로 실패합니다. int/int
는 float
때문에
N = TypeVar("N", int, float, complex, datetime.timedelta)
def avg(xs: t.Iterable[N]) -> N: ...
실패; //
을 사용하면 거의 모든 경우에 대해 잘못된 결과가 나타납니다. 덧셈과 나눗셈이 지원되는 한 다른 유형에 대해서도 코드가 작동해야하기 때문에 짜증납니다.
N = TypeVar("N", float, complex, datetime.timedelta)
def avg(xs: t.Iterable[N]) -> N: ...
이것은 거의 완벽하지만, 나중에 쿼터니언을 던지기로 결정하면 mypy가 불평 할 것입니다.
... 그 다음 나는 또한 abc
와 typing.overload
와 함께 무엇인가 노력하고 있었다. 그러나 그것은 나를 아무 곳에도 붙 잡지 않았다.
mypy --strict
에서 가장 멋진 해결책은 무엇입니까?
그것은 플로트/INT 비대칭 당신이 정말이에 대한 일관된 서명을 생성 할 수 없음을 의미처럼 보인다. int와 float에 대해 숫자로 의미있는 결과를 생성하지만'avg ([list of ints])'는 float을 생성하고 avg ([list of floats])는 또한 float을 생성합니다. 이것은 함수가 주어진 형과 때로는 다른 형을 반환하기 때문에 입력 형식에 따라 일관되게 정의 할 수있는 반환 형식이 없다는 것을 의미합니다. mypy는 "numbers"와 같은 유형을 허용합니까 (numbers.Number'에서와 같이)? – BrenBarn
Crazily,'numbers.Number'는'__add__' 또는 다른 표준 산술 연산을 정의하지 않으므로'지원되지 않는 왼쪽 피연산자 유형 + ("Number")','/ ("Number" – rollcat