为不同版本的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】:
虽然有兼容性库; six
和 future
是最广为人知的两个,有时需要在没有兼容性库的情况下生活。你总是可以编写自己的类装饰器,并把它写成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定义不同的函数的主要内容,如果未能解决你的问题,请参考以下文章