0

異なるバージョンの python に対して異なる関数 (同じボディを持つ) を定義する方法はありますか?

具体的には、python 2.7 の場合は次のように定義します。

def __unicode__(self): 

Python 3 の場合は次のように定義します。

def __str__(self):

ただし、どちらも同じコード/本体になります。どちらも class のメンバーでなければなりません。

4

2 に答える 2

3

互換性ライブラリがありますが。2 つが最も広く知られているため、互換性ライブラリなしで生活する必要がある場合もありますsixfutureいつでも独自のクラス デコレータを作成し、それを 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__
于 2015-04-13T08:11:42.450 に答える
3

サードパーティのsixライブラリは、クラスをメソッドで受け取り、それをPython 2 に変換python_2_unicode_compatibleするクラス デコレータを定義します。__str____unicode__

于 2015-04-13T08:04:18.550 に答える