如何用紧凑f-string实现非字符串对象的带空格格式化输出并保留对象信息?
Path对象的f-string对齐格式化方案
直接使用{var=:>N}格式处理Path对象会触发TypeError,因为Path类的__format__方法不支持这类格式化说明符。但我们可以通过以下方式实现**保留对象类型信息(如PosixPath(...))**同时对齐输出的需求:
基础实现方式
直接用repr()获取Path对象的完整字符串表示,再对其进行对齐格式化:
from pathlib import Path b = Path.cwd() # 调整>后面的数字控制对齐宽度 print(f'b={repr(b):>20}')
输出效果:
b= PosixPath('/home/user')
批量变量/类属性对齐打印
如果需要打印多个变量或类属性,并且希望等号左侧的变量名也对齐,可以写一个通用函数来处理:
批量打印类属性示例
from pathlib import Path class Project: def __init__(self): self.project = Path('/home/user/project') self.project_a = Path('/home/user/project/project') self.longer = Path('/home/user/project/project/icons/project/pic.png') self.PIPFILELOCK = Path('/home/user/project/Pipfile.lock') self.VIRTUALENV = Path('/home/user/.local/share/virtualenvs/project-mKDFEK') def print_aligned_attrs(obj, attr_list, align_width=15): # 计算最长属性名长度,让等号左侧对齐 max_name_length = max(len(attr) for attr in attr_list) for attr_name in attr_list: value = getattr(obj, attr_name) # <{max_name_length} 让变量名左对齐补空格,>{align_width} 让对象表示右对齐 print(f'{attr_name:<{max_name_length}}= {repr(value):>{align_width}}') # 使用示例 proj = Project() target_attrs = ['project', 'project_a', 'longer', 'PIPFILELOCK', 'VIRTUALENV'] print_aligned_attrs(proj, target_attrs)
输出效果:
project= PosixPath('/home/user/project') project_a= PosixPath('/home/user/project/project') longer= PosixPath('/home/user/project/project/icons/project/pic.png') PIPFILELOCK= PosixPath('/home/user/project/Pipfile.lock') VIRTUALENV= PosixPath('/home/user/.local/share/virtualenvs/project-mKDFEK')
核心原理
repr(obj)会返回对象的官方字符串表示(如PosixPath('/home/user')),保留了对象类型信息- 对
repr()的结果使用格式化说明符(如>20)实现对齐,避免了直接对Path对象格式化的报错问题
内容的提问来源于stack exchange,提问作者Sun Bear
相关产品推荐
相关产品推荐

