为不同版本的 python 定义不同的功能

define different function for different versions of python

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

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

def __unicode__(self): 

并且对于 python 3 定义:

def __str__(self):

但两者将具有相同的代码/正文。两者也必须是 class.

的成员

第三方 six 库定义了一个 python_2_unicode_compatible class 装饰器,它接受一个带有 __str__ 方法的 class 并将其转换为 __unicode__ 在 Python 2.

虽然有兼容库; sixfuture 是最广为人知的两个,有时需要在没有兼容库的情况下生活。你总是可以编写自己的 class 装饰器,并将其放入 say mypackage/compat.py 中。以下内容非常适合以 Python 3 格式编写 class 并在需要时将 3-ready class 转换为 Python 2(同样可用于 next 对比 __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 的 u'' 前缀,并且 Python 3.3+ 只兼容,所以如果你需要与 Python 3.2 兼容,那么你需要相应调整)


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

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