Python中的向后兼容输入调用
我在想有没有人能给我一些建议,关于如何写一个兼容旧版本的输入函数,用来获取文件路径?
在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 个回答
你现在处理的方式很好。可能还有其他类似的方法可以用 sys
模块来实现,但要记住,如果你的程序在处理字符串和文件时做的事情比较复杂,最好是准备两个版本的程序,而不是让你的 Python 3 程序向下兼容。
这段代码现在在很多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”的库,可以查找其他问题的兼容性解决方案。
因为Python 2.x版本的input()
基本上没什么用,所以你可以直接用raw_input
来替代它:
try:
input = raw_input
except NameError:
pass
一般来说,我不建议你去写那种既能在Python 2.x上跑又能在3.x上跑的代码。更好的做法是先写能在2.x上运行的代码,然后再用2to3
这个工具把它转换成能在3.x上运行的版本。