目录
3. 为什么 logging 使用 %() 而不是 f-string 或 str.format()?
5. 对比 %() / .format() / f-string
%() 是 Python 中一种旧式字符串格式化(Old-style String Formatting)的方式,主要用于 logging 模块的日志格式定义,也常见于早期的 Python 代码中。它的语法类似于 C 语言的 printf 风格。
1. 基本语法
%() 格式化的一般形式:
"格式化字符串" % (变量1, 变量2, ...)
或(在 logging 模块中):
"%(key1)s %(key2)d" % {"key1": "value1", "key2": 123}
示例
(1) 普通变量格式化
name = "Alice"
age = 25
print("Name: %s, Age: %d" % (name, age))
输出:
Name: Alice, Age: 25
%s→ 字符串(str)%d→ 十进制整数(int)
(2) 字典变量格式化(logging 常用方式)
data = {"name": "Bob", "age": 30}
print("Name: %(name)s, Age: %(age)d" % data)
输出:
Name: Bob, Age: 30
%(name)s→ 从字典data中取"name"的值,并格式化为字符串%(age)d→ 从字典data中取"age"的值,并格式化为整数
2. logging 模块中的 %() 格式化
在 logging 模块中,basicConfig(format=...) 使用 %() 的方式定义日志格式,其中:
%()中的key是预定义的日志属性(如asctime,filename,message等)。s/d表示数据类型。
示例
import logging
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logging.info("This is a log message")
输出:
2023-10-01 12:00:00,000 - root - INFO - This is a log message
%(asctime)s→ 日志时间(字符串)%(name)s→ Logger 名称(字符串,默认"root")%(levelname)s→ 日志级别(字符串,如"INFO")%(message)s→ 日志消息(字符串)
3. 为什么 logging 使用 %() 而不是 f-string 或 str.format()?
历史原因
logging 模块在 Python 早期版本就已存在,而 f-string(Python 3.6+)和 str.format()(Python 2.6+)是后来才引入的。
性能优化
%() 格式化在 logging 内部经过优化,比 f-string 或 .format() 更高效,因为日志可能被频繁调用。
结构化数据支持
%() 可以直接从字典读取变量(如 %(message)s),而 f-string 需要显式传递变量。
4. 常见占位符
| 占位符 | 数据类型 | 示例 |
|---|---|---|
%s | 字符串 | "Name: %s" % "Alice" → "Name: Alice" |
%d | 整数 | "Age: %d" % 25 → "Age: 25" |
%f | 浮点数 | "Price: %f" % 3.14 → "Price: 3.140000" |
%.2f | 保留 2 位小数 | "Price: %.2f" % 3.14159 → "Price: 3.14" |
%x | 十六进制 | "Hex: %x" % 255 → "Hex: ff" |
5. 对比 %() / .format() / f-string
| 方式 | 示例 | Python 版本 | 适用场景 |
|---|---|---|---|
%() | "Name: %s" % "Alice" | 所有版本 | logging 模块、旧代码 |
.format() | "Name: {}".format("Alice") | Python 2.6+ | 较新的代码 |
f-string | f"Name: {'Alice'}" | Python 3.6+ | 现代 Python 代码 |
6. 总结
%()是 Python 的旧式字符串格式化方法,在logging模块中广泛使用。%(key)s表示从字典中取key的值并格式化为字符串,%(key)d格式化为整数。logging使用%()主要因为历史兼容性和性能优化。- 现代 Python 代码推荐使用
f-string,但在logging中仍然推荐%()方式。
示例回顾
import logging
logging.basicConfig(
format='%(asctime)s - %(message)s', # %() 格式化
level=logging.INFO
)
logging.info("Hello, %s!", "World") # 输出:2023-10-01 12:00:00,000 - Hello, World!
%(asctime)s→ 自动填充时间%(message)s→ 获取logging.info()的内容
END
17万+

被折叠的 条评论
为什么被折叠?



