2016-11-24 104 views
0

我想傳遞一個類型或一個類型列表作爲參數的函數。但在函數內,我需要區分類型和類型列表。粗略地解釋我需要某種形式的分支這樣的:如何檢查變量是否包含類型或類型列表?

if //someVar is a type//: 
    .... 
elif isinstance(someVar, list): 
    for t in list: 
     if //t is a type//: 
      .... 
     else: 
      print("ERROR") 
else 
    print("ERROR") 

類型可以是一些「原始」像INTSTR也是元組或班級爲好。

問題:我該如何正確而有效地類型和類型列表區分?

+0

你能解釋一下你想要做的事情嗎?你是否看過'isinstance' /'issubclass'? – jonrsharpe

+0

你需要明確檢查'list's?另外,什麼*不符合您的類型? –

+0

澄清:我的意圖是將類型信息傳遞給類型驗證方法。我想給用戶一些自由如何指定傳遞給這個方法的類型約束。因此,我希望允許他指定單一類型或類型列表(並且最終在將來還有其他一些選項)。因此,提供的信息將存儲在一個變量中。因此,爲了正確處理用戶提供的信息,我需要在代碼中進行某種分支。 –

回答

1

你需要提供一個tupleisinstance包含你認爲是適當的「原始」的類型。對於列表,您只需通過list

如果您需要處理「類和」你需要在元組明確添加這些課程,因爲在Python中(至少在Python 3沒有ClassType,在Python 2老式類有一個普通類型)。

因此,給出的例子類Bar,這裏是你將如何讓strint S,tuple S和Bar爲「原始」,同時進一步檢查列表:

class Bar: pass 

def foo(arg): 
    if isinstance(arg, (int, str, tuple, Bar)): 
     print("type str or int or tuple or Bar") 
    elif isinstance(arg, list): 
     print("a list") 
    else: 
     print("Error") 

功能foo現在使這些區別對你:

>>> foo(1) 
type str or int or tuple or Bar 
>>> foo([1]) 
a list 
>>> foo(Bar()) 
type str or int or tuple or Bar 
>>> foo(foo) 
Error 

進一步elif子句中的分支爲list s的同樣performe d。

+0

沒有類的常見類型...這很不方便。某些代碼不能顯式檢查所有存在的類。請參閱上面提供的附加信息作爲對我的問題的評論。你有什麼想法如何實現這一目標?我需要明確地區分表示類型的對象(f.e.列表)和該類型的實例(f.e.類型的列表)。 –

+0

@Regis用戶可以提供什麼arg?輸入:'foo(list)','foo(int)'屬於「single」類型,而'foo([int,str,tuple])'屬於'type'的'list'類別? –

+1

對不起,是的。 Jim給出了正確的提示:我可以將元組或單值傳遞給isinstance()。所以我可以實現我想要的。我可以完全跳過分支,因爲這是通過isinstance()本身完成的!謝謝你的回答,吉姆! –

相關問題