我試圖確定函數參數是一個字符串還是其他一些迭代。具體來說,這是用來構建URL參數,試圖模擬PHP的¶m[]=val
語法的數組 - 所以鴨子打字在這裏沒有真正的幫助,我可以遍歷一個字符串並生成諸如¶m[]=v¶m[]=a¶m[]=l
之類的東西,但這顯然不是我們的想。如果參數值是一個字符串(或者一個字節?我仍然不知道字節的實際點是什麼),它應該產生¶m=val
,但是如果參數值是(例如)一個列表,每個元素應該接收自己¶m[]=val
。我已經看到了很多關於如何在2. *涉及isinstance(foo, basestring)
這個問題的解釋,但是在3. *中不存在basestring
,並且我還看到isinstance(foo, str)
會丟失更復雜的字符串(我認爲unicode?) 。那麼,在不造成某些類型丟失到不必要的錯誤的情況下,做到這一點的最佳方法是什麼?從python中的其他iterables中分離字符串3
1
A
回答
3
你已經看到了基於Python 2 vs 3有點衝突的事情。在Python 3中,isinstance(foo, str)
幾乎肯定是你想要的。 bytes
適用於原始二進制數據,您可能無法在這樣的參數字符串中包含該數據。
python 2 str
鍵入存儲的原始二進制數據,通常是一些字符串,如utf8或latin-1或某些特定的編碼; unicode
類型存儲了可以被編碼成任何特定編碼的字符的更「抽象」表示。 basestring
是他們兩個人的共同祖先,所以你可以輕鬆地說「任何類型的字符串」。
在python 3中,str
是更抽象的類型,而bytes
用於原始二進制數據(如特定編碼中的字符串或任何想要處理的原始二進制數據)。您不應該使用bytes
來處理任何其他字符串,因此沒有真正的理由來檢查它是否爲str
或bytes
。但是,如果您絕對需要,您可以執行類似isinstance(foo, (str, bytes))
的操作。
相關問題
- 1. 在Python列表中分離字符串
- 2. 如何從c中的字符串中分離字符串#
- 3. Java - 從字符串中分離數字
- 4. 從數字中分離字符串
- 5. Python:用其他字符串包圍一部分字符串?
- 6. 從數字字符串模式中分離字符串
- 7. 如何從Ada中的其他字符串構建字符串?
- 8. 從空白字符串中分離字符串
- 9. 分離其他地方包含的字符串
- 10. 從Python中的字符串中剝離標點符號
- 11. C#WPF從字符串中分離字符(從後面開始)
- 12. Python從字符串和其他變量中創建變量名
- 13. 從Hive中的字符串中分離字段
- 14. 分割字符串與從陣列(Python)的多個分離
- 15. 從字符串中分離字符和數字,vb.net
- 16. 從字符串中剝離字符F#
- 17. 從其他字符串剝離字符串(如果它使用JavaScript開頭)
- 18. 如何從Java中的字符串中分離出字符串和整數?
- 19. python中字符串的字符分類
- 20. 在較大的字符串中分離字母字符串
- 21. 如何提取Python中的其他2個字符串之間的字符串?
- 22. Python字符串剝離和拆分
- 23. python從字符串urllib中分割值
- 24. Python的剝離從列表中的基於項的字符串的字符串
- 25. Python中的所有iterables符合條件
- 26. 如何將字符串替換爲列表中的其他字符串(python)
- 27. 從python中的字符串中剝離時間
- 28. Python 3 - 用字符串中的信息替換字符串的一部分
- 29. Python字符串到其他類
- 30. 從字符串中分離令牌時的分段錯誤
我會反過來辯論。要在網絡上傳遞數據,你需要在某個時刻對它進行編碼(創建'bytes')。因此,從「字節」塊構建一個URL是完全有意義的。 – delnan
是的,那是真的 - 但查詢字符串應該是ascii-only和%-encoded,對吧?因此,大多數API可能需要傳遞一個URL編碼的字符串(大概是一個'str')或一個稍後將被URL編碼的通用字符串(也是一個'str')。 – Dougal
事情是,如果它已經被urlencoded(並且因此是純ASCII),它可能也是'bytes'。事實上,這可能是更明智的選擇,因爲如果後者試圖添加另一個字符串而不先對其進行urlen編碼,則會導致錯誤。 – delnan