Pylint 的 bad-string-format-type(E1307):旧式 `%` 格式化参数类型不匹配检查完全指南
静态分析代码质量Lint开发工具【免费下载链接】pylintIts not just a linter that annoys you!项目地址https://gitcode.com/gh_mirrors/pyl/pylint点击查看免费下载导读bad-string-format-type消息编号 E1307是 Pylint 中用于检测旧式old-style%字符串格式化参数类型不匹配的检查项。当你写出%d % 1这类格式串要求整数、却传入字符串的代码时它会在编译前更准确地说是在静态分析阶段就为你标出隐患。读完本文你将掌握该检查的触发条件、类型匹配的完整规则、边界情况处理方式以及如何在 Pylint 中启用、关闭或定位它。需要特别说明的是该检查目前仅对旧式%格式化生效——即... % value这种写法详见 details.rststr.format()与 f-string 不在其检查范围内。Pylint 官方以 Issue #6163原记录为 #6085跟踪该检查的适用范围问题。消息定义E1307 从哪来bad-string-format-type在 Pylint 源码中定义于 strings.py由StringFormatChecker检查器name string负责触发。其完整定义如下E1307: ( Argument %r does not match format type %r, bad-string-format-type, Used when a type required by format string is not suitable for actual argument type, ),消息符号symbolbad-string-format-type消息编号msg-idE1307属于 Error 级别报错文案Argument builtins.str does not match format type d触发时机格式串要求的类型与实际传入参数的类型不匹配时在文档体系中该消息被归类为 error 类别参见 messages_overview.rst 与 features.rst 中的条目。触发场景什么代码会被报错最简单的反面示例仓库在 doc/data/messages/b/bad-string-format-type/bad.py 中给出了最小触发样例print(%d % 1) # [bad-string-format-type]%d要求整数decimal却传入了字符串1——尽管运行时的%d % 1在 CPython 中实际上会成功因为旧式格式化会在运行时做隐式转换但从类型正确性的角度这正是 Pylint 想要拦截的隐患隐式依赖运行时转换往往是 bug 与脆弱代码的温床。正面示例同目录下的 good.py 给出正确写法print(%d % 1)更丰富的真实用例仓库的功能测试文件 tests/functional/b/bad_string_format_type.py 提供了覆盖面更广的触发矩阵对应的期望输出记录在 bad_string_format_type.txt 中%d % 1 # [bad-string-format-type] %(key)d % {key: 1} # [bad-string-format-type] %x % 1.1 # [bad-string-format-type] %(key)x % {key: 1.1} # [bad-string-format-type] %d % [] # [bad-string-format-type] %(key)d % {key: []} # [bad-string-format-type] WORD abc %d % WORD # [bad-string-format-type] %d %s % (WORD, WORD) # [bad-string-format-type] VALUES_TO_FORMAT (1, 2, 3.0) %d %s %f % VALUES_TO_FORMAT # 通过1 是 int、2 是 str、3.0 是 float %d %d %f % VALUES_TO_FORMAT # [bad-string-format-type]第 2 个 %d 遇到 2可以看到位置参数与映射字典参数两种形式都会被检查既有%d % x也有%(key)d % {key: x}这类带命名键的写法常量、变量、元组展开都能被推断WORD是字符串常量VALUES_TO_FORMAT是元组Pylint 均能逐个元素推断出类型并完成逐槽位比对当值来自函数参数、无法静态推断时Pylint 保持沉默测试文件中的test_format函数传入my_input_value等参数此时无法确定内容Pylint 不报错也不崩溃源码中表现为num_args None时跳过检查。类型匹配规则arg_matches_format_type源码解析该检查的核心判定逻辑集中在 strings.py 的arg_matches_format_type函数中理解它就能准确预判 Pylint 的报错行为def arg_matches_format_type( arg_type: SuccessfulInferenceResult, format_type: str ) - bool: if format_type in sra: # All types can be printed with %s, %r and %a return True if isinstance(arg_type, astroid.Instance): # Subclasses behave like their builtin base: bool and IntEnum # members format like int, a float subclass like float. if arg_type.is_subtype_of(builtins.str): return format_type c if arg_type.is_subtype_of(builtins.int): # Integers allow all types return True if arg_type.is_subtype_of(builtins.float): # i and u accept a float at runtime (truncated like d) return format_type in diueEfFgGn% return False return True逐条解读这条判定表场景判定说明格式类型为%s、%r、%a总是匹配字符串化、repr、ascii 三种格式接受任意类型参数是str的子类仅当格式类型为%c时匹配%c单字符接受单字符字符串但字符串不能用于%d、%x等数值格式参数是int的子类总是匹配整数可被所有格式接受bool、IntEnum成员都按int处理参数是float的子类格式类型须属于diueEfFgGn%%i/%u在运行时会把 float 截断成 int行为类似%d因此也算合法其他未知/无法推断的类型总是匹配放行非astroid.Instance或无法推断时不做误报这条规则的两个关键推论%s/%r/%a是万能格式%s % []、%s % None都不会被报错测试文件 19–22 行验证了这一点%d遇到字符串、%x遇到浮点数会被报错因为它们之间存在真实的类型语义偏差。触发流程从%运算到消息上报从 strings.py 的visit_binop方法可以看到完整的调用链入口StringFormatChecker.visit_binop只处理运算符为%的二元运算if node.op ! %: return并要求左操作数是字符串常量解析格式串调用utils.parse_format_string(format_string)解析出required_keys命名键、required_num_args需要的参数个数、required_key_types每个键的格式类型与required_arg_types每个槽位的格式类型分支一命名键若格式串只含命名占位符则校验右侧必须是映射Dict对每个键值对通过utils.safe_infer(arg)推断值类型再调用arg_matches_format_type比对分支二位置参数若格式串只含无名占位符则把右侧元组/容器展开为args_elts逐一推断类型并比对上报当类型不匹配时self.add_message(bad-string-format-type, nodenode, args(arg_type.pytype(), format_type))产出消息最终报错文案即Argument builtins.str does not match format type d。如果格式串同时含命名与无名占位符Pylint 会先报mixed-format-string如果右侧不是映射而是列表、函数等节点则会报format-needs-mapping。这些是 E1307 的邻居消息共同构成旧式格式化检查体系。边界与演进子类、%i/%u/%a的历史误报修复该检查在过去版本中经历过若干误报false positive修复理解这些修复能帮助你判断新版 Pylint 的行为边界4.0 版本见 doc/whatsnew/4/4.0/index.rst修复了当参数是int、float、str的子类实例如bool、IntEnum成员用%d格式化时的误报——这就是源码中is_subtype_of(builtins.int)等分支的由来4.0 版本doc/whatsnew/4/4.0/index.rst修复了对%i/%u应用于 float运行时按%d截断以及%a应用于任意非 int 类型的误报2.14 版本doc/whatsnew/2/2.14/full.rst修复了被格式化值通过变量/元组间接传入时的漏报false negative。测试文件 tests/functional/b/bad_string_format_type.py 第 59–75 行正是这些修复的回归用例import enum class Color(enum.IntEnum): RED 1 class MyFloat(float): pass %i % True # 通过bool 按 int 处理 %d %x % (Color.RED, Color.RED) # 通过IntEnum 成员按 int 处理 %f %d % (MyFloat(1.5), MyFloat(1.5)) # 通过float 子类按 float 处理 %x %s % (MyFloat(1.5), a) # [bad-string-format-type]float 不能用 %x如何启用、关闭与定位该检查默认启用E1307 属于默认开启的检查项不需要额外配置命令行关闭pylint --disablebad-string-format-type your_file.py或按编号--disableE1307配置文件关闭在pylintrc/pyproject.toml的MASTER段中写入disablebad-string-format-type代码内局部关闭在被检行上方添加注释# pylint: disablebad-string-format-type功能测试文件即使用了这种写法定位源码检查器实现位于 pylint/checkers/strings.py功能测试位于 tests/functional/b/bad_string_format_type.py查看消息文档仓库为每条消息维护了独立的文档目录本消息的说明、正反示例与相关链接分别位于 bad-string-format-type/details.rst、bad.py、good.py 与 related.rst。实践建议优先写对类型而不是依赖运行时隐式转换%d % 1虽然能运行但一旦数据来源不可控就可能抛出TypeError: %d format: a real number is required, not strE1307 帮你把这类风险前移到静态分析阶段记住三个万能格式%s、%r、%a接受任意类型不会被报错数值格式%d、%x、%f等才有严格的类型语义对无法推断类型的动态值保持预期传入函数参数、复杂表达式时Pylint 出于避免误报的考虑会放行源码与测试均明确覆盖了此行为此时建议结合类型注解或显式转换提升代码的可分析性理解检查的边界该检查只覆盖旧式%格式化str.format()与 f-string 的类型问题由其他检查项如bad-format-string、missing-format-argument-key负责不要指望 E1307 覆盖所有格式化场景。如果你正在迁移大量旧代码不妨以%格式化为切入点先让 E1307 帮你在全仓库范围内找出所有类型语义不匹配的格式化调用再逐一修正为显式类型转换或改用 f-string——这是成本最低、收益最直接的改造路径。赞分享静态分析代码质量Lint开发工具【免费下载链接】pylintIts not just a linter that annoys you!项目地址https://gitcode.com/gh_mirrors/pyl/pylint点击查看免费下载相关推荐Pylint 的 bad-format-string-keyW1300% 风格格式化字符串字典键检查详解Pylint 的 bad format string keyW1300% 风格格式化字符串字典键检查详解 导读 bad format string key静态分析代码质量Lint开发工具pylint bad-format-characterE1300检查详解识别与修复 % 旧式字符串格式化中的非法转换字符pylint bad format characterE1300检查详解识别与修复 % 旧式字符串格式化中的非法转换字符 导读 本文聚焦 Pylint 消静态分析代码质量Lint开发工具如何在内网部署本地数据库客户端Chat2DB Community 完整落地路径如何在内网部署本地数据库客户端Chat2DB Community 完整落地路径 Chat2DB Community 是本地优先的数据库客户端与 SQL 工作台数据库客户端AI 应用数据分析上一篇10分钟上手Gas Town新手必备的多智能体工作空间管理入门指南下一篇终极指南如何用pytest-mock优雅进行Python测试模拟创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Devtron 全局插件创建全流程指南:从 plugin_metadata 到步骤条件的 7 步 SQL 实操

Devtron 全局插件创建全流程指南:从 plugin_metadata 到步骤条件的 7 步 SQL 实操

云原生DevOps运维 【免费下载链接】devtron The only Kubernetes dashboard you need 项目地址: https://gitcode.com/gh_mirrors/dev/devtron 点击查看 免费下载 Devtron 的全局插件(Global Plugin)体系允许开发者以纯 SQL 的方式在数据库中…

2026/10/12 5:18:06 阅读更多 →
AI资讯聚合系统实战:从信息源管理到自动摘要的完整链路

AI资讯聚合系统实战:从信息源管理到自动摘要的完整链路

1. 当"日报"变成一种产品:AI资讯聚合的底层逻辑做AI资讯聚合这件事,我前前后后折腾了快两年。最早只是给自己用——每天要刷十几个信息源,论文、模型发布、开源项目、行业动态,刷完一圈两个小时没了,效率极低…

2026/10/12 5:18:06 阅读更多 →
Nextcloud Android 导航重构实战:将 DrawerActivity 页面平滑迁移到 NavigatorActivity + Fragment 架构

Nextcloud Android 导航重构实战:将 DrawerActivity 页面平滑迁移到 NavigatorActivity + Fragment 架构

移动开发企业应用 【免费下载链接】android 📱 Nextcloud Android app 项目地址: https://gitcode.com/gh_mirrors/andr/android 点击查看 免费下载 本篇技术指南基于 Nextcloud Android 客户端仓库(.claude/skills/android-activity-to-nav…

2026/10/12 5:18:06 阅读更多 →

最新新闻

有害气体控制洁净工程的底层逻辑:从过滤到吸附,从压差到监测

有害气体控制洁净工程的底层逻辑:从过滤到吸附,从压差到监测

空气里最危险的不是脏,而是失控:有害气体控制洁净工程的底层逻辑干了这么多年洁净工程,我越来越觉得“洁净”这个词会误导人。很多人一听到洁净室,想到的就是无尘、高等级过滤、白大褂和干干净净的地板,下意识把“颗粒…

2026/10/12 6:03:33 阅读更多 →
Pygame乒乓球游戏开发实战:从游戏循环到碰撞检测的完整指南

Pygame乒乓球游戏开发实战:从游戏循环到碰撞检测的完整指南

简介:游戏循环是几乎所有实时游戏的心跳,它决定了每一帧里输入、更新与渲染的执行顺序。碰撞检测则负责回答“物体是否重叠”这个基本问题,而引擎中那些微妙的物理手感,往往源于对碰撞响应和状态管理的精细控制。乒乓球游戏恰好是…

2026/10/12 6:03:33 阅读更多 →
栈的压入、弹出序列判定算法详解:辅助栈模拟与 Java 实现(YCBlogs 剑指 Offer 系列)

栈的压入、弹出序列判定算法详解:辅助栈模拟与 Java 实现(YCBlogs 剑指 Offer 系列)

教程技术博客文档 【免费下载链接】YCBlogs 技术博客笔记大汇总,包括Java基础,线程,并发,数据结构;Android技术博客等等;常用设计模式;常见的算法;网络协议知识点;部分fl…

2026/10/12 6:03:33 阅读更多 →
C# TCP服务器与客户端双向通信:骨架搭建与避坑指南

C# TCP服务器与客户端双向通信:骨架搭建与避坑指南

简介:这是一份面向C#网络编程初学者的TCP通信示例工程,目标是用一个程序实现TCP客户端与服务器之间的互发消息,并支持在客户端界面点击按钮弹出服务器界面。资源围绕System.Net命名空间下的TcpListener与TcpClient展开,覆盖端口绑…

2026/10/12 6:03:32 阅读更多 →
CodeIgniter 4.7.4 安全与稳定性更新详解:四个安全公告与十余项缺陷修复

CodeIgniter 4.7.4 安全与稳定性更新详解:四个安全公告与十余项缺陷修复

后端Web框架 【免费下载链接】CodeIgniter4 Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter4 点击查看 免费下载 CodeIgniter 4.7.4(2026 年 7 月 7 日发布)是一次以安全加…

2026/10/12 6:03:32 阅读更多 →
Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

Tortoise-ORM 与 Sanic 集成实战:register_tortoise 生命周期管理全解析

数据库后端 【免费下载链接】tortoise-orm Familiar asyncio ORM for python, built with relations in mind 项目地址: https://gitcode.com/gh_mirrors/to/tortoise-orm 点击查看 免费下载 本文以 Tortoise-ORM 仓库中 Sanic 集成示例 为主线,系统讲解…

2026/10/12 6:02:32 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →