Namedtuple formatted/pretty 在 Python 中打印
Namedtuple formatted/pretty print in Python
无法打印 namedtuple
:
Info = namedtuple('Info', ['type', 'value', 'x', 'y'])
以便值对齐并在它们之间使用 space(填充),例如像这样:
Info( type='AAA', value=80000, x=16.4, y=164.2 )
Info( type='A', value=78, x=1.5, y=11.3 )
Info( type='ABBCD', value=554, x=11.7, y=10.1 )
Info( type='AFFG', value=1263, x=121.3, y=12.8 )
理想情况下,没有逗号。
我已经尝试 pprint
并尝试使用 _asdict
进行打印,但没有按照建议 here 成功。与 format
相同,我无法使其与命名元组一起运行。
有任何想法或示例代码吗?
因为您需要提前知道字段宽度,所以我能为您建议的唯一合理解决方案就是编写一个辅助函数来转换为您想要的格式。
def namedtuple_to_str(t, field_widths=15):
if isinstance(field_widths, int):
field_widths = [field_widths] * len(t)
field_pairs = ['{}={}'.format(field, getattr(t, field)) for field in t._fields]
s = ' '.join('{{:{}}}'.format(w).format(f) for w,f in zip(field_widths, field_pairs))
result = '{}( {} )'.format(type(t).__name__, s)
return result
演示:
>>> from collections import namedtuple
>>> Info = namedtuple('Info', ['type', 'value', 'x', 'y'])
>>> t = Info(type='AAA', value=80000, x=16.4, y=164.2)
>>>
>>> print namedtuple_to_str(t)
Info( type=AAA value=80000 x=16.4 y=164.2 )
>>> print namedtuple_to_str(t, field_widths=11)
Info( type=AAA value=80000 x=16.4 y=164.2 )
>>> print namedtuple_to_str(t, field_widths=[10, 20, 7, 7])
Info( type=AAA value=80000 x=16.4 y=164.2 )
要打印这些集合,使用 max(..., key=len)
.
预先计算所需的字段宽度并不难
这是我为命名元组实现的漂亮打印:
def prettyprint_namedtuple(namedtuple,field_spaces):
assert len(field_spaces) == len(namedtuple._fields)
string = "{0.__name__}( ".format(type(namedtuple))
for f_n,f_v,f_s in zip(namedtuple._fields,namedtuple,field_spaces):
string+= "{f_n}={f_v!r:<{f_s}}".format(f_n=f_n,f_v=f_v,f_s=f_s)
return string+")"
给出我相信您正在寻找的输出:
a = Info( type='AAA', value=80000, x=16.4, y=164.2 )
b = Info( type='A', value=78, x=1.5, y=11.3 )
c = Info( type='ABBCD', value=554, x=11.7, y=10.1 )
d = Info( type='AFFG', value=1263, x=121.3, y=12.8 )
tups = [a,b,c,d]
for t in tups:
print(prettyprint_namedtuple(t,(10, 9, 8, 6)))
输出:
Info( type='AAA' value=80000 x=16.4 y=164.2 )
Info( type='A' value=78 x=1.5 y=11.3 )
Info( type='ABBCD' value=554 x=11.7 y=10.1 )
Info( type='AFFG' value=1263 x=121.3 y=12.8 )
无法打印 namedtuple
:
Info = namedtuple('Info', ['type', 'value', 'x', 'y'])
以便值对齐并在它们之间使用 space(填充),例如像这样:
Info( type='AAA', value=80000, x=16.4, y=164.2 )
Info( type='A', value=78, x=1.5, y=11.3 )
Info( type='ABBCD', value=554, x=11.7, y=10.1 )
Info( type='AFFG', value=1263, x=121.3, y=12.8 )
理想情况下,没有逗号。
我已经尝试 pprint
并尝试使用 _asdict
进行打印,但没有按照建议 here 成功。与 format
相同,我无法使其与命名元组一起运行。
有任何想法或示例代码吗?
因为您需要提前知道字段宽度,所以我能为您建议的唯一合理解决方案就是编写一个辅助函数来转换为您想要的格式。
def namedtuple_to_str(t, field_widths=15):
if isinstance(field_widths, int):
field_widths = [field_widths] * len(t)
field_pairs = ['{}={}'.format(field, getattr(t, field)) for field in t._fields]
s = ' '.join('{{:{}}}'.format(w).format(f) for w,f in zip(field_widths, field_pairs))
result = '{}( {} )'.format(type(t).__name__, s)
return result
演示:
>>> from collections import namedtuple
>>> Info = namedtuple('Info', ['type', 'value', 'x', 'y'])
>>> t = Info(type='AAA', value=80000, x=16.4, y=164.2)
>>>
>>> print namedtuple_to_str(t)
Info( type=AAA value=80000 x=16.4 y=164.2 )
>>> print namedtuple_to_str(t, field_widths=11)
Info( type=AAA value=80000 x=16.4 y=164.2 )
>>> print namedtuple_to_str(t, field_widths=[10, 20, 7, 7])
Info( type=AAA value=80000 x=16.4 y=164.2 )
要打印这些集合,使用 max(..., key=len)
.
这是我为命名元组实现的漂亮打印:
def prettyprint_namedtuple(namedtuple,field_spaces):
assert len(field_spaces) == len(namedtuple._fields)
string = "{0.__name__}( ".format(type(namedtuple))
for f_n,f_v,f_s in zip(namedtuple._fields,namedtuple,field_spaces):
string+= "{f_n}={f_v!r:<{f_s}}".format(f_n=f_n,f_v=f_v,f_s=f_s)
return string+")"
给出我相信您正在寻找的输出:
a = Info( type='AAA', value=80000, x=16.4, y=164.2 )
b = Info( type='A', value=78, x=1.5, y=11.3 )
c = Info( type='ABBCD', value=554, x=11.7, y=10.1 )
d = Info( type='AFFG', value=1263, x=121.3, y=12.8 )
tups = [a,b,c,d]
for t in tups:
print(prettyprint_namedtuple(t,(10, 9, 8, 6)))
输出:
Info( type='AAA' value=80000 x=16.4 y=164.2 )
Info( type='A' value=78 x=1.5 y=11.3 )
Info( type='ABBCD' value=554 x=11.7 y=10.1 )
Info( type='AFFG' value=1263 x=121.3 y=12.8 )