2014-01-29 81 views
1

我正在構建一個SQL查詢的正則表達式,我傳遞給一個Python函數。這就是我目前做的(iterable是傳遞給函數的變量):Python,優雅的方式來測試一個/列表/元組,期待字符串

if isinstance(iterable, (list, tuple, set)): 
    app = '|'.join(iterable) 

我希望能夠測試的抽象(參見採集模塊的ABC的),這意味着它是一個容器,但不是basestring。 (這是可迭代的!)

有沒有辦法改進上述?

+0

'isinstance(迭代器,collections.Container),而不是isinstance(迭代器,STR)'? – falsetru

+0

對不起,正在迴應一個早先的評論,聲稱'iterable'是一個本地類型。在集合中有一個'Iterable',但沒有'iterable' afaik。評論被刪除了,所以我想他們混合了不同的語言? –

+1

我只想做:'如果不是isinstance(iterable,basestring):app ='|'.join(iterable)'。不要檢查特定的序列...讓它鴨子打字,只是文件,你想要一個可迭代的字符串或字符串。 – Bakuriu

回答

1

我不認爲有這樣的事情存在 - 你有什麼可能是最好的。

有時候,我有一些函數需要字符串(我將分割)或一個可迭代的字符串。對於這些,我通常去負測試,而不是即

if isinstance(iterable, basestring): 
    iterable = iterable.split(',') 

+0

感謝您的反饋!我會努力+1,但我希望我知道有更好的方法。 –

+0

嗯,問題是你不想測試類型,你想測試的功能,要麼隱式(鴨型)或顯式(使用ABC,從基類實例化,或像'callable'函數)。所以,首先你需要定義你想要的應該傳遞給迭代的抽象功能,並且對字符串失敗。通常情況下,這並不容易。 –

+0

接受,因爲沒有更好的方法! –

相關問題