使用vars或__dict__格式化Python固定宽度字符串

3

我正在开发一个Python项目,希望使用一些简便方法来格式化类数据的字符串。更具体地说,我想能够使用类似于'{a}{b}{c}'.format(**vars(self), [strlen, strlen, strlen])的东西,并指定显示的每个属性的字符串长度。例如:

class Dummy(object):
    def __init__(self):
        self.value1 = 'A VALUE'
        self.value2 = 'ANOTHER VALUE'
        self.value3 = 'THIRD VALUE'

    def to_s(self):
        # want value1 to be 20 chars
        # value2 to be 8 chars
        # value3 to be 10 chars
        # is something similar to this possible
        return '{value1},{value2},{value3}'.format(**vars(self), [20, 8, 10])


    def to_s2(self):
        # or will I have to reference each explicitly and specify the either padding or slicing?
        return '{},{},{}'.format(self.value1.ljust(20), self.value2[:8], self.value3[:10])

我知道这可能是一个不太可能的要求,但其中有几个类别拥有30或40个属性,如果可以做到这一点,将会使生活变得更加容易。

谢谢。

2个回答

2
您可以在{}字段内嵌套{}字段,但仅允许一级嵌套。幸运的是,实际上只需要一级嵌套。 :)
来自格式化字符串语法
引用:

format_spec 字段还可以包括其中的嵌套替换字段。 它们可能包含字段名称、转换标志和格式规范,但不允许更深层次的嵌套。 在解释 format_spec 字符串之前,将替换 format_spec 中的替换字段。 这允许动态指定值的格式。

class Dummy(object):
    def __init__(self):
        self.value1 = 'A VALUE'
        self.value2 = 'ANOTHER VALUE'
        self.value3 = 'THIRD VALUE'

    def __str__(self):
        # want value1 to be 20 chars
        # value2 to be 8 chars
        # value3 to be 10 chars
        return '{value1:{0}},{value2:{1}},{value3:{2}}'.format(*[20, 8, 10], **vars(self))

print(Dummy())

输出

A VALUE             ,ANOTHER VALUE,THIRD VALUE

1
像这样的东西可能有效:
class Dummy(object):
    def __init__(self):
        self.value1 = 'A VALUE'
        self.value2 = 'ANOTHER VALUE'
        self.value3 = 'THIRD VALUE'

    def to_s(self):
        return '{0.value1:<20},{0.value2:8},{0.value3:10}'.format(self)

关于格式化的更多详细信息请参见https://docs.python.org/2/library/string.html#formatstrings。如果您想要更长的属性列表和更动态的格式化,您也可以动态构建格式字符串,例如(未经测试):

    field_formats = [('value1', '<20'),
                     ('value2', '8'),
                     ('value3', '>10'))  # etc.

    def to_s(self):
        fmt = ','.join('{0.%s:%s}' % fld for fld in field_formats)
        return fmt.format(self)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接