2011-05-03 51 views
16

我想知道是否有人對編寫向後兼容的input()調用來獲取文件路徑有什麼建議?在Python中向後兼容的輸入調用

在Python 2.x中,raw_input對輸入如/ path/to/file的工作正常。在這種情況下使用輸入在3.x中工作正常,但由於eval行爲而在2.x中投訴。

一種解決方案是檢查的Python版本,基於版本,無論是inputraw_input映射到一個新的功能:

if sys.version_info[0] >= 3: 
    get_input = input 
else: 
    get_input = raw_input 

我敢肯定有一個更好的辦法來做到這一點,雖然。任何人有任何建議?

+4

如果您正在編寫的代碼是在不使用2to3的情況下在Python 2和Python 3下運行,那麼您需要:http://pypi.python.org/pypi/six它已經爲您解決了許多類似問題。它也可以作爲解決這些問題的一個很好的例子(儘管事實上它並不適用於input())。 其他的方法是使用2to3。請參閱http://python3porting.com/strategies.html – 2011-05-03 12:25:59

回答

24

由於input()了Python 2.x的版本基本上是沒用的,你可以簡單地raw_input覆蓋它:

try: 
    input = raw_input 
except NameError: 
    pass 

一般情況下,我不會試圖着眼於與這兩個代碼工作,Python的2 .x和3.x,而是以在2.x上運行的方式編寫代碼,並使用2to3腳本獲得工作的3.x版本。

1

你處理它的方式很好。使用sys模塊可能有更多類似的方法,但請記住,如果您是程序員,在字符串和文件方面做的不僅僅是微不足道的事情,最好是有兩個版本的程序,而不是具有向後兼容的python3程序。

4

此代碼現在在許多Python教育和培訓計劃中都有教授。

通常教導在一起:

from __future__ import print_function 
if hasattr(__builtins__, 'raw_input'): 
    input = raw_input 

第一行:進口的Python 3.x的print()功能成Python 2.7,以便print()行爲的Python的兩個版本在相同。如果由於較早的print "some content"呼叫而導致代碼中斷,則可以關閉此線路。

第二行和第三行:設置Python 2.7 raw_input()input()因此input()可以在兩個版本的Python下使用,沒有任何問題。如果這是您希望包含在代碼中的唯一兼容性修補程序,則可以單獨使用它。

在Python.org網站上有更多from __future__導入可用於其他語言兼容性問題。還有一個名爲「六」的圖書館,可以在處理其他問題時查找兼容性解決方案。

0

我的選擇是導入功能:

from builtins import input

雖然,你將不得不安裝依賴:

pip install future

不幸的是這種依賴性不會被pipreqs注意到工具。所以如果你正在創建requirements.txt文件,你將不得不手動添加未來的庫。