我正在开发一个 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 个属性,如果这是可行的话,生活会变得更加轻松。
谢谢。
您可以将
{}
字段嵌套在 {}
字段内,但只允许嵌套一层。幸运的是,实际上只需要一层嵌套。 :)
来自格式字符串语法:
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
这样的东西可能会起作用:
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)