【问题标题】:How to align a list in an __str__ output?如何在 __str__ 输出中对齐列表?
【发布时间】:2023-03-21 23:26:02
【问题描述】:

当我在下面的代码中添加对齐方式时

class MyClass():

    def __init__(self, a = None, b = [], c = None):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return "a: {}, b: {}, c:{}".format(
            self.a, self.b, self.c)

if __name__ == "__main__":
    obj = MyClass(1, [1,2], 2)
    print(obj)

尤其是它的列表参数,比如

class MyClass():

    def __init__(self, a = None, b = [], c = None):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return "a: {:<3}, b: {:<3}, c:{:<3}".format(
            self.a, self.b, self.c)

if __name__ == "__main__":
    obj = MyClass(1, [1,2], 2)
    print(obj)

我收到一个错误:

TypeError: unsupported format string passed to list.__format__

这样做的正确方法是什么?

【问题讨论】:

    标签: python python-3.x string list


    【解决方案1】:

    使用conversion flag强制列表的字符串表示:

    def __str__(self):
        return "a: {:<3}, b: {!s:<3}, c:{:<3}".format(
            self.a, self.b, self.c)
    

    发生这种情况的原因是list.__format__ 不支持格式字符串迷你语言中的对齐。 format string syntax 的文档详细介绍了此转换功能的工作原理。

    conversion 字段在格式化之前会导致类型强制。通常,格式化值的工作是由值本身的__format__() 方法完成的。但是,在某些情况下,需要强制将类型格式化为字符串,从而覆盖其自己的格式化定义。通过在调用__format__()之前将值转换为字符串,绕过了正常的格式化逻辑。

    f-strings 也可以使用同样的东西,语法如下:

    >>> f"{[1, 2]!s:>10}"
    '    [1, 2]'
    

    【讨论】:

    • 谢谢,但结果与 self.b 没有对齐,就像根本不应用 s:&lt;3 一样。
    • 那是因为 [1, 2] 的宽度是 5,它已经比 3 宽了。改用 {!s:&lt;10},你会发现它确实有效。
    【解决方案2】:

    list 对象似乎不支持对齐。尝试将您的代码更改为:

    def __str__(self):
        return "a: {:<3}, b: {:<3}, c:{:<3}".format(
            self.a, str(self.b), self.c)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多