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文字のシーケンスであるため、このようなユニコード文字列を返し、と (すべての文字列がユニコードであるため)の両方 であると期待しますが、 。すべての周りの混乱...True
str(''))
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'>