Python中的向后兼容输入调用

27 投票
4 回答
4967 浏览
提问于 2025-04-16 16:53

我在想有没有人能给我一些建议,关于如何写一个兼容旧版本的输入函数,用来获取文件路径?

在Python 2.x中,使用raw_input可以很好地获取像/path/to/file这样的输入。而在Python 3.x中,使用input也没问题,但在2.x中就会出错,因为它的eval行为会导致问题。

一个解决办法是检查Python的版本,然后根据版本来决定使用input还是raw_input,并把它们映射到一个新的函数上:

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

不过我相信还有更好的方法来做到这一点。有没有人有其他建议呢?

4 个回答

1

你现在处理的方式很好。可能还有其他类似的方法可以用 sys 模块来实现,但要记住,如果你的程序在处理字符串和文件时做的事情比较复杂,最好是准备两个版本的程序,而不是让你的 Python 3 程序向下兼容。

16

这段代码现在在很多Python的教育和培训课程中都有教。

通常一起讲解:

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

第一行:把Python 3.x的print()函数引入到Python 2.7中,这样在两个版本下print()的表现就一样了。如果你之前的代码用的是老版本的print "一些内容",这行可能会导致问题,那你可以不加这一行。

第二行和第三行:把Python 2.7的raw_input()设置成input(),这样在两个版本下都可以顺利使用input()。如果你只想解决这个兼容性问题,这段代码就可以单独使用。

在Python.org网站上还有更多的from __future__导入可以用来解决其他语言兼容性的问题。此外,还有一个叫“six”的库,可以查找其他问题的兼容性解决方案。

36

因为Python 2.x版本的input()基本上没什么用,所以你可以直接用raw_input来替代它:

try:
    input = raw_input
except NameError:
    pass

一般来说,我不建议你去写那种既能在Python 2.x上跑又能在3.x上跑的代码。更好的做法是先写能在2.x上运行的代码,然后再用2to3这个工具把它转换成能在3.x上运行的版本。

撰写回答