2

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 でこれを機能させるには、出力構文を変更する (括弧を追加する) 必要がありますが、別の問題として「NameError: グローバル名 'raw_input' が定義されていません」というエラーが発生します。この問題が私の学習で頻繁に出てくるのを見てきました。Python2で実行すると出てこないようですが、3ではグローバルとして宣言する必要があるようです。ただし、関数に「global raw_input」を追加すると、機能しないようです (それ以外の場合は、実行するたびに機能します)。誰かが私が間違っていることを教えてもらえますか? また、必要のないときにグローバルを宣言するのは悪い習慣だと聞いたことがありますが、それらを処理する最良の方法は何ですか?

4

2 に答える 2

7

raw_input()Python 3で名前が変更され、input()代わりに使用します(古いPython 2input()は削除されました)。PEP3111を参照してください。

完全な概要については、Python3.0の新機能を参照してください。Dive intoPython3の概要もあります。

于 2013-02-26T18:50:39.650 に答える
0

Martijn 's answerを修正して、これらの種類の小さな非互換性に対して実行できる一般的なトリックを次に示します。

try:
    input_func = raw_input
except NameError:
    raw_input = input

raw_inputその後、スクリプトで Py2 と Py3 の両方を使用できます。unicode、 およびタイプについても同様のことが必要になる場合がありbyteます。

>= Py2.7 から Py3 への移行に関心があることを示したので、Python 2.7 はほとんどが Python 2.6 であり、多くの Py3 がバックポートされていることを知っておく必要があります。

そのため、印刷関数は技術的には Py2.7 のステートメントであり、Py3 の関数ですが、Py2.7printはタプルを受け入れます。これにより、Py3 構文の一部が Py2.7 で機能するようになります。つまり、括弧を使用できます。

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 のものについては、将来のものをインポートすることで、Py2.7 で完全な Py3 構文を実際に有効にすることができます。

from __future__ import print_function

write()その後、とを切り替える必要はありませんprint()

実際のアプリケーションでは、他の人のコード (パッケージ、チーム内の他の開発者、コード公開の要件) と対話する必要があるかどうか、およびその方法と、Python のバージョン変更のロードマップにすべて依存します。

于 2013-02-27T10:20:27.397 に答える