2017-02-20 6 views
0

attrgetter 함수는 인수에 따라 다른 유형을 반환 할 수 있습니다. 하나의 항목으로 반복 가능을 전달하면 객체의 주어진 필드 만 반환합니다. 여러 아이템을 가진 iterable을 넘겨 주면, 객체의이 필드들의 튜플을 반환한다.MyPy/python 유형 힌트가 여러 유형을 반환 할 수있는 호출 된 함수를 catch하지 않습니다.

from operator import attrgetter 


class OneThing: 
    foobar = "hello" 
    fields = ['foobar'] 


class TwoThings: 
    foobar = "hello" 
    goodbye = "potatoes" 
    fields = ['foobar', 'goodbye'] 


def attrgettertest(thing) -> tuple: 
    return attrgetter(*thing.fields)(thing) 


def main(): 
    onething = OneThing() 
    twothings = TwoThings() 

    t1 = attrgettertest(onething) 
    t2 = attrgettertest(twothings) 

    print("Attrgettertest on 'onething' returned {} with type {}".format(
     t1, type(t1))) 
    print("Attrgettertest on 'twothings' returned {} with type {}".format(
     t2, type(t2))) 


if __name__ == "__main__": 
    main() 

출력 :

$ python attrgettrtest.py 
Attrgettertest on 'onething' returned hello with type <class 'str'> 
Attrgettertest on 'twothings' returned ('hello', 'potatoes') with type <class 'tuple'> 
$ mypy attrgettrtest.py 
$ 

예상 초래 형 힌트 + MyPy를 사용하는 경우에는,이 차이는 MyPy 의해 픽업되지

(이것은 어떤 오류가 발생하지 않음) 다음과 같이하십시오 :

import random  

def test() -> tuple: 
    if random.choice([0, 1]): 
     return ("foo", "bar") 
    return "foo" 

if __name__ == "__main__": 
    for n in range(20): 
     print(test()) 

$ mypy test.py 
test.py:8: error: Incompatible return value type (got "str", expected Tuple[Any, ...]) 

이것은 MyPy의 버그입니까?

답변

0

attrgetter의 반환 유형이 Any이고 mypy가이 문제를 파악하지 못하는 것 같습니다.

은 내가 mypy REPO이를 게시 answer 다음 가지고 : 나는 문제가 attrgetter 당신의 코드가 통과하도록 입력 Any을 반환 있다고 생각

합니다. 원칙적으로 이러한 유형의 경우 정확한 유형 확인이 어려울 수 있지만 이러한 상황에서 경고를 발행하는 새로 추가 된 플래그 --warn-return-any이 있습니다 (자세한 내용은 PR #2854 참조).