2014-09-19 32 views
4

在python 2.x中,存在稱爲unicode的unicode字符串和稱爲str的字節串,這些字符串經常被誤用於文本數據,因爲它是默認值。幸運的是,python 3.x通過默認py2 unicode解決了這個問題,並讓用戶在使用二進制數據時選擇py2 str編碼文本。但它也將py2 unicode更名爲str,py2 str更改爲bytes在python 3.x和2.x中統一區分str/unicode和bytes/str的方法是什麼?

我知道有很多方法來編寫代碼來區分它們,但我想知道其他方法是最好的方法以及爲什麼和可能學習方法I不知道,但。我也知道,有些方法可能更適合某些情況,所以請隨時在您的答案中公開所有內容。

這個問題也讓我任何人選擇最好的選擇,但我被提醒說,這是一個意見問題。

因此,這裏所使用的「」類型和執行它是unicode的類型知道我的方式...

from __future__ import unicode_literals 

if isinstance(string, type("")): 
    ... 

鳳雲NameError異常,並使用特定版本的代碼。

思,似乎沒有正常工作...

使用getattr()檢查encode()decode()方法像Python 2.x中似乎使用了兩種類型的兩種方法。

正如我不能添加任何回答任何更多的,這裏就是我終於要使用:

# Ensure compatibility with Python < 2.7 (2.7 uses bytes as an alias for str). 
if 'bytes' not in vars(): 
    bytes = str 

if isinstance(name, bytes): 
    ...byte string... 
else: 
    ...unicode string... 
+2

收集意見的問題是偏離主題;有些人還提出了這樣的問題,表明缺乏研究,因此倒下了。 (我自己,我只是投票結束。) – chepner 2014-09-19 13:12:29

+0

一個更好的問題可能是「我選擇了方法1,與方法2相比它有什麼缺點嗎?」簡單地說,你知道一些選項並不能證明你實際上*知道這些選項,而這種語言常常被用來掩蓋缺乏研究的情況。 – chepner 2014-09-19 13:16:44

+0

夠公平的,我會添加已知的方法來解決這個問題。我只是不認爲這樣的問題能夠得到解決,可能有三位可能對答案感興趣的人所提出的問題是以任何方式幫助交換內容的方式。但在編輯它之前,請隨時繼續競賽以解決問題。 – 2014-09-19 13:19:13

回答

3

考慮使用six,其目的是解決這個和其他2至3遷移問題。

我還是建議你提到的from __future import unicode_literals聲明,只是爲了確保從自己的源字符串被一致地執行,但對於一切,你可能會發現string-related constants in six有用:

  • six.text_type評估爲str在3和unicode在2
  • six.binary_type評估爲在3 bytesstr在2
  • six.string_types可以爲有用檢查並評估爲str in 3和basestring in 2.
+0

啊,這看起來像是要走的路......但不是那麼好的事情是它在標準庫之外。 – 2014-09-19 13:31:31

+0

沒錯,雖然它也是建立的,所以如果需要的話,你可以用代碼打包它;只需將'six.py'與您的其他模塊一起放入您的應用程序中即可。 [這裏是一個例子](https://github.com/myersjustinc/wtnv-metadata)一個項目,我就是這麼做的。 – myersjustinc 2014-09-19 14:27:02

+0

是的,如果使用的不僅僅是測試/二進制類型,我會這樣做,但我發現我可以用我在問題中描述的內容來支持較早的Python版本。 – 2014-09-19 15:10:41