1

Python 3.6 では、このタプル サンプルに問題はありません。

# tpl is a tuple. Each entry consists of a tuple with two entries. The first
# of those is a tuple of two strings. The second one is a tuple of tuples with
# three strings.

tpl = (
    (('a', 'b'), (('1', '2', '3'), ('4', '5', '6'))),
    (('c', 'd'), (('7', '8', '9'),)),
    )

for first_tuple, second_tuple in tpl:
    str1, str2 = first_tuple
    print(str1, str2)
    for str1, str2, str3 in second_tuple:
        print('   ', str1, str2, str3)
    print()

出力:

a b
    1 2 3
    4 5 6

c d
    7 8 9

しかし、mypy 0.511 は混乱しているようで、エラーが報告されます。

ttpl.py:13: error: Iterable expected
ttpl.py:13: error: "object" has no attribute "__iter__"; maybe "__str__"?

mypy が何が起こっているのかを理解できるようにするにはどうすればよいですか?

4

2 に答える 2

0

Ryanは python 3.6 の正しい答えを示し、何が起こっているのかについての洞察も与えてくれましたが、2 つの別の可能性を指摘したいと思います。

PEP 526 (変数注釈の構文) を使用せずに Python バージョンを使用する必要がある場合は、次のようにすることができます。

from typing import Tuple, Iterable

TypeOfData = Iterable[
    Tuple[
        Tuple[str, str],
        Iterable[Tuple[str, str, str]]
        ]
    ]

tpl = (
    (('a', 'b'), (('1', '2', '3'), ('4', '5', '6'))),
    (('c', 'd'), (('7', '8', '9'),)),
    ) # type: TypeOfData

for first_tuple, second_tuple in tpl:
    str1, str2 = first_tuple
    print(str1, str2)
    for str1, str2, str3 in second_tuple:
        print('   ', str1, str2, str3)
    print()][1]

mypy がエラーを報告しないようにしたいだけの場合は、これも可能です。

tpl = (
    (('a', 'b'), (('1', '2', '3'), ('4', '5', '6'))),
    (('c', 'd'), (('7', '8', '9'),)),
    )

for first_tuple, second_tuple in tpl:
    str1, str2 = first_tuple
    print(str1, str2)
    for str1, str2, str3 in second_tuple: # type: ignore
        print('   ', str1, str2, str3)
    print()
于 2017-06-27T06:55:14.127 に答える