web-dev-qa-db-ja.com

可変長のタプルを取る関数に注釈を付ける方法は? (多様なタプル型注釈)

引数として異なる長さのタプルを取る関数があります:

from typing import Tuple


def process_Tuple(t: Tuple[str]):
    # Do nasty Tuple stuff

process_Tuple(("a",))
process_Tuple(("a", "b"))
process_Tuple(("a", "b", "c"))

上記のように関数に注釈を付けると、これらのエラーメッセージが表示されます

fool.py:9: error: Argument 1 to "process_Tuple" has incompatible type "Tuple[str, str]"; expected "Tuple[str]"
fool.py:10: error: Argument 1 to "process_Tuple" has incompatible type "Tuple[str, str, str]"; expected "Tuple[str]"

process_Tupleは本当にタプルで動作し、可変長の不変のリストとして使用します。インターネットでこのトピックについてコンセンサスを見つけられなかったので、この種の入力にどのように注釈を付ければよいのでしょうか。

11
Montreal

...リテラル(別名Ellipsis)を使用して注釈を付けることができる可変長の同種タプル

def process_Tuple(t: Tuple[str, ...]):
    ...

その後、エラーはなくなります。

から docs

同種の型の可変長タプルを指定するには、リテラルの省略記号を使用します。 Tuple[int, ...]。プレーンなTupleTuple[Any, ...]と同等で、Tupleと同等です。

20
Azat Ibrakov

Azatが投稿した省略記号の回答に加えて、 @typing.overload または typing.Union

from typing import Tuple


@overload
def process_Tuple(t: Tuple[str]):
    # Do nasty Tuple stuff

@overload
def process_Tuple(t: Tuple[str, str]):
    ...

または連合と:

from typing import Tuple, Union


def process_Tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
    # Do nasty Tuple stuff
1
Wolph