向后兼容的输入调用Python

时间:2011-05-03 11:05:22

标签: python input python-3.x raw-input

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

在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 个答案:

答案 0 :(得分:32)

由于{2.}}的Python 2.x版本基本上没用,您可以简单地用input()覆盖它:

raw_input

一般来说,我不会试图瞄准兼容Python 2.x和3.x的代码,而是以一种在2.x上工作的方式编写代码,然后你就可以得到一个工作3。 x版使用try: input = raw_input except NameError: pass 脚本。

答案 1 :(得分:9)

此代码现在在许多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(),因此可以在两个版本的Python下使用input()而不会出现问题。如果这是您希望包含在代码中的唯一兼容性修补程序,则可以单独使用它。

在其他语言兼容性问题上,Python.org网站上提供了更多from __future__次导入。还有一个名为" six"在处理其他问题时可以查找兼容性解决方案。

答案 2 :(得分:1)

你处理它的方式很好。使用sys模块可能有更多相似的方法,但请记住,如果你是程序正在做一些比字符串和文件更微不足道的事情,最好有两个版本的程序而不是向后兼容的python3程序。

答案 3 :(得分:1)

我的偏好是导入功能:

from builtins import input

虽然,您必须安装依赖项:

pip install future

不幸的是pipreqs工具不会注意到这种依赖关系。因此,如果您要创建requirements.txt个文件,则必须手动添加未来的库。