2016-04-29 16 views

cevap

2

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: ... 
+0

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

-1
from typing import TypeVar, List 

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

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

Bu aslında doğrudur, ama bir ihtiyaç var sadece Sorundan açık olmayan genel işlev. Örneğin, '' '' '' my' fonksiyonunun içindeki değişkenler türünde '' '' ya da 'my_function''un dönüş türünde kullanmak isterseniz. – max

İlgili konular