関数の型ヒントを指定したい場合は、をstr
に、list
をint
にすることができます。 Pythonを使ってこれを行う方法はありますか?ような何か:pythonの型ライブラリを使用して複数の可能な型を指定する
from typing import List
def my_function(list_arg: List[str|int]):
...
...
関数の型ヒントを指定したい場合は、をstr
に、list
をint
にすることができます。 Pythonを使ってこれを行う方法はありますか?ような何か:pythonの型ライブラリを使用して複数の可能な型を指定する
from typing import List
def my_function(list_arg: List[str|int]):
...
...
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型のリストとリストの両方を保存させませんT
はstr
とint
の間を同じ式で切り替えることができないため、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: ...
from typing import TypeVar, List
T = TypeVar("T", int, str)
def my_function(list_arg: List[T]):
...
これは実際には正しいですが、Aの必要があります場合にのみ、ジェネリック関数は、その質問から明らかではない。たとえば、 'my_function'の中の変数の型に' T'を使うか、 'my_function'の戻り値の型に使いたいとします。 – max
私はこれがより完全だと思うので、他人には正しかったとマークしていますが、感謝@ user6269244 - それは前に私の問題を十分に解決しました! – vahndi