使用namedtuple格式化字符串

时间:2018-06-02 09:49:24

标签: python

我想知道是否有办法使用namedtuple的变量列表来有效地格式化字符串,如下所示:

TestResult = collections.namedtuple('TestResults', 'creation_time filter_time total_time')

test = TestResult(1, 2, 3)
string_to_format = '{creation_time}, {filter_time}, {total_time}'.format(test)

而不仅仅是写作:

string_to_format = '{}, {}, {}'.format(test.creation_time, test.filter_time, test.total_time)

如果有办法做到这一点,它会被认为是pythonic吗?

感谢您的回答

4 个答案:

答案 0 :(得分:5)

你可以这样做:

>>> string_to_format = '{0.creation_time}, {0.filter_time}, {0.total_time}'.format(test)
>>> string_to_format
'1, 2, 3'

这是Pythonic吗?我不知道,但它做了两件被认为是Pythonic的事情:1。不要重复自己! (test只出现一次)和2.明确! (namedTuple中的名称可供使用)

答案 1 :(得分:4)

您可以使用_asdict()方法将您的namedtuple转换为dict,然后unpack使用** splat运算符:

test = TestResult(1, 2, 3)

string_to_format = '{creation_time}, {filter_time}, {total_time}'
print(string_to_format.format(**test._asdict()))
# output: 1, 2, 3

答案 2 :(得分:1)

你的尝试很接近。你应该改变

'{creation_time}, {filter_time}, {total_time}'.format(test)

'{test.creation_time}, {test.filter_time}, {test.total_time}'.format(test=test)

答案 3 :(得分:1)

您可以将其转换为字典并将其用作format的参数:

test = TestResult(1, 2, 3)
s = '{creation_time}, {filter_time}, {total_time}'.format(**test._asdict())
print(s)  # 1, 2, 3