2009-05-28 120 views
32

我有一種方法,我希望能夠接受單個字符串(一個路徑,但不一定是運行代碼的機器上存在的一個)或者一個字符串的列表/元組。檢查輸入是字符串或單個字符串的列表/元組

鑑於字符串作爲字符列表,我怎麼能告訴方法接收哪種類型?

我希望能夠接受單個條目的標準或unicode字符串,以及列表或元組爲多個,所以isinstance似乎不是答案,除非我錯過了一個聰明的技巧與它(如利用共同的祖先類?)。

Python版本是2.5

+2

樣品輸入兼容/輸出使這樣的問題更容易解釋 – 2009-05-28 19:39:09

+0

這裏簡單的答案http://stackoverflow.com/a/26797718/99834 - 由於py2-3的變化並不明顯。 – sorin 2014-11-07 09:15:41

回答

44

您可以檢查一個變量是一個字符串或Unicode字符串

isinstance(some_object, basestring) 

這將返回True兩個字符串和unicode字符串

編輯:

你可以做這樣的事情:

if isinstance(some_object, basestring): 
    ... 
elif all(isinstance(item, basestring) for item in some_object): # check iterable for stringness of all items. Will raise TypeError if some_object is not iterable 
    ... 
else: 
    raise TypeError # or something along that line 

Stringness is可能不是一個字,但我希望你的想法

1

你有沒有考慮varargs語法?我不確定這是不是你要求的,但是像this question這樣的東西是否符合你的要求?

+0

難道這不就是強制呼叫者指定哪個被髮送?如果可能,我寧願避免這種情況。 (而且我也很好奇我是否想以優雅的方式去做...) – mavnn 2009-05-28 19:39:16

3

請與isinstance(阿根廷,即basestring)

11

類型檢查的類型:

def func(arg): 
    if not isinstance(arg, (list, tuple)): 
     arg = [arg] 
    # process 

func('abc') 
func(['abc', '123']) 

可變參數:

def func(*arg): 
    # process 

func('abc') 
func('abc', '123') 
func(*['abc', '123']) 
5

isinstance是一個選項:

In [2]: isinstance("a", str) 
Out[2]: True 

In [3]: isinstance([], str) 
Out[3]: False 

In [4]: isinstance([], list) 
Out[4]: True 

In [5]: isinstance("", list) 
Out[5]: False 
5

,因爲我喜歡讓事情變得簡單,這裏是既2.x和3.x兼容最短的形式:

# trick for py2/3 compatibility 
if 'basestring' not in globals(): 
    basestring = str 

v = "xx" 

if isinstance(v, basestring): 
    print("is string") 
-1

不能你:

(i == list (i) or i == tuple (i)) 

它會回答說:如果輸入是元組或列表。唯一的問題是,它只能用一個只保存一個變量的元組來運行。

3
>>> type('abc') is str 
True 
>>> type(['abc']) is str 
False 

該代碼是與Python 2和3

相關問題