我正在構建一個SQL查詢的正則表達式,我傳遞給一個Python函數。這就是我目前做的(iterable
是傳遞給函數的變量):Python,優雅的方式來測試一個/列表/元組,期待字符串
if isinstance(iterable, (list, tuple, set)):
app = '|'.join(iterable)
我希望能夠測試的抽象(參見採集模塊的ABC的),這意味着它是一個容器,但不是basestring
。 (這是可迭代的!)
有沒有辦法改進上述?
我正在構建一個SQL查詢的正則表達式,我傳遞給一個Python函數。這就是我目前做的(iterable
是傳遞給函數的變量):Python,優雅的方式來測試一個/列表/元組,期待字符串
if isinstance(iterable, (list, tuple, set)):
app = '|'.join(iterable)
我希望能夠測試的抽象(參見採集模塊的ABC的),這意味着它是一個容器,但不是basestring
。 (這是可迭代的!)
有沒有辦法改進上述?
我不認爲有這樣的事情存在 - 你有什麼可能是最好的。
有時候,我有一些函數需要字符串(我將分割)或一個可迭代的字符串。對於這些,我通常去負測試,而不是即
if isinstance(iterable, basestring):
iterable = iterable.split(',')
等
感謝您的反饋!我會努力+1,但我希望我知道有更好的方法。 –
嗯,問題是你不想測試類型,你想測試的功能,要麼隱式(鴨型)或顯式(使用ABC,從基類實例化,或像'callable'函數)。所以,首先你需要定義你想要的應該傳遞給迭代的抽象功能,並且對字符串失敗。通常情況下,這並不容易。 –
接受,因爲沒有更好的方法! –
'isinstance(迭代器,collections.Container),而不是isinstance(迭代器,STR)'? – falsetru
對不起,正在迴應一個早先的評論,聲稱'iterable'是一個本地類型。在集合中有一個'Iterable',但沒有'iterable' afaik。評論被刪除了,所以我想他們混合了不同的語言? –
我只想做:'如果不是isinstance(iterable,basestring):app ='|'.join(iterable)'。不要檢查特定的序列...讓它鴨子打字,只是文件,你想要一個可迭代的字符串或字符串。 – Bakuriu