Python使用format打印字典、列表及对象属性的实例

小满
小满
发布时间:2026-11-08| 5人浏览过
原创

深入解析Python使用str.format方法打印字典键值、列表序列元素及自定义对象属性的完整语法与实战实例,包含嵌套结构解析、引号与负数索引避坑指南及选型对比。

在 Python 文本处理与日志拼接中,使用 str.format() 可以直接在字符串占位符内部完成容器索引与对象属性解构,无需在外部拆解变量。本文通过完整的代码示例与机制剖析,详解在格式化字符串中引用字典键值({0[key]})、列表元素({0[index]})与对象属性({0.attr})的具体语法规则、嵌套访问方式及常见报错根因。
Python使用format打印字典、列表及对象属性的实例
图 1:Python str.format() 复合容器与对象寻址体系架构图

一、str.format 替换字段寻址的核心规则

Python 的 str.format() 方法遵循严密的 PEP 3101 规范。在格式化字符串中,每个用花括号包裹的字段都具备 {field_name[element_index]} 或 {field_name.attribute_name} 的寻址能力。

理解这一寻址机制的关键在于参数标号与寻址操作符的分工:

  • 基准定位(Field Name):指明目标对象来源。可以使用位置数字(如 0 代表第一个传入的参数,1 代表第二个参数),也可以使用命名参数名称(如 user)。在很多简单场景下,若省略数字则默认按出现顺序绑定,但当需要连续引用同一个容器的不同字段时,显式指定数字(如 {0[name]} {0[age]})能有效减少参数冗余。
  • 方括号操作符([]):触发容器的 __getitem__ 协议。如果目标是字典,方括号内部填入字典的键名;如果目标是列表或元组,方括号内部填入非负整数索引。
  • 点操作符(.):触发属性检索 getattr。直接跟对象属性名,支持访问普通类实例属性、只读属性(@property)以及内置对象的字段。
Python使用format打印字典、列表及对象属性的实例
图 2:format 替换字段寻址解析与执行流程图

二、使用 format 打印字典(Dict)键值的实例

在业务开发中,数据往往以字典结构组织。使用 format 打印字典有两种典型模式:通过位置参数直接访问键名,或通过命名参数访问。

1. 位置参数与命名参数打印字典

在下面的代码中,我们将字典对象作为一个整体作为位置参数 0 或关键字参数 info 传入 format(),占位符通过 [key] 直接取值:

# 字典基础打印示例
user_data = {"username": "alex_lin", "role": "Site Reliability Engineer", "team": "Infrastructure"}

# 方式 A:使用位置编号 0 索引字典键
template_pos = "员工工号对应账户:{0[username]},岗位职级:{0[role]},所属部门:{0[team]}"
print(template_pos.format(user_data))

# 方式 B:使用关键字参数名称索引字典键
template_name = "审计通知:用户 {u[username]} (部门: {u[team]}) 已更新鉴权密钥。"
print(template_name.format(u=user_data))
示例输出
员工工号对应账户:alex_lin,岗位职级:Site Reliability Engineer,所属部门:Infrastructure
审计通知:用户 alex_lin (部门: Infrastructure) 已更新鉴权密钥。
重要注意事项:方括号内严禁添加引号

在常规 Python 表达式中,从字典取值必须带引号(例如 user_data['username'])。但在 str.format() 的花括号中,方括号内的所有文本会被 Python 解释器原样视为字面字符串键。如果您写成 {0['username']},Python 会在底层调用 user_data.__getitem__("'username'"),也就是去寻找带单引号的键,最终抛出 KeyError: "'username'"。正确写法必须去掉引号,写作 {0[username]}。

2. 容器索引与字典解包(**kwargs)的场景区别

除了 {0[key]} 外,Python 还允许通过 **user_data 将字典解包为关键字参数传递。这两种方式在适用场景上存在重要区别:

  • 解包传参({name}.format(**data)):仅适用于单层扁平字典,且所有字典键必须是合法的 Python 变量标识符(不能包含空格、短横线、中文或以数字开头)。
  • 容器索引({0[key]}.format(data)):不要求键名为合法标识符。例如字典键为 "content-type" 或 "2026-data" 时,解包会直接抛出语法错误,而容器索引方式 {0[content-type]} 可以安全解析。
Python使用format打印字典、列表及对象属性的实例
图 3:参数传递模式选型决策树:容器索引 vs 解包传参

三、使用 format 打印列表(List)与元组(Tuple)的实例

当数据为序列集合(如列表、元组)时,可以通过方括号传入数字下标,从序列中提取指定位置的项。

1. 顺序列表索引与多列表组合

在同一个格式化模板中,可以同时传入多个列表,分别通过位置编号 0、1 配合元素下标定位目标值:

# 列表与元组元素访问示例
servers = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
ports = (80, 443, 8080)
statuses = ["Active", "Standby", "Maintenance"]

# 跨容器按坐标取值
deploy_summary = (
    "主节点配置 -> IP: {0[0]}, 端口: {1[1]}, 状态: {2[0]}\n"
    "备节点配置 -> IP: {0[1]}, 端口: {1[0]}, 状态: {2[1]}"
)

print(deploy_summary.format(servers, ports, statuses))
示例输出
主节点配置 -> IP: 192.168.1.10, 端口: 443, 状态: Active
备节点配置 -> IP: 192.168.1.11, 端口: 80, 状态: Standby

2. 列表格式化的限制:负数索引与切片

使用 format() 处理列表时,必须注意以下两个语法边界:

  • 不支持负数索引:尝试在占位符中使用 {0[-1]} 获取列表最后一项时,Python 的 format 引擎会将 -1 作为字符串传给 __getitem__,从而抛出 TypeError: list indices must be integers or slices, not str。若需获取末尾元素,应在传参前通过 items[-1] 计算好。
  • 不支持切片操作:花括号内不支持形如 {0[1:3]} 的切片语法,格式化器会报 KeyError: '1:3' 或 TypeError。

四、使用 format 打印对象属性(Object Attribute)的实例

在面向对象编程中,将业务实体(如用户、设备、配置对象)直接传递给模板打印,能极大保持业务逻辑与展示层的解耦。format() 的 .attribute 语法通过标准的 getattr() 检索属性。

1. 自定义类实例与 @property 特性

无论是类中普通的实例变量,还是通过 @property 装饰器修饰的动态计算属性,均可透明访问:

# 对象属性打印示例
class HostNode:
    def __init__(self, hostname, ip, cpu_cores, ram_gb):
        self.hostname = hostname
        self.ip = ip
        self.cpu_cores = cpu_cores
        self.ram_gb = ram_gb

    @property
    def capacity_desc(self):
        return "{0} 核 CPU / {1} GB 内存".format(self.cpu_cores, self.ram_gb)

node = HostNode(hostname="k8s-worker-01", ip="10.0.8.21", cpu_cores=16, ram_gb=64)

# 通过 .属性名 访问实例属性和 property 计算属性
log_entry = "节点注册成功: 主机名={node.hostname}, 内网IP={node.ip}, 硬件规格=[{node.capacity_desc}]"
print(log_entry.format(node=node))
示例输出
节点注册成功: 主机名=k8s-worker-01, 内网IP=10.0.8.21, 硬件规格=[16 核 CPU / 64 GB 内存]

2. 标准库对象属性访问(datetime 模块实例)

该机制同样适用于 Python 标准库中的内置对象。例如在格式化时间戳对象时,可以直接提取属性并搭配格式限定符:

from datetime import datetime

current_time = datetime(2026, 10, 31, 23, 19, 31)

# 直接读取 datetime 对象的属性,并结合格式化填充修饰符 (:02d)
formatted_date = "构建时间戳: {0.year}-{0.month:02d}-{0.day:02d} {0.hour:02d}:{0.minute:02d}:{0.second:02d}"
print(formatted_date.format(current_time))
示例输出
构建时间戳: 2026-10-31 23:19:31

五、复合嵌套数据结构的综合实战

实际开发中的 JSON 响应或复杂模型通常是字典、列表与对象的深度组合。str.format() 允许将点操作符与方括号操作符链式组合,自左向右逐层解构:

# 复合嵌套结构访问完整示例
class Author:
    def __init__(self, name, email):
        self.name = name
        self.email = email

project_manifest = {
    "project_name": "Antigravity Pipeline",
    "version": "2.4.0",
    "maintainers": [
        Author("Alice Zhang", "alice@example.com"),
        Author("Bob Wang", "bob@example.com")
    ],
    "metrics": {
        "test_coverage": 94.8,
        "active_tasks": [102, 105, 108]
    }
}

# 组合寻址链:
# {0[maintainers][0].name}  -> 字典键 maintainers -> 列表下标 0 -> Author 对象的 name 属性
# {0[metrics][test_coverage]:.1f} -> 字典键 metrics -> 字典键 test_coverage -> 保留一位小数
manifest_report = (
    "项目概要: {0[project_name]} (v{0[version]})\n"
    "首席架构师: {0[maintainers][0].name} <{0[maintainers][0].email}>\n"
    "次席维护者: {0[maintainers][1].name} <{0[maintainers][1].email}>\n"
    "测试覆盖率: {0[metrics][test_coverage]:.1f}%\n"
    "当前优先任务编号: {0[metrics][active_tasks][0]}"
)

print(manifest_report.format(project_manifest))
示例输出
项目概要: Antigravity Pipeline (v2.4.0)
首席架构师: Alice Zhang <alice@example.com>
次席维护者: Bob Wang <bob@example.com>
测试覆盖率: 94.8%
当前优先任务编号: 102

六、常见报错与排查避坑指南

在编写包含复合寻址的 str.format() 时,最常见的异常集中在语法符号的混淆与越界。下表与图示归纳了高频报错的表现与解决对策:

Python使用format打印字典、列表及对象属性的实例
图 4:format 格式化常见异常排查与代码重构对照
异常类型 典型错误写法 底层触发原因 规范修正方案
KeyError "{0['name']}".format(d) 方括号内部多加了引号,检索键名为 "'name'" 去掉引号,改为 "{0[name]}".format(d)
TypeError "{0[-1]}".format(lst) 列表索引不支持负数,format 将其视为字符串键 提前在外部切片或计算正向索引 len-1
AttributeError "{0.get_name()}".format(obj) format 仅支持属性读取,不支持方法调用括号 () 定义为 @property 或改为 "{0.name}"
IndexError "{0[10]}".format(lst) 列表下标超出实际容器长度边界 在传参前执行长度预检或设置默认项

七、总结与全场景选型矩阵

Python 的 str.format() 在处理结构化对象展示时提供了强大的解构语法。在日常开发中,建议遵循以下选型原则:

  • 对于单层且所有键名符合变量命名规范的简单字典,format(**kwargs) 能带来最干净的模板可读性。
  • 对于包含嵌套列表、非标准键名(如含连字符、数字键)或需要直接暴露类属性的复合数据,首选 {0[key]} 和 {0.attr}。
  • 在涉及模板引擎或不可信输入时,务必注意对象属性访问权限,避免意外暴露敏感内部状态。
Python使用format打印字典、列表及对象属性的实例
图 5:Python 容器与对象格式化语法全景速查矩阵

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。