その__future__
ステートメントの後、リテラルはstr
オブジェクトではなくunicode
オブジェクトです。それが声明の要点です。__future__
これについては、ドキュメントや彼らが参照するPEP 3112bytes
(文字列リテラルが現在 Unicode であることを考えると、Python 2 スタイルのオブジェクトの書き方についてほとんどの時間を費やしています) のいずれにもあまり詳しく説明されていません)。しかし、それはそれがすることです。
対話型インタープリターでこれをテストできます。
>>> 'abc'
'abc'
>>> from __future__ import unicode_literals
>>> 'abc'
u'abc'
したがって、バージョン 2 では、2 つのstr
オブジェクトを一緒に追加しますが、これは簡単です。しかし、バージョン 1 では、 aunicode
と aを追加していstr
ます。str
これは、デフォルトのエンコーディングである ASCII を使用して を に自動的に変換することで機能しunicode
ますが、これは機能しません。
これを修正する最も簡単な方法はproject
、 a をunicode
それ自体にすることです。
def print_project(self, project):
project_prefix = "Project: "
print (project_prefix + unicode(project))
実際、これは__future__
ステートメントの有無にかかわらず機能します— with it, project_prefix
is already unicode
; それがなければ、str
ASCII からデコードされますが、ASCII であるため問題ありません。
非 ASCII リテラルを (project_prefix で) 使用したい場合、およびコードを__future__
ステートメントの有無にかかわらず機能させたい場合は、手動でデコードする必要があります。
def print_project(self, project):
project_prefix = "Project: ".decode('utf-8')
print (project_prefix + unicode(project))
(もちろん、ソース ファイルのコーディング宣言と一致していることを確認してください。)
コメントでは、次のように尋ねます。
import ステートメントを使用する場合__future__
、.py ファイルの先頭でコーディングを定義する必要がありますか? # -- コーディング: utf-8 --
短い答えはイエスです。
ドキュメントがこれをどこかで直接カバーしているかどうかはわかりませんが、考えてみれば、それ以外に機能する方法はありません。
8 ビット ソース コードのリテラルを Unicode として解釈するために、Python コンパイラはそれらをデコードする必要があります。それらを何からデコードするかを知る唯一の方法は、コーディング宣言です。
これを別の見方で見ると、この__future__
ステートメントは、文字列リテラルに関する限り Python 2 を Python 3 のように動作させ、Python 3 はコーディング宣言を必要とするということです。
これを自分でテストしたい場合は、以下を UTF としてコピーし、テキスト ファイルに貼り付けます。(これを行うには、コーディング宣言を理解しないエディターを使用する必要があることに注意してください — emacs のようなものは、保存時に UTF-8 テキストを Latin-1 に変換する場合があります!)。
# -*- coding: latin-1 -*-
from __future__ import unicode_literals
print repr('é')
これを実行すると、u'\xc3\xa9'
ではなくが出力されu'\xe9'
ます。
コーディングを指定しない場合、Python 3 はデフォルトで UTF-8 になりますが、Python 2.5-2.7 はunicode_literals
. したがって、コーディング宣言が必要です。(3.x であっても、常に安全に追加できます。また、多くのプログラマーのテキスト エディターを満足させるものでもあります。そのため、Latin-1 や Shift-JIS を誰も覚えていない未来に到達するまで、維持する価値のある習慣かもしれません。 cp1250 など)。