Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何编写使用“raw_input”来处理Python 2.x和3.x的应用程序?_Python_Python 2.7_Python 3.x_Project Management - Fatal编程技术网

我应该如何编写使用“raw_input”来处理Python 2.x和3.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

我看到一些代码(例如)可能需要在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.
    """
    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.x
input
是邪恶的。你永远不想用它。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.x
input
是邪恶的。你永远不想用它。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: "))