1

文字列リテラルを除いて、Python 3 で実行されるスクリプトがあります。Python 2.x では、文字列リテラルの前に u'' を付ける必要があり、python 3 はそれを理解できません。それをどのように解決するのですか?

4

3 に答える 3

1

いくつかのオプション:

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''

于 2012-08-25T13:31:18.480 に答える
1

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']
于 2012-08-25T12:09:25.977 に答える
0

通常は と呼ばれるラッパー メソッドを使用します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機能は、ネイティブ文字列を作成する代わりにラッパーが必要になるため、ほとんど役に立たないことが証明されていますが、これは改善ではありません。

于 2012-08-25T13:33:03.707 に答える