什么是使用不同格式选项实现__str__方法的Pythonic方法?

时间:2015-03-06 17:46:46

标签: python python-3.x string-formatting

我想创建一个__str__方法,根据用户的选择创建各种格式的字符串。

我提出的最好的方法是制作__str__(**kwargs)方法,这看起来没问题,但它与str(obj)print(obj)不兼容。换句话说,我必须使用print(obj.__str__(style='pretty'))而不是print(obj, style='pretty')

1 个答案:

答案 0 :(得分:7)

改为实施object.__format__() method,然后用户可以指定format() functionstr.format() method所需的格式:

print(format(obj, 'pretty'))

print('This object is pretty: {:pretty}'.format(obj))

您可能希望将格式的大部分处理委托给str.__format__

def __format__(self, spec):
    if spec.endswith('pretty'):
        prettified = self.pretty_version()
        return prettified.__format__(spec[:-6])
    return str(self).__format__(spec)

这样,您仍然可以支持默认str.__format__方法支持的所有字段宽度和填充对齐选项。

演示:

>>> class Foo():
...     def __str__(self):
...         return 'plain foo'
...     def pretty_version(self):
...         return 'pretty foo'
...     def __format__(self, spec):
...         if spec.endswith('pretty'):
...             prettified = self.pretty_version()
...             return prettified.__format__(spec[:-6])
...         return str(self).__format__(spec)
... 
>>> f = Foo()
>>> print(f)
plain foo
>>> print(format(f))
plain foo
>>> print(format(f, 'pretty'))
pretty foo
>>> print(format(f, '>20pretty'))
          pretty foo
>>> print('This object is pretty: {:^20pretty}!'.format(f))
This object is pretty:      pretty foo     !