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

Posted

技术标签:

【中文标题】为不同版本的python定义不同的函数【英文标题】:define different function for different versions of python 【发布时间】:2015-06-18 11:30:24 【问题描述】:

有没有办法(具有相同的主体)?

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

def __unicode__(self): 

对于 python 3 定义:

def __str__(self):

但两者都将具有相同的代码/正文。两者都必须是类的成员。

【问题讨论】:

为什么不总是定义两者并让它们调用包含实际实现的第三个函数? @deceze 因为它不起作用。 @deceze:__str__ 的接口在 Python 2 和 3 之间发生了变化。在 Python 2 中,它必须返回字节,在 Python 3 中,它必须返回 Unicode。 @Martijn 然后“适配器”方法__unicode__ 和/或__str__ 可以进行这种简单的转换。这基本上就是答案的作用。 @deceze __str__ 在 Python 2 和 Python 3 中都存在,其返回值的定义必须不同。从本质上讲,这会将我的代码在每个初始化时间执行一次的条件更改为每次调用一次,几乎不再方便了。 【参考方案1】:

虽然有兼容性库; sixfuture 是最广为人知的两个,有时需要在没有兼容性库的情况下生活。你总是可以编写自己的类装饰器,并把它写成mypackage/compat.py。以下内容非常适合以 Python 3 格式编写类,并在需要时将 3-ready 类转换为 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!'

(注意我们使用的是 u'' 前缀,它是 PyPy 3 和 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__

【讨论】:

【参考方案2】:

第三方 six 库定义了一个 python_2_unicode_compatible 类装饰器,该类装饰器采用 __str__ 方法并将其转换为 Python 2 上的 __unicode__

【讨论】:

以上是关于为不同版本的python定义不同的函数的主要内容,如果未能解决你的问题,请参考以下文章

python的父类和子类中关于继承的不同版本的写法

Anaconda不同版本python环境的安装及切换

相同算法的 C++ 和 Python 版本给出不同的结果

Python不同版本之间的切换方法

如何让不同版本的 Python 包共存

python版本有啥不同