2013-05-10 53 views
0

所以我想創建一個函數,並根據傳入的參數的類型來執行不同的操作。具體而言,我希望它在輸入字符串時執行一件事,否則如果列表被輸入。這在Python中可能嗎?如果是的話,我該如何去做呢?檢查輸入函數的參數類型

在我使用isinstance()嘗試,但它似乎沒有一刻被擊中任何我如果語句:

def tester(*args): 
    if (isinstance(args, str)): 
     return "String" 
    elif (isinstance(args, list)): 
     return"List" 
    else: 
     return "You dun goofed" 

編輯:用戶將永遠只能傳遞一個參數在一次,一個列表或一個字符串。

+3

'* args'將*總是*返回一個元組。 – Volatility 2013-05-10 09:04:19

+0

啊謝謝,有沒有另一種方法來做我想做的事情? – Kayra 2013-05-10 09:05:07

+0

函數是否接受一個參數?或者用戶可以輸入更多? – Volatility 2013-05-10 09:05:36

回答

2

看起來你會路過一個你的功能的單一參數。在這種情況下,刪除'*',因爲它總是被視爲參數的元組。它是可變長度參數並且當您不確定您需要的參數的數量時將被使用。

def tester(args): 
    if (isinstance(args, str)): 
     return "String" 
    elif (isinstance(args, list)): 
     return"List" 
    else: 
     return "You dun goofed" 

如果你的函數實際上需要可變長度參數,並要檢查正在傳遞的第一個參數是一個字符串或列表,你可以這樣做:

def tester(*args): 
    if (isinstance(args[0], str)): 
     return "String" 
    elif (isinstance(args[0], list)): 
     return"List" 
    else: 
     return "You dun goofed" 
+0

這幫助我更好地理解事情,非常感謝你:) – Kayra 2013-05-10 09:24:21

3

*args是傳遞給參數的參數的元組。圖示(*)操作符將函數調用中給出的參數解包,例如。

>>> def tester(*args): 
     print args 
     print type(args) 


>>> tester(1, 'a') 
(1, 'a') 
<type 'tuple'> 

所以,你可能想要做的是檢查每個args來isinstance,並確保它們例如所有strlist

if all(isinstance(a, str) for a in args): 
+0

+1用於* all *和生成器表達式。 – 2013-05-10 09:10:02