为不同版本的python定义不同的函数

时间:2015-04-13 08:00:38

标签: python multiple-versions

有没有办法为不同版本的python定义不同的函数(使用相同的主体)?

具体来说,对于python 2.7定义:

def __unicode__(self): 

并且对于python 3定义:

def __str__(self):

但两者都有相同的代码/正文。两人也必须是班级成员。

2 个答案:

答案 0 :(得分:3)

第三方six库定义了一个python_2_unicode_compatible类装饰器,它使用__str__方法获取类,并在Python 2上将其转换为__unicode__

答案 1 :(得分:3)

虽然有兼容性库; sixfuture是最广为人知的2,有时需要没有兼容性库。您总是可以编写自己的类装饰器,并将其放入说mypackage/compat.py。以下内容适用于以Python 3格式编写类,并在需要时将3-ready类转换为Python 2(同样可用于next vs __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+兼容,因此如果您需要与Python 3.2兼容,则需要相应调整)


要提供在Python 2中将__str__编码为UTF-8的__unicode__方法,您可以将del cls.__str__替换为

def __str__(self):
    return unicode(self).encode('UTF-8')
cls.__str__ = __str__