目录
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