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의 버그입니까?