我应该如何编写使用“raw_input”来处理Python 2.x和3.x的应用程序?
我看到一些代码(例如)可能需要在Python2.X上运行,但也可能需要在Python3.X上运行 这些项目应该如何处理原始输入 我想大概我应该如何编写使用“raw_input”来处理Python 2.x和3.x的应用程序?,python,python-2.7,python-3.x,project-management,Python,Python 2.7,Python 3.x,Project Management,我看到一些代码(例如)可能需要在Python2.X上运行,但也可能需要在Python3.X上运行 这些项目应该如何处理原始输入 我想大概 #!/usr/bin/env python def input_string(question=""): """A function that works for both, Python 2.x and Python 3.x. It asks the user for input and returns it as a string
#!/usr/bin/env python
def input_string(question=""):
"""A function that works for both, Python 2.x and Python 3.x.
It asks the user for input and returns it as a string.
"""
import sys
if sys.version_info[0] == 2:
return raw_input(question)
else:
return input(question)
# Example
answer = input_string("What is your name? ")
print(answer)
也许是个好办法,但我不太确定
是否有“官方”建议(如政治公众人物)如何应对?
现在是怎么做到的?您有几个选择 选项1-仅使用2to3 是一个python程序,它将适当地转换您的程序,从而解决此问题 从以上链接: 下面是一个示例Python 2.x源文件example.py: 可以通过命令行上的2to3将其转换为Python 3.x代码: 打印与原始源文件的差异。 2to3还可以将所需的修改直接写回源代码 文件(除非同时给出-n,否则会备份原始文件。) 使用-w标志启用回写更改: 转换后,example.py如下所示: 选项2-使用
尝试
/块除外
这将帮助您避免每次更改某些内容时都必须重新运行2to3。为了避免这样做,你可以把它放在这样一个函数中
def real_input(astring=""):
try:
return raw_input(astring)
except NameError:
return input(astring)
然后只要在需要用户输入时使用real\u input()
就可以了
选项1-仅使用2to3
是一个python程序,它将适当地转换您的程序,从而解决此问题
从以上链接:
下面是一个示例Python 2.x源文件example.py:
可以通过命令行上的2to3将其转换为Python 3.x代码:
打印与原始源文件的差异。
2to3还可以将所需的修改直接写回源代码
文件(除非同时给出-n,否则会备份原始文件。)
使用-w标志启用回写更改:
转换后,example.py如下所示:
选项2-使用尝试
/块除外
这将帮助您避免每次更改某些内容时都必须重新运行2to3。为了避免这样做,你可以把它放在这样一个函数中
def real_input(astring=""):
try:
return raw_input(astring)
except NameError:
return input(astring)
然后只要在需要用户输入时使用real\u input()
try:
input = raw_input
except NameError:
pass
print("Hi " + input("Say something: "))
这个怎么样
try:
input = raw_input
except NameError:
pass
print("Hi " + input("Say something: "))
你看过这个吗?此外,请注意此处的建议:。另一种方法是简单地用Python 2.x编写应用程序,然后使用2to3
将其转换。2to3会将源代码从2.x Python代码更改为3.x Python代码。如果我错了,请纠正我,但是生成的代码将不再适用于Python2.x。那不是我想要的。我想要同时适用于Python2和Python3的代码。你想要同样的脚本同时适用于2.x和3.x吗?你看过这个吗?此外,请注意此处的建议:。另一种方法是简单地用Python 2.x编写应用程序,然后使用2to3
将其转换。2to3会将源代码从2.x Python代码更改为3.x Python代码。如果我错了,请纠正我,但是生成的代码将不再适用于Python2.x。那不是我想要的。我需要同时适用于Python 2和Python 3的代码。是否希望在2.x和3.x中使用相同的脚本?在Python 2.x中有input
,您只需覆盖它。我通常会完全这样做,但将其命名为其他名称,如input\u func
。然后,我将input
赋值,而不是except
块下的pass
。与下面的答案相比,它的优点是只需在文件顶部尝试一次,而不是每次需要用户输入一次。@J0HN是这样吗?这正是OP想要的。Python2.xinput
是邪恶的。你永远不想用它。99%的时间你想使用int(raw\u input())
或float(raw\u input())
其他0.99%的时间你想使用ast.literal\u eval(raw\u input())
并且只有0.001%的时间你真正想使用eval(raw\u input())
[这就是input
所做的]。@Bakuriu,谢谢你的评论。是的,我知道这种行为,不,我不认为这是覆盖内置的借口。不,这是OP有问题的一种可能的解决方案,但不完全是要求的。@J0HN除了OP没有覆盖内置的。要覆盖内置内容,请执行以下操作:try:\uuuu内置内容\uuuuu.input=raw\u输入;除了名称错误:通过
。本文中的解决方案创建了一个名为input
的全局变量。它不会干扰其他模块,因此使用起来非常安全。事实上,它实施了一个良好的实践。python 2.x中有input
,而您只是覆盖了它。我通常会这样做,但将其命名为其他名称,如input\u func
。然后,我将input
赋值,而不是except
块下的pass
。与下面的答案相比,它的优点是只需在文件顶部尝试一次,而不是每次需要用户输入一次。@J0HN是这样吗?这正是OP想要的。Python2.xinput
是邪恶的。你永远不想用它。99%的时间你想使用int(raw\u input())
或float(raw\u input())
其他0.99%的时间你想使用ast.literal\u eval(raw\u input())
并且只有0.001%的时间你真正想使用eval(raw\u input())
[这就是input
所做的]。@Bakuriu,谢谢你的评论。是的,我知道这种行为,不,我不认为这是覆盖内置的借口。不,这是OP有问题的一种可能的解决方案,但不完全是要求的。@J0HN除了OP没有覆盖内置的。要覆盖内置代码,请执行以下操作:try:\uuuuu内置\uuuuu.input=ra
try:
return raw_input(question)
except NameError:
return input(question)
def real_input(astring=""):
try:
return raw_input(astring)
except NameError:
return input(astring)
try:
input = raw_input
except NameError:
pass
print("Hi " + input("Say something: "))