2016-10-31 7 views
1

どのようにPythonの文字列に依存しないPythonのバージョンを使用していますか?Pythonの文字列をバージョンに無関係にする方法

私はPython 2.7とPython 3. *で動作するコードを維持しようとしています。私は直感的なエラーに遭遇しています。

print('Job: %s' % job) 
が、それは誤りではPython 3.3に失敗します:たとえば、これは、Python 2.7で完璧に動作

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27: ordinal not in range(128) 

私はその行を変更した場合:

print(('Job: %s' % job).encode('utf-8')) 

修正されていますそれはPython 3.3で...しかしそれはPython 2.7を壊します、そして今全く同じエラーを投げます。

Pythonで文字列を管理しようとすると、モルモットのように感じられます。 Pythonのすべてのバージョンで動作するように、文字列を確実にエンコードする方法はありますか?

+1

このタイトルは少し誤解を招くもので、微調整が必​​要な場合があります。 –

+0

''ジョブ:%s '%job'はPython 2とPython 3の両方で失敗することがあります。 Python 2では、間違ったことを静かにします。 – roeland

+0

'job'にあるものを表示します。それは重要です。 –

答えて

5

これは、Python 2.7と3.3+の両方で動作するはずです:

print(u'Job: {}'.format(job)) 

それでも失敗する場合は、あなたの問題は別の場所に存在します。何らかの形でjobが既にエンコードされており、__str____unicode__の魔法を正しく定義する必要があります。

+0

非常に初期のpython3のいくつかのバージョンでは動作しません。 3.0、3.1、...私はそれが '3.3'で少なくとも動作していると確信しています。そして、誰かが本当に初期のpython3のバージョンを実際に使っているとは思わないでしょう。関連するPEPは(https://www.python.org/dev/peps/pep-0414/) – mgilson

+0

@ mgilsonです。ああ、ええと、接頭辞uのために3.2で構文エラーがあります。ありがとうございました。 – wim

+0

これは私のためには機能しません。しかし、はい、Py3では 'self .__ unicode __()'、Py2では 'self .__ unicode __()。encode( 'utf8')'を返す 'Job .__ unicode__'と' Job .__ str__'の両方を実装しました。 – Cerin

0

sixライブラリは、このようなもののために構築されています:

import six 
print("%s" % six.u(job)) 
+0

それは私に同じエラーを与える。 – Cerin

+0

ダーン。じゃあ心配しないで。 –

0

ソリューションは、あなたがターゲットにしたいの正確なPythonのバージョンに依存しますが、2.7は後方互換性のために十分であるならば、あなたは

を置くことができます
from __future__ import unicode_literals 

Python 3ではノーオペレーション(少なくとも3.2+以上)があり、Python 2.7で期待したことをします。

bash$ python 
Python 2.7.11 (default, Dec 26 2015, 17:47:15) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from __future__ import unicode_literals 
>>> type('hello') 
<type 'unicode'> 
>>> repr('Götterdämmerung') 
"u'G\\xf6tterd\\xe4mmerung'" 

は「未来」は本当に3.0-3.2をカバーしていないことを指摘http://python-future.org/unicode_literals.htmlでの注意事項を参照してください。このように、この特定のことは、私が3.1でも期待しているように機能するようです。

関連する問題