Union
bu durum için kesin tasarlanmıştır.
MyList = Union[List[str], List[int]]
def my_function(list_arg: MyList) -> None: ...
Ben bir genel işlevi olarak kullanarak tavsiye etmem: Sık sık kullanırsanız
from typing import Union, List
def my_function(list_arg: Union[List[str], List[int]]) -> None: ...
, bir tür takma olun: Belirttiğiniz türlerinden herhangi biri olabilir yeni bir tür oluşturur @ user6269244 cevabı, belirli bir nedenden dolayı ihtiyacınız olmadıkça önerir. T = TypeVar('T', int, str)
, basit bir durumda çalışacak olsa da, daha kısıtlayıcı olacaktır. Örneğin
, böyle bir şey olduğunu varsayalım: Bu kodu
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)
, hiçbir chioce var: İhtiyacınız bir Union
(List[List[T]]
Eğer int ve bir liste listesini hem depolamak izin vermez nedeniyle, T
, aynı ifadede str
ve int
arasında geçiş yapamaz. Eğer my_function
çağıran kod Union
kullandığından
Ama, aynı zamanda my_function
kendisinin imzası Union
kullanmak gerekecek. Ayrıca, jenerikler türlerin karmaşıklığını arttırır ve bir noktada tip sisteminin sınırlamalarına girersiniz. Eğer gerçekten örneğin, onlara ihtiyacım nereye my_function
dönüş tipi argümanı türüne bağlıdır istiyorsanız Yani durumlar için jeneriği rezerve etmek daha iyidir:
T = TypeVar("T", int, str)
# this can't be achieved with Union:
def my_function(list_arg: List[T]) -> T: ...
Sanırım bu daha eksiksiz, bu yüzden başkaları için doğru işaretlerim ama teşekkürler @ user6269244 - problemi benim için yeterince iyi çözdü! – vahndi