26

Python 2.6用のコードを書いていますが、Python 3を念頭に置いて、

from __future__ import unicode_literals

一部のモジュールの上部にあります。言い換えれば、私は(将来それらを避けるために)トラブルを求めていますが、ここでいくつかの重要な知識が不足している可能性があります。ファイルパスを表す文字列を渡して、オブジェクトを次のように簡単にインスタンス化できるようにしたい

MyObject('H:\unittests')

Python 2.6では、これは問題なく機能します。。で始まるディレクトリの場合でも、二重の円記号や生の文字列を使用する必要はありませ'\u..'ん。これはまさに私が望んでいることです。この方法では、、、、、、、、および(問題が残るだけ)のような特殊文字の前のものを含め、すべての単一の出現が''として解釈__init__されることを確認し\ます。また、(ローカル)エンコーディングを使用して指定された文字列をUnicodeにデコードすると、期待どおりに機能します。\\\a\b\f\n\r\t\v\x

Python 3.xの準備をし、エディターで実際の問題をシミュレートします(Python 2.6のクリーンなコンソールから開始します)。次のようになります。

>>> '\u'
'\\u'
>>> r'\u'
'\\u'

(ここまでOK:'\u'ローカルエンコーディングを使用してコンソールによってエンコードされます)

>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

つまり、(ユニコード)文字列はユニコードとしてまったく解釈されず、ローカルエンコーディングで自動的にデコードされません。生の文字列の場合でも:

>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX

u'\u':と同じ

>>> u'\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

また、 unicode_literalsをインポートすると、すべての文字列型がユニコードになるはずなので、isinstance(str(''), unicode)戻ることを期待します(そうではありません)。(編集:) Python 3では、すべての文字列がUnicode文字のシーケンスであるため、このようなユニコード文字列を返し、と (すべての文字列がユニコードであるため)の両方 であると期待しますが、 。すべての周りの混乱...Truestr(''))type(str(''))<type 'unicode'><type 'str'><type 'unicode'> is not <type 'str'>

質問

  • ''を含む文字列を渡すにはどうすればよい\uですか?(''を書かずに\\u
  • from __future__ import unicode_literals完全なPython3文字列環境を取得できるように、Python 3に関連するすべてのUnicode変更を実際に実装していますか?

編集:Python 3では、<type 'str'>はUnicodeオブジェクトであり、<type 'unicode'>単に存在しません。私の場合、Python3で動作するPython2(.6)のコードを記述したいと思います。しかしimport unicode_literals、私がそうすると、文字列が<type 'unicode'>次の理由であるかどうかを確認できません。

  • unicode名前空間の一部ではないと思います
  • unicodeが名前空間の一部である場合<type 'str'>、同じモジュールで作成された場合、のリテラルは引き続きユニコードです。
  • type(mystring)Python3では常に<type 'str'>Unicodeリテラルを返します

# coding: UTF-8私のモジュールは、上部のコメントによって「utf-8」でエンコードされていましたが、 locale.getdefaultlocale()[1]「cp1252」を返します。したがってMyObject('çça')、コンソールから呼び出すと、Python 2では「cp1252」としてエンコードされMyObject('çça')、モジュールから呼び出す場合は「utf-8」としてエンコードされます。Python 3では、エンコードされませんが、Unicodeリテラルになります。

編集:

u私は(またはそのことについては)前に「\」を使用しないようにすることを許可されることへの希望をあきらめましたx。また、インポートの制限も理解していunicode_literalsます。ただし、文字列をモジュールからコンソールに、またはその逆に、それぞれ異なるエンコーディングで渡すことの多くの可能な組み合わせ、およびそのインポートの有無とPython2とPython3の組み合わせにunicode_literals加えて、実際のテストで概要を作成したいと思いました。したがって、以下の表。ここに画像の説明を入力してください

言い換えれば、Python 3でtype(str(''))は戻りませんが、Python2の問題はすべて回避されているようです。<type 'str'><class 'str'>

4

4 に答える 4

20

私の知る限り、すべてfrom __future__ import unicode_literals文字列リテラルを文字列型ではなく Unicode 型にするだけです。あれは:

>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>

しかしstr、 とunicodeはまだ異なるタイプであり、以前と同じように動作します。

>>> type(str(''))
<type 'str'>

常に、strタイプです。

あなたのr'\u'問題については、 ru'\u' なしと同等であるため、設計によるものですunicode_literals。ドキュメントから:

「r」または「R」プレフィックスを「u」または「U」プレフィックスと組み合わせて使用​​すると、\uXXXX および \UXXXXXXXX エスケープ シーケンスが処理されますが、他のすべてのバックスラッシュは文字列に残されます。

おそらく、python2 シリーズでの字句解析器の動作から来ています。python3 では、あなた (そして私) が期待するように動作します。

バックスラッシュを 2 回入力すると、\u解釈されませんが、バックスラッシュが 2 つ表示されます。

バックスラッシュは、前にバックスラッシュを付けてエスケープできます。ただし、両方とも文字列に残ります

>>> ur'\\u'
u'\\\\u'

したがって、私見では、2 つの簡単なオプションがあります。

  • 生の文字列を使用せず、バックスラッシュをエスケープします (python3 と互換性があります):

    'H:\\unittests'

  • スマートになりすぎて、Unicode コードポイントを利用してください ( python3 と互換性がありません):

    r'H:\u005cunittests'

于 2011-09-29T19:38:04.343 に答える
0

私にとって、この問題はバージョンが最新ではないことに関連しています。numpy

修正するには:

conda install -f numpy
于 2017-02-12T14:59:34.170 に答える
-2

パス(Windowsの場合)や正規表現などのバックスラッシュを含む文字列リテラルを作成する場合は、生の文字列を使用してください。それが彼らの目的です。

于 2011-09-29T19:40:41.293 に答える