文字列リテラルを除いて、Python 3 で実行されるスクリプトがあります。Python 2.x では、文字列リテラルの前に u'' を付ける必要があり、python 3 はそれを理解できません。それをどのように解決するのですか?
3 に答える
いくつかのオプション:
u("a\u0020")
次の互換性関数を使用して、すべての Unicode 文字列を として書き込むことができます。b('')
同様のトリックにより、Python 2.5 でバイトをサポートできます。ただし、追加の関数呼び出しにより、パフォーマンスがわずかに低下します。(これは、six 2/3 互換性ライブラリが使用するものです)。
if sys.version_info < (3,0):
def u(s):
return s.decode("unicode_escape")
else:
def u(s):
return s
次に、Python 2.5 をサポートする必要がない場合は、 を使用できますfrom __future__ import unicode_literals
。そのモジュールの Python 2.6/2.7 文字列は、3.x と同じように動作します。
最後に、Python 3.0-3.2 をサポートする必要がない場合は、Python 3.3が一般的な圧力 (主に webframework 開発者から) によりプレフィックスu''
のサポートを再度追加したため、を使用できます。u''
Python 2.xで実行するときにこれを試してください:
>>> from __future__ import unicode_literals
>>> s=['xx','yy','zz','aa']
>>> s
[u'xx', u'yy', u'zz', u'aa']
Python 3.xで実行した場合と同じ:
>>> from __future__ import unicode_literals
>>> s=['xx','yy','zz','aa']
>>> s
['xx', 'yy', 'zz', 'aa']
通常は と呼ばれるラッパー メソッドを使用しますu
。
これが私のバージョンです (同じコードで Python 2 と Python 3 の両方をサポートする場合は、 Porting to Python 3から読む必要があります):
import sys
if sys.version < '3':
import codecs
def u(x):
return codecs.unicode_escape_decode(x)[0]
else:
def u(x):
return x
次に、u'String' の代わりに u('String') を使用します。ASCII 以外のテキストの場合は\x00
、\u0000
または\N{name}
構文を使用する必要があります。
Python 3.3 では、これを避けるために u'' 構文が再びサポートされる予定ですが、まだベータ版です。
このfrom __future__ import unicode_literas
機能は、ネイティブ文字列を作成する代わりにラッパーが必要になるため、ほとんど役に立たないことが証明されていますが、これは改善ではありません。