我想知道是否有办法使用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吗?
感谢您的回答
答案 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