異なるバージョンの python に対して異なる関数 (同じボディを持つ) を定義する方法はありますか?
具体的には、python 2.7 の場合は次のように定義します。
def __unicode__(self):
Python 3 の場合は次のように定義します。
def __str__(self):
ただし、どちらも同じコード/本体になります。どちらも class のメンバーでなければなりません。
異なるバージョンの python に対して異なる関数 (同じボディを持つ) を定義する方法はありますか?
具体的には、python 2.7 の場合は次のように定義します。
def __unicode__(self):
Python 3 の場合は次のように定義します。
def __str__(self):
ただし、どちらも同じコード/本体になります。どちらも class のメンバーでなければなりません。
互換性ライブラリがありますが。2 つが最も広く知られているため、互換性ライブラリなしで生活する必要がある場合もありますsix。futureいつでも独自のクラス デコレータを作成し、それを say に入れることができますmypackage/compat.py。以下は、クラスを Python 3 形式で記述し、必要に応じて 3 対応クラスを Python 2 に変換するのにうまく機能します ( nextvs__next__などにも同じことが使用できます)。
import sys
if sys.version_info[0] < 3:
def py2_compat(cls):
if hasattr(cls, '__str__'):
cls.__unicode__ = cls.__str__
del cls.__str__
# or optionally supply an str that
# encodes the output of cls.__unicode__
return cls
else:
def py2_compat(cls):
return cls
@py2_compat
class MyPython3Class(object):
def __str__(self):
return u'Here I am!'
(PyPy 3 であり、Python 3.3+ とのみ互換性のある u'' プレフィックスを使用していることに注意してください。したがって、Python 3.2 との互換性が必要な場合は、それに応じて調整する必要があります)
Python 2 で を UTF-8 に__str__エンコードするメソッドを提供するには、をに置き換えることができます。__unicode__del cls.__str__
def __str__(self):
return unicode(self).encode('UTF-8')
cls.__str__ = __str__
サードパーティのsixライブラリは、クラスをメソッドで受け取り、それをPython 2 に変換python_2_unicode_compatibleするクラス デコレータを定義します。__str____unicode__