有没有办法为不同版本的python定义不同的函数(使用相同的主体)?
具体来说,对于python 2.7定义:
def __unicode__(self):
并且对于python 3定义:
def __str__(self):
但两者都有相同的代码/正文。两人也必须是班级成员。
答案 0 :(得分:3)
第三方six
库定义了一个python_2_unicode_compatible
类装饰器,它使用__str__
方法获取类,并在Python 2上将其转换为__unicode__
。
答案 1 :(得分:3)
虽然有兼容性库; six
和future
是最广为人知的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__