2016-08-01 71 views
-4

我在我的Python IDE中啓用了兼容性檢查,現在我意識到繼承的Python 2.7代碼有很多調用unicode()這是不允許的Python 3.x.如何將Python 2的unicode()函數轉換爲正確的Python 3.x語法

我看着Python2的docs並沒有發現提示如何升級:

我現在不想切換到Python3,但也許在未來。

的代碼包含大約500呼叫unicode()

如何進行?

更新

用戶vaultah的閱讀pyporting指南已經收到幾個upvotes的評論。

我目前的解決辦法是這樣的(感謝Peter布里泰恩):

from builtins import str 

...我找不到這個提示在pyporting文檔.....

+5

https://docs.python.org/3/howto/pyporting.html – vaultah

+0

@vaultah這不是一個普遍的問題。它只是關於'unicode()'調用。我目前工作的代碼庫中,大約有700個調用這個方法的地方。我該怎麼辦? – guettli

+2

這個問題沒有很好的答案。如果你幸運的話,你可以刪除對「unicode」的調用,你很好。所有字符串在Python 3中都是unicode。如果這不起作用,那麼期望* lot *的工作。當從Python 2切換到3時,從str到unicode文字和字節的轉換是迄今爲止最不兼容的改變。 – Phillip

回答

12

正如已經在評論中指出的那樣,已經有advice on porting from 2 to 3

最近剛剛不得不端口一些我自己的代碼從2到3,保持現在每個兼容性,我衷心推薦使用python-future,它提供了一個很好的工具,以幫助更新您的代碼(futurize),以及明確的指導爲how to write cross-compatible code

在你的具體情況下,我會簡單地將所有調用轉換爲unicode使用str然後import str from builtins。目前任何值得使用的IDE都將在全球範圍內進行搜索並取代一次操作。

當然,如果您只想使用自動轉換(並在您的代碼中查找其他潛在問題),那麼也應該捕獲這類事物。

+1

是的,'futurize'將幫助轉換代碼庫; 'unicode()'調用將被轉換爲'str()'調用,其中'from builtins import str'導入在頂部。請注意,通常會爲Python 2上的'future'庫添加一個安裝類型的需求(以提供backported'builtins'模塊)。 –

+0

這將打破sqlalchemy,以及其他圖書館。 –

1

您可以測試是否有是您運行的Python版本中的unicode()這樣的函數。如果沒有,你可以創建一個unicode()別名str()函數,該函數在Python 3在Python 2什麼unicode()做了,因爲所有的字符串都是Unicode的在Python 3

# Python 3 compatibility hack 
try: 
    unicode('') 
except NameError: 
    unicode = str 

注意,更完整的端口可能是一個更好的主意;詳情請參閱the porting guide

+0

是的,這個手工解決方案應該工作。但我想我會用Peter Brittain的答案解釋未來的圖書館。 – guettli

4

首先,作爲一種策略,我會採取一小部分程序並嘗試將其移植。您所描述的unicode調用的數量向我建議,您的應用程序比大多數人更關心字符串表示,每個用例通常都不相同。

重要的考慮因素是所有字符串都是Python 3中的unicode 3。如果您正在使用str類型來存儲「字節」(例如,如果它們是從文件讀取的),那麼您應該知道這些字符不會是Python3中的字節,而是以Unicode開頭的字符。

我們來看幾個例子。

首先,如果您根本沒有任何非ASCII字符,並且確實沒有使用Unicode字符集,則很容易。有機會,你可以簡單地將unicode()函數更改爲str()。這將確保任何作爲參數傳遞的對象都被正確轉換。然而,假設這很容易,這是一廂情願的想法。

很可能,您需要查看unicode()的參數以查看它是什麼,並確定如何處理它。

例如,如果從在Python 2文件讀取UTF-8字符,將它們轉換爲Unicode代碼應該是這樣的:

data = open('somefile', 'r').read() 
udata = unicode(data) 

然而,在Python3,read()返回的Unicode數據首先,和Unicode解碼必須在打開文件時指定:

udata = open('somefile', 'r', encoding='UTF-8').read() 

正如你所看到的,可移植很大程度上取決於應用程序如何以及爲什麼這樣做的Unicode convers當轉化unicode()簡單離子,數據來自哪裏以及去哪裏。

Python3爲字符串表示帶來更大的清晰度,這是值得歡迎的,但可以使移植變得艱鉅。例如,Python3具有適當bytes類型,並且您字節數據爲Unicode這樣轉換:使用相反的變換

udata = bytedata.decode('UTF-8') 

或轉換Unicode數據至字符形式。

bytedata = udata.encode('UTF-8') 

我希望這至少有助於確定一個策略。

+0

很好的答案,它解釋了正確地替換'unicode()'的重要性 –

1

簡短回答:將所有unicode呼叫替換爲str呼叫。

長答案:在Python 3中,Unicode由於其豐富性而被替換爲字符串。如下解決方案,如果你只使用Python 3工作:

unicode = str 
# the rest of your goes goes here 

如果您正在使用兩個Python的2或Python 3使用它,用這個來代替:

import sys 
if sys.version_info.major == 3: 
    unicode = str 
# the rest of your code goes here 

的另一種方法:運行此在命令行中

$ 2to3 package -w