我想知道是否有人建议编写一个向后兼容的input()调用来检索文件路径?
在Python 2.x中,raw_input适用于像/ path / to / file这样的输入。在这种情况下,使用输入可以正常工作3.x,但由于eval行为而在2.x中抱怨。
一种解决方案是检查Python的版本,并根据版本将input
或raw_input
映射到新函数:
if sys.version_info[0] >= 3:
get_input = input
else:
get_input = raw_input
我确信有更好的方法可以做到这一点。有人有什么建议吗?
答案 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
个文件,则必须手动添加未来的库。