
Python f-string 的 {expr=} 语法默认调用 repr(),导致数组等对象显示冗长;可通过添加空格式说明符 {:} 或强制字符串转换 !s 实现简洁输出,如将 a=array([2, 3, 1, 9], dtype=int32) 精简为 a=[2 3 1 9]。
python f-string 的 `{expr=}` 语法默认调用 `repr()`,导致数组等对象显示冗长;可通过添加空格式说明符 `{:}` 或强制字符串转换 `!s` 实现简洁输出,如将 `a=array([2, 3, 1, 9], dtype=int32)` 精简为 `a=[2 3 1 9]`。
在 Python 3.8+ 中,f-string 的 = 语法(即“自文档表达式”)是调试和快速检查变量值的利器——它自动拼接变量名与求值结果,例如 f'{a=}' 等价于 'a=' + repr(a)。但正因默认使用 repr(),对于 numpy.ndarray、pandas.DataFrame 或自定义类等对象,输出往往包含类型信息、参数细节等冗余内容,与 print(a) 的简洁可读输出不一致。
要获得更干净、更贴近 print() 默认行为的结果,有两种推荐方式:
✅ 方法一:使用空格式说明符 {:}
空格式说明符会触发常规格式化流程(等效于 format(value, '')),对大多数内置类型和兼容 __format__ 协议的对象,其效果接近 str(),且更轻量:
import numpy as np
a = np.array([2, 3, 1, 9], dtype='i4')
print(f'{a=}') # 输出:a=array([2, 3, 1, 9], dtype=int32)
print(f'{a=:}') # 输出:a=[2 3 1 9]✅ 方法二:显式请求字符串转换 !s!s 转换标志强制调用 str(),语义明确,兼容性最广(适用于所有定义了 __str__ 的对象):
print(f'{a=!s}') # 输出:a=[2 3 1 9]⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
-
{:}和!s在多数场景下效果相同,但语义不同:{:}可被重载(通过__format__),而!s始终走__str__;若对象未实现__format__,{:}会回退到str(),因此二者实际差异较小。 - 避免使用
!r(显式repr)或省略任何修饰符(即默认行为),否则仍会得到冗长输出。 - 此技巧同样适用于其他容器类型,如
list、dict、datetime等,例如f'{my_list=:}'可避免嵌套repr引号干扰可读性。
总结:当追求调试时的清晰可读性而非完整对象表示时,优先选用 f'{var=:}' —— 简洁、标准、无需额外依赖,是提升 f-string 可维护性的实用小技巧。


















