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

what is the Pythonic way to implement a __str__ method with different format options?

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

我想出的最好办法是制作一个 __str__(**kwargs) 方法,这似乎工作正常,但它与 str(obj)print(obj) 不兼容。换句话说,我必须使用 print(obj.__str__(style='pretty')) 而不是 print(obj, style='pretty').

实施 object.__format__() method instead, and a user can then specify the formatting required with the format() function and str.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     !