为不同版本的 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.
虽然有兼容库; six
和 future
是最广为人知的两个,有时需要在没有兼容库的情况下生活。你总是可以编写自己的 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__
有没有办法为不同版本的 python 定义不同的函数(具有相同的函数体)?
具体来说,对于 python 2.7 定义:
def __unicode__(self):
并且对于 python 3 定义:
def __str__(self):
但两者将具有相同的代码/正文。两者也必须是 class.
的成员第三方 six
库定义了一个 python_2_unicode_compatible
class 装饰器,它接受一个带有 __str__
方法的 class 并将其转换为 __unicode__
在 Python 2.
虽然有兼容库; six
和 future
是最广为人知的两个,有时需要在没有兼容库的情况下生活。你总是可以编写自己的 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__