了解全局名称和Python2和3

时间:2013-02-26 18:49:14

标签: python python-2.7 python-3.x

作为Python的新手,我有点学习Python2和3之间的一些差异。在Python课程中,似乎有些事情需要在代码中进行更改才能使其工作在3.这是代码;

def clinic():
    print "In this space goes the greeting"
    print "Choose left or right"
    answer = raw_input("Type left or right and hit 'Enter'.")
    if answer == "LEFT" or answer == "Left" or answer == "left":
        print "Here is test answer if you chose Left."
    elif answer == "RIGHT" or answer == "Right" or answer == "right":
        print "Here is the test answer if you chose Right!"
    else:
        print "You didn't make a valid choice, please try again."
        clinic()

clinic()

要在Python 3中完成这项工作,需要更改打印语法(添加parens),但出现的另一个问题是错误“NameError:全局名称'raw_input'未定义”。我在学习中经常看到这个问题。当我在Python2中运行它时似乎没有出现,但在3中它似乎需要将它声明为全局。但是,当我向函数添加“global raw_input”时,它似乎不起作用(在其他情况下,每次我都这样做时它都有效。)有人能告诉我我做错了什么吗?另外,我听说声明全局变量是一种不习惯的坏习惯,那么处理它们的最佳方法是什么?

2 个答案:

答案 0 :(得分:7)

raw_input()已在Python 3中重命名,请改用input()(并删除旧的Python 2 input())。请参阅PEP 3111

有关详尽的概述,请参阅What's new in Python 3.0。还有Dive into Python 3 overview

答案 1 :(得分:0)

修改Martijn's answer,这是你可以为这些小的不兼容性做的一般技巧:

try:
    input_func = raw_input
except NameError:
    raw_input = input

之后,您可以在脚本中使用raw_input和Py2和Py3。 unicodebyte类型可能需要类似的内容。

由于您表示您对从> = Py2.7迁移到Py3感兴趣,您应该知道Python 2.7主要是Python 2.6,其中包含大量Py3内容。

因此,虽然print函数在技术上仍然是Py2.7中的语句,而Py3中的函数,但Py2.7 print确实接受元组。这使得一些Py3语法在Py2.7中起作用。简而言之,您可以使用parantheses:

print("Here is the test answer if you chose Right!")

要打印空行,两种版本中使用的最佳方法是

print("")

默认情况下,在不添加换行符的情况下进行打印我正在回归write(),例如:

import sys
sys.stdout.write("no newline here")
sys.stdout.write(" -- line continued here, and ends now.\n")

另一方面,对于很多Py3的东西,你可以通过从the future导入东西来实际在Py2.7中启用完整的Py3语法:

from __future__ import print_function

然后您无需在write()print()之间切换。

在实际应用程序中,这一切都取决于您是否以及如何与其他人的代码(包,您团队中的其他开发人员,代码发布要求)进行交互以及您的Python版本更改路线图。