2017-02-20 6 views
0

attrgetter関数は、引数に基づいて異なる型を返すことができます。 1つのアイテムでイテレートを渡すと、オブジェクトの指定されたフィールドだけが返されます。複数のアイテムを持つiterableを渡すと、オブジェクトのこれらのフィールドのタプルが返されます。MyPy/python型のヒントは、複数の型を返す関数をキャッチしません。

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() 

と出力:+ MyPyを型ヒントを使用している場合しかし、この矛盾はMyPy(それがエラーをスローしていない)によってピックアップされていない

$ 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 
$ 

期待される結果をだろう

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レポにこれを掲示し、次answerを得た:

私は問題はあなたのコードが通過するようattrgetterは、タイプAnyを返されたことだと思います。原則として、このような場合には厳密な型チェックが難しいですが、そのような状況で警告を発行するフラグ--warn-return-anyが新しく追加されています(詳細はPR #2854を参照してください)。

関連する問題