Python中向后兼容的输入调用

27

我想知道是否有人有关于编写向后兼容的input()调用以检索文件路径的建议?

在Python 2.x中,raw_input可以正常处理像/path/to/file这样的输入。在3.x中使用input在这种情况下也可以正常工作,但由于eval行为,在2.x中会报错。

一种解决方案是检查Python的版本,并根据版本将inputraw_input映射到一个新函数:

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

我相信有更好的方法来完成这个任务。有人有什么建议吗?


4
如果你正在编写代码,希望在Python 2和Python 3下运行而不使用2to3,则需要使用这个:http://pypi.python.org/pypi/six。它已经为你解决了许多类似的问题。它还可以作为解决此类问题的良好示例(尽管它实际上并没有处理input())。另一种方法是使用2to3。请参见http://python3porting.com/strategies.html。 - Lennart Regebro
4个回答

36

由于 Python 2.x 版本的 input() 函数实际上是没什么用的,你可以通过使用 raw_input 来覆盖它:

try:
    input = raw_input
except NameError:
    pass

一般来说,我不会尝试编写既适用于Python 2.x又适用于3.x的代码,而是写出适用于2.x的代码,并使用2to3脚本使其适用于3.x。


16

这段代码现在在许多 Python 教育和培训课程中教授。

通常一起教授的内容:

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

第一行:将Python 3.x的print()函数导入Python 2.7,使得print()在两个版本中表现相同。如果因为旧的print "some content"调用而破坏了您的代码,可以不包括此行。

第二、三行:将Python 2.7的raw_input()设置为input(),这样input()就可以在两个版本的Python下使用而没有问题。如果这是您希望在您的代码中仅包含的唯一兼容性修复,则可以单独使用它。

Python.org网站上还提供了更多from __future__导入,用于解决其他语言兼容性问题。处理其他问题时,可以查找名为“six”的库以获取兼容性解决方案。


1

您目前的处理方式非常好。使用sys模块可能有更多类似的方法,但请记住,如果您的程序在字符串和文件方面做了比较复杂的事情,最好拥有两个版本的程序,而不是一个向后兼容的Python3程序。


1
您可以导入该函数:

from builtins import input

很遗憾,这种方法需要通过 pip install future 安装外部依赖。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接