2012-11-04 25 views
1

我試圖確定函數參數是一個字符串還是其他一些迭代。具體來說,這是用來構建URL參數,試圖模擬PHP的&param[]=val語法的數組 - 所以鴨子打字在這裏沒有真正的幫助,我可以遍歷一個字符串並生成諸如&param[]=v&param[]=a&param[]=l之類的東西,但這顯然不是我們的想。如果參數值是一個字符串(或者一個字節?我仍然不知道字節的實際點是什麼),它應該產生&param=val,但是如果參數值是(例如)一個列表,每個元素應該接收自己&param[]=val。我已經看到了很多關於如何在2. *涉及isinstance(foo, basestring)這個問題的解釋,但是在3. *中不存在basestring,並且我還看到isinstance(foo, str)會丟失更復雜的字符串(我認爲unicode?) 。那麼,在不造成某些類型丟失到不必要的錯誤的情況下,做到這一點的最佳方法是什麼?從python中的其他iterables中分離字符串3

回答

3

你已經看到了基於Python 2 vs 3有點衝突的事情。在Python 3中,isinstance(foo, str)幾乎肯定是你想要的。 bytes適用於原始二進制數據,您可能無法在這樣的參數字符串中包含該數據。

python 2 str鍵入存儲的原始二進制數據,通常是一些字符串,如utf8或latin-1或某些特定的編碼; unicode類型存儲了可以被編碼成任何特定編碼的字符的更「抽象」表示。 basestring是他們兩個人的共同祖先,所以你可以輕鬆地說「任何類型的字符串」。

在python 3中,str是更抽象的類型,而bytes用於原始二進制數據(如特定編碼中的字符串或任何想要處理的原始二進制數據)。您不應該使用bytes來處理任何其他字符串,因此沒有真正的理由來檢查它是否爲strbytes。但是,如果您絕對需要,您可以執行類似isinstance(foo, (str, bytes))的操作。

+0

我會反過來辯論。要在網絡上傳遞數據,你需要在某個時刻對它進行編碼(創建'bytes')。因此,從「字節」塊構建一個URL是完全有意義的。 – delnan

+0

是的,那是真的 - 但查詢字符串應該是ascii-only和%-encoded,對吧?因此,大多數API可能需要傳遞一個URL編碼的字符串(大概是一個'str')或一個稍後將被URL編碼的通用字符串(也是一個'str')。 – Dougal

+0

事情是,如果它已經被urlencoded(並且因此是純ASCII),它可能也是'bytes'。事實上,這可能是更明智的選擇,因爲如果後者試圖添加另一個字符串而不先對其進行urlen編碼,則會導致錯誤。 – delnan

相關問題