引数として異なる長さのタプルを取る関数があります:
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
は本当にタプルで動作し、可変長の不変のリストとして使用します。インターネットでこのトピックについてコンセンサスを見つけられなかったので、この種の入力にどのように注釈を付ければよいのでしょうか。
...
リテラル(別名Ellipsis
)を使用して注釈を付けることができる可変長の同種タプル
def process_Tuple(t: Tuple[str, ...]):
...
その後、エラーはなくなります。
から docs
同種の型の可変長タプルを指定するには、リテラルの省略記号を使用します。
Tuple[int, ...]
。プレーンなTuple
はTuple[Any, ...]
と同等で、Tuple
と同等です。
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