2013-05-30 101 views
2

我想迭代一個變量,它可以是一個列表或一個字符串。問題是,我不想考慮字符串作爲字符的列表:如何避免將字符串視爲字符序列?

[1, 2, 3] => [1, 2, 3] 
["1", "2"] => ["1", "2"] 
"123" => ["123"] # instead of ["1", "2", "3"] 

for x in foo作品名單,但遍歷假設foo是一個字符串中的字符。

我知道這可以通過檢查的類型來進行(例如for x in (foo if type(foo) is list else [foo])),但我得到一個感覺,必須有一個更好的辦法...

+0

我不認爲有更好的方法,但這是檢查類型的不好方法 – jamylak

+0

雖然這是一個不同的討論 - 爲什麼檢查類型是一種不好的方法? – Ofir

+0

本身並不壞。只是表明你的代碼可能需要重構。只是觸發警告標誌的事情之一。 –

回答

6

直接的方法的確是

for x in ([foo] if isinstance(foo, basestring) else foo) 

爲什麼我說isinstance(foo, basestring)而不是說type(foo) is list

  • 它更可能是你的代碼將有一些非列表序列對象,而非字符串類型的對象是非常罕見的。

  • 由於Alex Martelli explains這是更好地使用isinstance比檢查確切類型相等,這樣你還包括子類。

  • 具體來說,你可能想要以同樣的方式處理字節和Unicode字符串。

亞歷克斯說,測試類型是醜陋的,一般我同意,但如果你需要寫出來的字符串的一種方式,並列出另一這是做正確的方式。

+1

+1不能想到更好的方法,Python 3只是檢查'str'而不是'basestring' – jamylak

+1

我認爲你的意思是'for x in([foo] if isinstance foo,basestring)else foo)' – Ofir

2

不知道到底爲什麼你這樣做 - 我敢肯定,你有一個很好的理由,我想指出,這可能是一個代碼味道 ...

最有可能,在調用函數之前,您知道您是否有列表或字符串。編寫兩個函數或在調用函數時將字符串放入列表中。瞧。無需檢查類型。

如果你不知道你有什麼樣的結果,但是應該(因爲你想根據類型對它進行不同的處理),那麼這也是一種代碼味道 - 你的代碼中的某個地方,你不太清楚關於正在發生的事情或某個子系統的界面太模糊。

所以。要麼修復根本原因。或者檢查你的函數內的類型。

+0

簡而言之,這是一個REST服務器,它可以獲取包括AMF在內的各種格式的請求。參數可以通過查詢字符串(例如GET)發送,這意味着它們都是字符串,或者在AMF的情況下,它們按原樣發送(因爲它是二進制格式) – Ofir

相關問題