2016-04-29 12 views

答えて

2

Unionは、このような状況のために正確に意図されます。それはあなたが指定したタイプのいずれかとすることができる新しいタイプを作成します。

from typing import Union, List 
def my_function(list_arg: Union[List[str], List[int]]) -> None: ... 

あなたは、多くの場合、それを使用する場合は、タイプエイリアスを作る:

MyList = Union[List[str], List[int]] 
def my_function(list_arg: MyList) -> None: ... 

私のように、一般的な機能を使用することをお勧めしませんあなたが何らかの理由でそれを必要としない限り、@ user6269244答えは示唆しています。 T = TypeVar('T', int, str)は単純なケースで動作しますが、より制限的です。

たとえば、あなたがこのようなものがあるとします。このコードでは

def apply_my_function(list_of_lists: List[MyList]) -> None: 
    # each item in list_of_lists is either a List[int] or List[str] 
    for arg in list_of_lists: 
    my_function(arg) 

を、あなたは何chioceを持っていない:あなたはUnionを必要とする(List[List[T]]あなたはint型のリストとリストの両方を保存させませんTstrintの間を同じ式で切り替えることができないため、strの値を変更する必要があります)。

しかし、あなたはmy_functionを呼び出すコードでUnionを使用するので、あなたがmy_function自身の署名でUnionを使用することもあります。

さらに、ジェネリックスは型の複雑さを増し、ある時点で型システムの制限に遭遇します。あなたは引数の型に依存するようにmy_functionの戻り値の型をしたいのであれば、それはたとえば、あなたが実際にそれらを必要とする場合のためにジェネリックを確保すると良いでしょう:

T = TypeVar("T", int, str) 

# this can't be achieved with Union: 
def my_function(list_arg: List[T]) -> T: ... 
+0

私はこれがより完全だと思うので、他人には正しかったとマークしていますが、感謝@ user6269244 - それは前に私の問題を十分に解決しました! – vahndi

-1
from typing import TypeVar, List 

T = TypeVar("T", int, str) 

def my_function(list_arg: List[T]): 
... 
+0

これは実際には正しいですが、Aの必要があります場合にのみ、ジェネリック関数は、その質問から明らかではない。たとえば、 'my_function'の中の変数の型に' T'を使うか、 'my_function'の戻り値の型に使いたいとします。 – max

関連する問題