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のバグですか?