跳到内容

规则

Ruff 支持 800 多条 lint 规则,其中许多规则的灵感来源于 Flake8、isort、pyupgrade 等流行工具。无论规则的来源是什么,Ruff 都将每条规则作为第一方功能在 Rust 中重新实现。

默认情况下,Ruff 启用 Flake8 的 F 规则以及部分 E 规则,同时省略了与格式化程序(如 ruff formatBlack)使用重叠的任何样式规则。

如果您刚开始使用 Ruff,默认规则集是一个很好的起点:它可以在零配置的情况下捕获各种常见错误(例如未使用的导入)。

图例

    🧪     该规则不稳定,处于“预览”状态。
    ⚠️     该规则已弃用,并将在未来版本中移除。
    ❌     该规则已移除,仅提供文档。
    🛠️     该规则可以通过 --fix 命令行选项自动修复。

所有未标记为预览、已弃用或已移除的规则都是稳定的。

Airflow (AIR)

欲了解更多信息,请参阅 PyPI 上的 Airflow

代码 名称 消息
AIR001 airflow-variable-name-task-id-mismatch 任务变量名称应与 task_id 匹配:“{task_id}”
AIR002 airflow-dag-no-schedule-argument DAG 应具有显式的 schedule 参数
🧪
AIR301 airflow3-removal {deprecated} 在 Airflow 3.0 中已移除
🧪🛠️
AIR302 airflow3-moved-to-provider {deprecated} 在 Airflow 3.0 中已移除
🧪🛠️
AIR311 airflow3-suggested-update {deprecated} 在 Airflow 3.0 中已移除;它在 Airflow 3.0 中仍然有效,但预计将在未来版本中移除。
🧪🛠️
AIR312 airflow3-suggested-to-move-to-provider {deprecated} 在 Airflow 3.0 中已移除
🧪🛠️

eradicate (ERA)

欲了解更多信息,请参阅 PyPI 上的 eradicate

代码 名称 消息
ERA001 commented-out-code 发现被注释掉的代码

FastAPI (FAST)

欲了解更多信息,请参阅 PyPI 上的 FastAPI

代码 名称 消息
FAST001 fast-api-redundant-response-model FastAPI 路由具有冗余的 response_model 参数
🛠️
FAST002 fast-api-non-annotated-dependency FastAPI 依赖项缺少 Annotated
🛠️
FAST003 fast-api-unused-path-parameter 参数 {arg_name} 出现在路由路径中,但不在 {function_name} 签名中
🛠️

flake8-2020 (YTT)

欲了解更多信息,请参阅 PyPI 上的 flake8-2020

代码 名称 消息
YTT101 sys-version-slice3 引用了 sys.version[:3] (python3.10),请使用 sys.version_info
YTT102 sys-version2 引用了 sys.version[2] (python3.10),请使用 sys.version_info
YTT103 sys-version-cmp-str3 sys.version 与字符串比较 (python3.10),请使用 sys.version_info
YTT201 sys-version-info0-eq3 引用了 sys.version_info[0] == 3 (python4),请使用 >=
YTT202 six-py3 引用了 six.PY3 (python4),请使用 not six.PY2
YTT203 sys-version-info1-cmp-int sys.version_info[1] 与整数比较 (python4),请将 sys.version_info 与元组比较
YTT204 sys-version-info-minor-cmp-int sys.version_info.minor 与整数比较 (python4),请将 sys.version_info 与元组比较
YTT301 sys-version0 引用了 sys.version[0] (python10),请使用 sys.version_info
YTT302 sys-version-cmp-str10 sys.version 与字符串比较 (python10),请使用 sys.version_info
YTT303 sys-version-slice1 引用了 sys.version[:1] (python10),请使用 sys.version_info

flake8-annotations (ANN)

欲了解更多信息,请参阅 PyPI 上的 flake8-annotations

有关相关设置,请参阅 flake8-annotations

代码 名称 消息
ANN001 missing-type-function-argument 函数参数 {name} 缺少类型注解
ANN002 missing-type-args *{name} 缺少类型注解
ANN003 missing-type-kwargs **{name} 缺少类型注解
ANN101 missing-type-self 方法中 {name} 缺少类型注解
ANN102 missing-type-cls 类方法中 {name} 缺少类型注解
ANN201 missing-return-type-undocumented-public-function 公共函数 {name} 缺少返回类型注解
🛠️
ANN202 missing-return-type-private-function 私有函数 {name} 缺少返回类型注解
🛠️
ANN204 missing-return-type-special-method 特殊方法 {name} 缺少返回类型注解
🛠️
ANN205 missing-return-type-static-method 静态方法 {name} 缺少返回类型注解
🛠️
ANN206 missing-return-type-class-method 类方法 {name} 缺少返回类型注解
🛠️
ANN401 any-type {name} 中不允许使用动态类型表达式 (typing.Any)

flake8-async (ASYNC)

欲了解更多信息,请参阅 PyPI 上的 flake8-async

代码 名称 消息
ASYNC100 cancel-scope-no-checkpoint with {method_name}(...): 上下文不包含任何 await 语句。这使其毫无意义,因为超时只能通过检查点触发。
ASYNC105 trio-sync-call {method_name} 的调用未立即等待
🛠️
ASYNC109 async-function-with-timeout 异步函数定义带有 timeout 参数
ASYNC110 async-busy-wait while 循环中,使用 {module}.Event 而不是等待 {module}.sleep
ASYNC115 async-zero-sleep 使用 {module}.lowlevel.checkpoint() 而不是 {module}.sleep(0)
🛠️
ASYNC116 long-sleep-not-forever {module}.sleep() 超过 24 小时通常应为 {module}.sleep_forever()
🧪🛠️
ASYNC210 blocking-http-call-in-async-function 异步函数不应调用阻塞式 HTTP 方法
ASYNC220 create-subprocess-in-async-function 异步函数不应使用阻塞方法创建子进程
ASYNC221 run-process-in-async-function 异步函数不应使用阻塞方法运行进程
ASYNC222 wait-for-process-in-async-function 异步函数不应使用阻塞方法等待进程
ASYNC230 blocking-open-call-in-async-function 异步函数不应使用 open 等阻塞方法打开文件
ASYNC251 blocking-sleep-in-async-function 异步函数不应调用 time.sleep

flake8-bandit (S)

欲了解更多信息,请参阅 PyPI 上的 flake8-bandit

有关相关设置,请参阅 flake8-bandit

代码 名称 消息
S101 assert 检测到使用 assert
S102 exec-builtin 检测到使用 exec
S103 bad-file-permissions os.chmod 在文件或目录上设置了宽松权限掩码 {mask:#o}
S104 hardcoded-bind-all-interfaces 可能绑定到所有接口
S105 hardcoded-password-string 可能将硬编码密码分配给:“{}”
S106 hardcoded-password-func-arg 可能将硬编码密码分配给参数:“{}”
S107 hardcoded-password-default 可能将硬编码密码分配给函数默认值:“{}”
S108 hardcoded-temp-file 临时文件或目录可能存在不安全使用:“{}”
S110 try-except-pass 检测到 try-except-pass,请考虑记录异常
S112 try-except-continue 检测到 try-except-continue,请考虑记录异常
S113 request-without-timeout 可能使用 {module} 调用而未设置超时
S201 flask-debug-true 检测到 Flask 应用中使用 debug=True
S202 tarfile-unsafe-members 使用 tarfile.extractall()
S301 suspicious-pickle-usage pickle 和封装它的模块在反序列化不可信数据时可能不安全,可能存在安全问题
S302 suspicious-marshal-usage 使用 marshal 模块进行反序列化可能存在危险
S303 suspicious-insecure-hash-usage 使用不安全的 MD2、MD4、MD5 或 SHA1 哈希函数
S304 suspicious-insecure-cipher-usage 使用不安全的密码,请替换为已知安全密码,例如 AES
S305 suspicious-insecure-cipher-mode-usage 使用不安全的块密码模式,请替换为已知安全模式,例如 CBC 或 CTR
S306 suspicious-mktemp-usage 使用不安全且已弃用的函数 (mktemp)
S307 suspicious-eval-usage 使用可能不安全的函数;请考虑使用 ast.literal_eval
S308 suspicious-mark-safe-usage 使用 mark_safe 可能会暴露跨站脚本漏洞
S310 suspicious-url-open-usage 审计 URL 打开以获取允许的方案。允许使用 file: 或自定义方案通常是意外的。
S311 suspicious-non-cryptographic-random-usage 标准伪随机生成器不适用于加密目的
S312 suspicious-telnet-usage Telnet 被认为不安全。请使用 SSH 或其他加密协议。
S313 suspicious-xmlc-element-tree-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S314 suspicious-xml-element-tree-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S315 suspicious-xml-expat-reader-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S316 suspicious-xml-expat-builder-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S317 suspicious-xml-sax-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S318 suspicious-xml-mini-dom-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S319 suspicious-xml-pull-dom-usage 使用 xml 解析不可信数据已知存在 XML 攻击漏洞;请使用 defusedxml 等效项
S320 suspicious-xmle-tree-usage 使用 lxml 解析不可信数据已知存在 XML 攻击漏洞
S321 suspicious-ftp-lib-usage 正在调用 FTP 相关函数。FTP 被认为不安全。请使用 SSH/SFTP/SCP 或其他加密协议。
S323 suspicious-unverified-context-usage Python 允许通过 _create_unverified_context 使用不安全的上下文,这会恢复到不验证证书或执行主机名检查的先前行为。
S324 hashlib-insecure-hash-function {library} 中可能使用不安全的哈希函数:{string}
S401 suspicious-telnetlib-import telnetlib 和相关模块被认为不安全。请使用 SSH 或其他加密协议。
🧪
S402 suspicious-ftplib-import ftplib 和相关模块被认为不安全。请使用 SSH、SFTP、SCP 或其他加密协议。
🧪
S403 suspicious-pickle-import picklecPickledillshelve 模块可能不安全
🧪
S404 suspicious-subprocess-import subprocess 模块可能不安全
🧪
S405 suspicious-xml-etree-import xml.etree 方法容易受到 XML 攻击
🧪
S406 suspicious-xml-sax-import xml.sax 方法容易受到 XML 攻击
🧪
S407 suspicious-xml-expat-import xml.dom.expatbuilder 容易受到 XML 攻击
🧪
S408 suspicious-xml-minidom-import xml.dom.minidom 容易受到 XML 攻击
🧪
S409 suspicious-xml-pulldom-import xml.dom.pulldom 容易受到 XML 攻击
🧪
S410 suspicious-lxml-import lxml 容易受到 XML 攻击
S411 suspicious-xmlrpc-import XMLRPC 容易受到远程 XML 攻击
🧪
S412 suspicious-httpoxy-import httpoxy 是一组影响在 CGI 或类 CGI 环境中运行的应用程序代码的漏洞。应避免将 CGI 用于 Web 应用程序
🧪
S413 suspicious-pycrypto-import pycrypto 库已知存在公开披露的缓冲区溢出漏洞
🧪
S415 suspicious-pyghmi-import 正在导入 IPMI 相关模块。请优先使用加密协议而非 IPMI。
🧪
S501 request-with-no-cert-validation 可能使用 {string} 调用且 verify=False 禁用了 SSL 证书检查
S502 ssl-insecure-version 使用不安全的 SSL 协议进行调用:{protocol}
S503 ssl-with-bad-defaults 参数默认值设置为不安全的 SSL 协议:{protocol}
S504 ssl-with-no-version 调用 ssl.wrap_socket 时未指定 ssl_version
S505 weak-cryptographic-key 小于 {minimum_key_size} 位的 {cryptographic_key} 密钥大小被认为是可破解的
S506 unsafe-yaml-load 可能使用不安全的加载器 {name}yaml.load。允许实例化任意对象。请考虑使用 yaml.safe_load
S507 ssh-no-host-key-verification Paramiko 调用将策略设置为自动信任未知主机密钥
S508 snmp-insecure-version 使用 SNMPv1 和 SNMPv2 是不安全的。如果可能,请使用 SNMPv3。
S509 snmp-weak-cryptography 不应在没有加密的情况下使用 SNMPv3。noAuthNoPrivauthNoPriv 是不安全的。
S601 paramiko-call 通过 Paramiko 调用可能存在 shell 注入;请检查输入是否已正确净化
S602 subprocess-popen-with-shell-equals-true 带有 shell=Truesubprocess 调用似乎是安全的,但将来可能会改变;请考虑在没有 shell 的情况下重写
S603 subprocess-without-shell-equals-true subprocess 调用:检查是否存在不可信输入执行
S604 call-with-shell-equals-true 识别出带有 shell=True 参数的函数调用,存在安全问题
S605 start-process-with-a-shell 使用 shell 启动进程:似乎是安全的,但将来可能会改变;请考虑在没有 shell 的情况下重写
S606 start-process-with-no-shell 不使用 shell 启动进程
S607 start-process-with-partial-path 使用部分可执行路径启动进程
S608 hardcoded-sql-expression 通过基于字符串的查询构造可能存在 SQL 注入向量
S609 unix-command-wildcard-injection 由于使用 *,调用中可能存在通配符注入
S610 django-extra 使用 Django extra 可能导致 SQL 注入漏洞
S611 django-raw-sql 使用 RawSQL 可能导致 SQL 注入漏洞
S612 logging-config-insecure-listen 检测到使用不安全的 logging.config.listen
S701 jinja2-autoescape-false 使用 autoescape=False 的 jinja2 模板是危险的,可能导致 XSS。请确保 autoescape=True 或使用 select_autoescape 函数。
S702 mako-templates Mako 模板默认允许 HTML 和 JavaScript 渲染,并且固有地容易受到 XSS 攻击
S704 unsafe-markup-use 检测到不安全地使用 {name}

flake8-blind-except (BLE)

欲了解更多信息,请参阅 PyPI 上的 flake8-blind-except

代码 名称 消息
BLE001 blind-except 不要捕获盲异常:{name}

flake8-boolean-trap (FBT)

欲了解更多信息,请参阅 PyPI 上的 flake8-boolean-trap

有关相关设置,请参阅 flake8-boolean-trap

代码 名称 消息
FBT001 boolean-type-hint-positional-argument 函数定义中的布尔类型位置参数
FBT002 boolean-default-value-positional-argument 函数定义中的布尔默认位置参数
FBT003 boolean-positional-value-in-call 函数调用中的布尔位置值

flake8-bugbear (B)

欲了解更多信息,请参阅 PyPI 上的 flake8-bugbear

有关相关设置,请参阅 flake8-bugbear

代码 名称 消息
B002 unary-prefix-increment-decrement Python 不支持一元前缀增量运算符 (++)
B003 assignment-to-os-environ 赋值给 os.environ 不会清除环境
B004 unreliable-callable-check 使用 hasattr(x, "__call__") 来测试 x 是否可调用是不可靠的。请使用 callable(x) 以获得一致的结果。
🛠️
B005 strip-with-multi-characters 使用多字符字符串进行 .strip() 操作容易产生误导
B006 mutable-argument-default 不要对参数默认值使用可变数据结构
🛠️
B007 unused-loop-control-variable 循环控制变量 {name} 未在循环体中使用
🛠️
B008 function-call-in-default-argument 不要在参数默认值中执行函数调用 {name};而是,在函数内部执行调用,或从模块级单例变量中读取默认值
B009 get-attr-with-constant 不要使用常量属性值调用 getattr。它并不比正常的属性访问更安全。
🛠️
B010 set-attr-with-constant 不要使用常量属性值调用 setattr。它并不比正常的属性访问更安全。
🛠️
B011 assert-false 不要 assert False (python -O 会移除这些调用),请抛出 AssertionError()
🛠️
B012 jump-statement-in-finally finally 块中的 {name} 语句会导致异常被静默
B013 redundant-tuple-in-exception-handler 异常处理程序中长度为一的元组字面量是冗余的
🛠️
B014 duplicate-handler-exception 异常处理程序包含重复的异常:{name}
🛠️
B015 useless-comparison 无意义的比较。您是想赋值吗?否则,请添加 assert 或将其移除。
B016 raise-literal 不能抛出字面量。您是想返回它还是抛出 Exception?
B017 assert-raises-exception 不要断言盲异常:{exception}
B018 useless-expression 发现无用表达式。要么将其赋值给变量,要么将其移除。
B019 cached-instance-method 在方法上使用 functools.lru_cachefunctools.cache 可能导致内存泄漏
B020 loop-variable-overrides-iterator 循环控制变量 {name} 覆盖了它所迭代的迭代器
B021 f-string-docstring f-string 用作文档字符串。Python 会将其解释为连接字符串,而不是文档字符串。
B022 useless-contextlib-suppress 未向 contextlib.suppress 传递任何参数。因此不会抑制任何异常,此上下文管理器是多余的
B023 function-uses-loop-variable 函数定义未绑定循环变量 {name}
B024 abstract-base-class-without-abstract-method {name} 是一个抽象基类,但它没有抽象方法或属性
B025 duplicate-try-block-exception try-except* 块中存在重复异常 {name}
B026 star-arg-unpacking-after-keyword-arg 关键字参数后的星号参数解包强烈不推荐
B027 empty-method-without-abstract-decorator {name} 是抽象基类中的空方法,但没有抽象装饰器
B028 no-explicit-stacklevel 未找到显式 stacklevel 关键字参数
🛠️
B029 except-with-empty-tuple 使用带有空元组的 except* (): 不会捕获任何内容;请添加要处理的异常
B030 except-with-non-exception-classes except* 处理程序应仅为异常类或异常类元组
B031 reuse-of-groupby-generator 多次使用 itertools.groupby() 返回的生成器在第二次使用时将不执行任何操作
B032 unintentional-type-annotation 可能意外的类型注解(使用 :)。您是想赋值(使用 =)吗?
B033 duplicate-value 集合不应包含重复项 {value}
🛠️
B034 re-sub-positional-args {method} 应将 {param_name}flags 作为关键字参数传递,以避免因不直观的参数位置而产生混淆
B035 static-key-dict-comprehension 字典推导式使用静态键:{key}
B039 mutable-contextvar-default 不要对 ContextVar 默认值使用可变数据结构
B901 return-in-generator 在生成器函数中使用 yieldreturn {value} 可能导致混淆行为
🧪
B903 class-as-data-structure 类可以是数据类或命名元组
🧪
B904 raise-without-from-inside-except except* 子句中,请使用 raise ... from errraise ... from None 抛出异常,以区分它们与异常处理中的错误
B905 zip-without-explicit-strict zip() 没有显式的 strict= 参数
🛠️
B909 loop-iterator-mutation 迭代期间循环迭代器 {name} 发生突变
🧪
B911 batched-without-explicit-strict itertools.batched() 没有显式的 strict 参数

flake8-builtins (A)

欲了解更多信息,请参阅 PyPI 上的 flake8-builtins

有关相关设置,请参阅 flake8-builtins

代码 名称 消息
A001 builtin-variable-shadowing 变量 {name} 遮蔽了 Python 内置函数
A002 builtin-argument-shadowing 函数参数 {name} 遮蔽了 Python 内置函数
A003 builtin-attribute-shadowing Python 内置函数被来自 {row} 的类属性 {name} 遮蔽
A004 builtin-import-shadowing 导入 {name} 遮蔽了 Python 内置函数
A005 stdlib-module-shadowing 模块 {name} 遮蔽了 Python 标准库模块
A006 builtin-lambda-argument-shadowing Lambda 参数 {name} 遮蔽了 Python 内置函数

flake8-commas (COM)

欲了解更多信息,请参阅 PyPI 上的 flake8-commas

代码 名称 消息
COM812 missing-trailing-comma 缺少尾随逗号
🛠️
COM818 trailing-comma-on-bare-tuple 禁止在裸元组上使用尾随逗号
COM819 prohibited-trailing-comma 禁止使用尾随逗号
🛠️

flake8-comprehensions (C4)

欲了解更多信息,请参阅 PyPI 上的 flake8-comprehensions

有关相关设置,请参阅 flake8-comprehensions

代码 名称 消息
C400 unnecessary-generator-list 不必要的生成器(使用 list() 重写)
🛠️
C401 unnecessary-generator-set 不必要的生成器(使用 set() 重写)
🛠️
C402 unnecessary-generator-dict 不必要的生成器(重写为字典推导式)
🛠️
C403 unnecessary-list-comprehension-set 不必要的列表推导式(重写为集合推导式)
🛠️
C404 unnecessary-list-comprehension-dict 不必要的列表推导式(重写为字典推导式)
🛠️
C405 unnecessary-literal-set 不必要的 {kind} 字面量(重写为集合字面量)
🛠️
C406 unnecessary-literal-dict 不必要的 {obj_type} 字面量(重写为字典字面量)
🛠️
C408 unnecessary-collection-call 不必要的 {kind}() 调用(重写为字面量)
🛠️
C409 unnecessary-literal-within-tuple-call 传递给 tuple() 的不必要的列表字面量(重写为元组字面量)
🛠️
C410 unnecessary-literal-within-list-call 传递给 list() 的不必要的列表字面量(移除外部对 list() 的调用)
🛠️
C411 unnecessary-list-call 不必要的 list() 调用(移除外部对 list() 的调用)
🛠️
C413 unnecessary-call-around-sorted sorted() 周围不必要的 {func}() 调用
🛠️
C414 unnecessary-double-cast-or-process {outer}() 中不必要的 {inner}() 调用
🛠️
C415 unnecessary-subscript-reversal {func}() 中迭代器不必要的下标反转
C416 unnecessary-comprehension 不必要的 {kind} 推导式(使用 {kind}() 重写)
🛠️
C417 unnecessary-map 不必要的 map() 用法(使用 {object_type} 重写)
🛠️
C418 unnecessary-literal-within-dict-call 传递给 dict() 的不必要的字典 {kind}(移除外部对 dict() 的调用)
🛠️
C419 unnecessary-comprehension-in-call 不必要的列表推导式
🛠️
C420 unnecessary-dict-comprehension-for-iterable 可迭代对象不必要的字典推导式;请改用 dict.fromkeys
🛠️

欲了解更多信息,请参阅 PyPI 上的 flake8-copyright

有关相关设置,请参阅 flake8-copyright

代码 名称 消息
CPY001 missing-copyright-notice 文件顶部缺少版权声明
🧪

flake8-datetimez (DTZ)

欲了解更多信息,请参阅 PyPI 上的 flake8-datetimez

代码 名称 消息
DTZ001 call-datetime-without-tzinfo 调用 datetime.datetime() 时未指定 tzinfo 参数
DTZ002 call-datetime-today 使用了 datetime.datetime.today()
DTZ003 call-datetime-utcnow 使用了 datetime.datetime.utcnow()
DTZ004 call-datetime-utcfromtimestamp 使用了 datetime.datetime.utcfromtimestamp()
DTZ005 call-datetime-now-without-tzinfo 调用 datetime.datetime.now() 时未指定 tz 参数
DTZ006 call-datetime-fromtimestamp 调用 datetime.datetime.fromtimestamp() 时未指定 tz 参数
DTZ007 call-datetime-strptime-without-zone 使用 datetime.datetime.strptime() 构造了朴素日期时间,但没有 %z
DTZ011 call-date-today 使用了 datetime.date.today()
DTZ012 call-date-fromtimestamp 使用了 datetime.date.fromtimestamp()
DTZ901 datetime-min-max 未带时区信息的 datetime.datetime.{min_max} 的使用

flake8-debugger (T10)

更多信息,请参阅 PyPI 上的 flake8-debugger

代码 名称 消息
T100 debugger 发现跟踪:使用了 {name}

flake8-django (DJ)

更多信息,请参阅 PyPI 上的 flake8-django

代码 名称 消息
DJ001 django-nullable-model-string-field 避免在字符串字段(如 {field_name})上使用 null=True
DJ003 django-locals-in-render-function 避免将 locals() 作为上下文传递给 render 函数
DJ006 django-exclude-with-model-form 不要将 excludeModelForm 一起使用,请改用 fields
DJ007 django-all-with-model-form 不要将 __all__ModelForm 一起使用,请改用 fields
DJ008 django-model-without-dunder-str 模型未定义 __str__ 方法
DJ012 django-unordered-body-content-in-model 模型的内部类、方法和字段的顺序不遵循 Django 风格指南:{element_type} 应该在 {prev_element_type} 之前
DJ013 django-non-leading-receiver-decorator @receiver 装饰器必须在所有其他装饰器之上

flake8-errmsg (EM)

更多信息,请参阅 PyPI 上的 flake8-errmsg

有关相关设置,请参阅 flake8-errmsg

代码 名称 消息
EM101 raw-string-in-exception 异常不得使用字符串字面量,请先赋值给变量
🛠️
EM102 f-string-in-exception 异常不得使用 f-string 字面量,请先赋值给变量
🛠️
EM103 dot-format-in-exception 异常不得直接使用 .format() 字符串,请先赋值给变量
🛠️

flake8-executable (EXE)

更多信息,请参阅 PyPI 上的 flake8-executable

代码 名称 消息
EXE001 shebang-not-executable Shebang 存在但文件不可执行
EXE002 shebang-missing-executable-file 文件可执行但没有 shebang
EXE003 shebang-missing-python Shebang 应包含 pythonpytestuv run
EXE004 shebang-leading-whitespace 避免 shebang 前的空白
🛠️
EXE005 shebang-not-first-line Shebang 应在文件开头

flake8-fixme (FIX)

更多信息,请参阅 GitHub 上的 flake8-fixme

代码 名称 消息
FIX001 line-contains-fixme 行包含 FIXME,请考虑解决此问题
FIX002 line-contains-todo 行包含 TODO,请考虑解决此问题
FIX003 line-contains-xxx 行包含 XXX,请考虑解决此问题
FIX004 line-contains-hack 行包含 HACK,请考虑解决此问题

flake8-future-annotations (FA)

更多信息,请参阅 PyPI 上的 flake8-future-annotations

代码 名称 消息
FA100 future-rewritable-type-annotation 添加 from __future__ import annotations 以简化 {name}
🛠️
FA102 future-required-type-annotation 缺少 from __future__ import annotations,但使用了 {reason}
🛠️

flake8-gettext (INT)

更多信息,请参阅 PyPI 上的 flake8-gettext

有关相关设置,请参阅 flake8-gettext

代码 名称 消息
INT001 f-string-in-get-text-func-call f-string 在函数调用前解析;请考虑使用 _("string %s") % arg
INT002 format-in-get-text-func-call format 方法参数在函数调用前解析;请考虑使用 _("string %s") % arg
INT003 printf-in-get-text-func-call printf 风格的格式在函数调用前解析;请考虑使用 _("string %s") % arg

flake8-implicit-str-concat (ISC)

更多信息,请参阅 PyPI 上的 flake8-implicit-str-concat

有关相关设置,请参阅 flake8-implicit-str-concat

代码 名称 消息
ISC001 single-line-implicit-string-concatenation 单行隐式连接的字符串字面量
🛠️
ISC002 multi-line-implicit-string-concatenation 多行隐式连接的字符串字面量
ISC003 explicit-string-concatenation 显式连接的字符串应隐式连接
🛠️

flake8-import-conventions (ICN)

更多信息,请参阅 GitHub 上的 flake8-import-conventions

有关相关设置,请参阅 flake8-import-conventions

代码 名称 消息
ICN001 unconventional-import-alias {name} 应作为 {asname} 导入
🛠️
ICN002 banned-import-alias {name} 不应作为 {asname} 导入
ICN003 banned-import-from {name} 的成员不应显式导入

flake8-logging (LOG)

更多信息,请参阅 PyPI 上的 flake8-logging

代码 名称 消息
LOG001 direct-logger-instantiation 使用 logging.getLogger() 实例化日志器
🛠️
LOG002 invalid-get-logger-argument logging.getLogger() 中使用 __name__
🛠️
LOG004 log-exception-outside-except-handler .exception() 调用在异常处理程序之外
🧪🛠️
LOG007 exception-without-exc-info 使用 logging.exceptionexc_info 为假值
LOG009 undocumented-warn 使用未记录的 logging.WARN 常量
🛠️
LOG014 exc-info-outside-except-handler exc_info= 在异常处理程序之外
🛠️
LOG015 root-logger-call 对根日志器的 {}() 调用

flake8-logging-format (G)

更多信息,请参阅 PyPI 上的 flake8-logging-format

代码 名称 消息
G001 logging-string-format 日志语句使用 str.format
G002 logging-percent-format 日志语句使用 %
G003 logging-string-concat 日志语句使用 +
G004 logging-f-string 日志语句使用 f-string
G010 logging-warn 日志语句使用 warn 而不是 warning
🛠️
G101 logging-extra-attr-clash 日志语句使用了与 LogRecord 字段冲突的 extra 字段:{key}
G201 logging-exc-info 日志记录应使用 .exception(...) 而不是 .error(..., exc_info=True)
G202 logging-redundant-exc-info 日志语句包含冗余的 exc_info

flake8-no-pep420 (INP)

更多信息,请参阅 PyPI 上的 flake8-no-pep420

代码 名称 消息
INP001 implicit-namespace-package 文件 {filename} 属于隐式命名空间包。请添加 __init__.py

flake8-pie (PIE)

更多信息,请参阅 PyPI 上的 flake8-pie

代码 名称 消息
PIE790 unnecessary-placeholder 不必要的 pass 语句
🛠️
PIE794 duplicate-class-field-definition 类字段 {name} 被多次定义
🛠️
PIE796 non-unique-enums 枚举包含重复值:{value}
PIE800 unnecessary-spread 不必要的展开操作符 **
🛠️
PIE804 unnecessary-dict-kwargs 不必要的 dict 关键字参数
🛠️
PIE807 reimplemented-container-builtin 优先使用 {container} 而非无用的 lambda
🛠️
PIE808 unnecessary-range-start range 中不必要的 start 参数
🛠️
PIE810 multiple-starts-ends-with 使用 tuple 调用 {attr} 一次
🛠️

flake8-print (T20)

更多信息,请参阅 PyPI 上的 flake8-print

代码 名称 消息
T201 print 发现 print
🛠️
T203 p-print 发现 pprint
🛠️

flake8-pyi (PYI)

更多信息,请参阅 PyPI 上的 flake8-pyi

代码 名称 消息
PYI001 unprefixed-type-param 私有 {kind} 的名称必须以 _ 开头
PYI002 complex-if-statement-in-stub if 测试必须是对 sys.platformsys.version_info 的简单比较
PYI003 unrecognized-version-info-check 无法识别的 sys.version_info 检查
PYI004 patch-version-comparison 版本比较必须只使用主版本和次版本
PYI005 wrong-tuple-length-version-comparison 版本比较必须与长度为 {expected_length} 的元组进行
PYI006 bad-version-info-comparison sys.version_info 比较使用 <>=
PYI007 unrecognized-platform-check 无法识别的 sys.platform 检查
PYI008 unrecognized-platform-name 无法识别的平台 {platform}
PYI009 pass-statement-stub-body 空函数体应包含 ...,而不是 pass
🛠️
PYI010 non-empty-stub-body 函数体必须只包含 ...
🛠️
PYI011 typed-argument-default-in-stub 类型化参数只允许简单的默认值
🛠️
PYI012 pass-in-class-body 类体不得包含 pass
🛠️
PYI013 ellipsis-in-non-empty-class-body 非空类体不得包含 ...
🛠️
PYI014 argument-default-in-stub 参数只允许简单的默认值
🛠️
PYI015 assignment-default-in-stub 赋值只允许简单的默认值
🛠️
PYI016 duplicate-union-member 重复的联合成员 {}
🛠️
PYI017 complex-assignment-in-stub 存根不应包含对属性或多个目标的赋值
PYI018 unused-private-type-var 私有 {type_var_like_kind} {type_var_like_name} 从未使用过
🛠️
PYI019 custom-type-var-for-self 使用 Self 代替自定义 TypeVar {}
🛠️
PYI020 quoted-annotation-in-stub 存根中不应包含带引号的注解
🛠️
PYI021 docstring-in-stub 存根中不应包含文档字符串
🛠️
PYI024 collections-named-tuple 使用 typing.NamedTuple 代替 collections.namedtuple
PYI025 unaliased-collections-abc-set-import 使用 from collections.abc import Set as AbstractSet 以避免与 set 内置函数混淆
🛠️
PYI026 type-alias-without-annotation 类型别名使用 {module}.TypeAlias,例如 {name}: TypeAlias = {value}
🛠️
PYI029 str-or-repr-defined-in-stub 在存根中定义 {name} 几乎总是多余的
🛠️
PYI030 unnecessary-literal-union 联合类型中存在多个字面量成员。请使用单个字面量,例如 Literal[{}]
🛠️
PYI032 any-eq-ne-annotation 对于 {method_name} 的第二个参数,优先使用 object 而不是 Any
🛠️
PYI033 type-comment-in-stub 不要在存根文件中使用类型注释
PYI034 non-self-return-type __new__ 方法在运行时通常返回 self
🛠️
PYI035 unassigned-special-variable-in-stub 存根文件中的 {name} 必须有一个值,因为它在运行时具有与 {name} 相同的语义
PYI036 bad-exit-annotation {method_name} 中的星号参数应使用 object 进行注解
🛠️
PYI041 redundant-numeric-union 使用 {supertype} 代替 {subtype} | {supertype}
🛠️
PYI042 snake-case-type-alias 类型别名 {name} 应为 CamelCase
PYI043 t-suffixed-type-alias 私有类型别名 {name} 不应以 T 为后缀(T 后缀表示对象是 TypeVar
PYI044 future-annotations-in-stub from __future__ import annotations 在存根文件中无效,因为类型检查器会自动将存根视为具有这些语义
🛠️
PYI045 iter-method-return-iterable __aiter__ 方法应返回 AsyncIterator,而不是 AsyncIterable
PYI046 unused-private-protocol 私有协议 {name} 从未使用过
PYI047 unused-private-type-alias 私有 TypeAlias {name} 从未使用过
PYI048 stub-body-multiple-statements 函数体必须只包含一个语句
PYI049 unused-private-typed-dict 私有 TypedDict {name} 从未使用过
PYI050 no-return-argument-annotation-in-stub 参数注解优先使用 {module}.Never 而非 NoReturn
PYI051 redundant-literal-union Literal[{literal}] 在与 {builtin_type} 的联合中是冗余的
PYI052 unannotated-assignment-in-stub {name} 需要类型注解
PYI053 string-or-bytes-too-long 不允许长度超过 50 个字符的字符串和字节字面量
🛠️
PYI054 numeric-literal-too-long 不允许字符串表示长度超过十个字符的数字字面量
🛠️
PYI055 unnecessary-type-union 联合类型中存在多个 type 成员。请将它们合并为一个,例如 type[{union_str}]
🛠️
PYI056 unsupported-method-call-on-all __all__ 上调用 .{name}() 可能不被所有类型检查器支持(请改用 +=
PYI057 byte-string-usage 不要使用 {origin}.ByteString,它的语义不明确且已弃用
PYI058 generator-return-from-iter-method 简单 {method} 方法的返回值使用 {return_type}
🛠️
PYI059 generic-not-last-base-class Generic[] 应该始终是最后一个基类
🧪🛠️
PYI061 redundant-none-literal 使用 None 而不是 Literal[None]
🧪🛠️
PYI062 duplicate-literal-member 重复的字面量成员 {}
🛠️
PYI063 pep484-style-positional-only-parameter 位置参数只使用 PEP 570 语法
PYI064 redundant-final-literal Final[Literal[{literal}]] 可以替换为裸 Final
🛠️
PYI066 bad-version-info-order sys.version_info 比较中,应将较新 Python 版本的代码分支放在前面

flake8-pytest-style (PT)

更多信息,请参阅 PyPI 上的 flake8-pytest-style

有关相关设置,请参阅 flake8-pytest-style

代码 名称 消息
PT001 pytest-fixture-incorrect-parentheses-style 使用 @pytest.fixture{expected} 而不是 @pytest.fixture{actual}
🛠️
PT002 pytest-fixture-positional-args 固定装置 {function} 的配置通过位置参数指定,请使用关键字参数
PT003 pytest-extraneous-scope-function @pytest.fixture() 中隐含了 scope='function'
🛠️
PT004 pytest-missing-fixture-name-underscore 固定装置 {function} 不返回任何内容,请添加前导下划线
PT005 pytest-incorrect-fixture-name-underscore 固定装置 {function} 返回一个值,请移除前导下划线
PT006 pytest-parametrize-names-wrong-type 传递给 pytest.mark.parametrize 第一个参数的类型错误;预期为 {expected_string}
🛠️
PT007 pytest-parametrize-values-wrong-type pytest.mark.parametrize 中的值类型错误,预期为 {row}{values}
🛠️
PT008 pytest-patch-with-lambda 使用 return_value= 而不是用 lambda 打补丁
PT009 pytest-unittest-assertion 使用常规的 assert 而不是 unittest 风格的 {assertion}
🛠️
PT010 pytest-raises-without-exception pytest.raises() 中设置预期的异常
PT011 pytest-raises-too-broad pytest.raises({exception}) 范围太广,请设置 match 参数或使用更具体的异常
PT012 pytest-raises-with-multiple-statements pytest.raises() 块应包含一个简单的语句
PT013 pytest-incorrect-pytest-import pytest 导入不正确;请改用 import pytest
PT014 pytest-duplicate-parametrize-test-cases pytest.mark.parametrize 中索引为 {index} 的测试用例重复
🛠️
PT015 pytest-assert-always-false 断言始终失败,请替换为 pytest.fail()
PT016 pytest-fail-without-message 未向 pytest.fail() 传递消息
PT017 pytest-assert-in-except except 块中发现异常 {name} 的断言,请改用 pytest.raises()
PT018 pytest-composite-assertion 断言应分解为多个部分
🛠️
PT019 pytest-fixture-param-without-value 没有值的固定装置 {name} 被注入为参数,请改用 @pytest.mark.usefixtures
PT020 pytest-deprecated-yield-fixture @pytest.yield_fixture 已弃用,请使用 @pytest.fixture
PT021 pytest-fixture-finalizer-callback 使用 yield 而不是 request.addfinalizer
PT022 pytest-useless-yield-fixture 固定装置 {name} 没有拆卸,请使用 return 而不是 yield
🛠️
PT023 pytest-incorrect-mark-parentheses-style 使用 @pytest.mark.{mark_name}{expected_parens} 而不是 @pytest.mark.{mark_name}{actual_parens}
🛠️
PT024 pytest-unnecessary-asyncio-mark-on-fixture pytest.mark.asyncio 对于固定装置是不必要的
🛠️
PT025 pytest-erroneous-use-fixtures-on-fixture pytest.mark.usefixtures 对固定装置没有影响
🛠️
PT026 pytest-use-fixtures-without-parameters 没有参数的无用的 pytest.mark.usefixtures
🛠️
PT027 pytest-unittest-raises-assertion 使用 pytest.raises 而不是 unittest 风格的 {assertion}
🛠️
PT028 pytest-parameter-with-default-argument 测试函数参数 {} 具有默认参数
PT029 pytest-warns-without-warning pytest.warns() 中设置预期的警告
🧪
PT030 pytest-warns-too-broad pytest.warns({warning}) 范围太广,请设置 match 参数或使用更具体的警告
PT031 pytest-warns-with-multiple-statements pytest.warns() 块应包含一个简单的语句

flake8-quotes (Q)

更多信息,请参阅 PyPI 上的 flake8-quotes

有关相关设置,请参阅 flake8-quotes

代码 名称 消息
Q000 bad-quotes-inline-string 发现单引号,但首选双引号
🛠️
Q001 bad-quotes-multiline-string 发现单引号多行字符串,但首选双引号
🛠️
Q002 bad-quotes-docstring 发现单引号文档字符串,但首选双引号
🛠️
Q003 avoidable-escaped-quote 更改外部引号以避免转义内部引号
🛠️
Q004 unnecessary-escaped-quote 内部引号字符上不必要的转义
🛠️

flake8-raise (RSE)

更多信息,请参阅 PyPI 上的 flake8-raise

代码 名称 消息
RSE102 unnecessary-paren-on-raise-exception 抛出异常时不必要的括号
🛠️

flake8-return (RET)

更多信息,请参阅 PyPI 上的 flake8-return

代码 名称 消息
RET501 unnecessary-return-none 如果是唯一可能的返回值,函数中不要显式 return None
🛠️
RET502 implicit-return-value 不要在可以返回非 None 值的函数中隐式 return None
🛠️
RET503 implicit-return 能够在返回非 None 值的函数末尾缺少显式 return
🛠️
RET504 unnecessary-assign return 语句前对 {name} 进行不必要的赋值
🛠️
RET505 superfluous-else-return return 语句后不必要的 {branch}
🛠️
RET506 superfluous-else-raise raise 语句后不必要的 {branch}
🛠️
RET507 superfluous-else-continue continue 语句后不必要的 {branch}
🛠️
RET508 superfluous-else-break break 语句后不必要的 {branch}
🛠️

flake8-self (SLF)

更多信息,请参阅 PyPI 上的 flake8-self

有关相关设置,请参阅 flake8-self

代码 名称 消息
SLF001 private-member-access 访问了私有成员:{access}

flake8-simplify (SIM)

更多信息,请参阅 PyPI 上的 flake8-simplify

代码 名称 消息
SIM101 duplicate-isinstance-call {name} 的多个 isinstance 调用,合并为一个调用
🛠️
SIM102 collapsible-if 使用单个 if 语句代替嵌套的 if 语句
🛠️
SIM103 needless-bool 直接返回条件 {condition}
🛠️
SIM105 suppressible-exception 使用 contextlib.suppress({exception}) 代替 try-except-pass
🛠️
SIM107 return-in-try-except-finally 不要在 try-exceptfinally 中使用 return
SIM108 if-else-block-instead-of-if-exp 使用三元运算符 {contents} 代替 if-else
🛠️
SIM109 compare-with-tuple 使用 {replacement} 代替多个相等比较
🛠️
SIM110 reimplemented-builtin 使用 {replacement} 代替 for 循环
🛠️
SIM112 uncapitalized-environment-variables 使用大写的环境变量 {expected} 代替 {actual}
🛠️
SIM113 enumerate-for-loop for 循环中,索引变量 {index} 使用 enumerate()
SIM114 if-with-same-arms 使用逻辑 or 运算符合并 if 分支
🛠️
SIM115 open-file-with-context-handler 打开文件时使用上下文管理器
SIM116 if-else-block-instead-of-dict-lookup 使用字典代替连续的 if 语句
SIM117 multiple-with-statements 使用单个 with 语句与多个上下文,而不是嵌套的 with 语句
🛠️
SIM118 in-dict-keys 使用 key {operator} dict 代替 key {operator} dict.keys()
🛠️
SIM201 negate-equal-op 使用 {left} != {right} 代替 not {left} == {right}
🛠️
SIM202 negate-not-equal-op 使用 {left} == {right} 代替 not {left} != {right}
🛠️
SIM208 double-negation 使用 {expr} 代替 not (not {expr})
🛠️
SIM210 if-expr-with-true-false 移除不必要的 True if ... else False
🛠️
SIM211 if-expr-with-false-true 使用 not ... 代替 False if ... else True
🛠️
SIM212 if-expr-with-twisted-arms 使用 {expr_else} if {expr_else} else {expr_body} 代替 {expr_body} if not {expr_else} else {expr_else}
🛠️
SIM220 expr-and-not-expr 使用 False 代替 {name} and not {name}
🛠️
SIM221 expr-or-not-expr 使用 True 代替 {name} or not {name}
🛠️
SIM222 expr-or-true 使用 {expr} 代替 {replaced}
🛠️
SIM223 expr-and-false 使用 {expr} 代替 {replaced}
🛠️
SIM300 yoda-conditions 检测到 Yoda 条件
🛠️
SIM401 if-else-block-instead-of-dict-get 使用 {contents} 代替 if
🛠️
SIM905 split-static-string 考虑使用列表字面量代替 str.split
🛠️
SIM910 dict-get-with-none-default 使用 {expected} 代替 {actual}
🛠️
SIM911 zip-dict-keys-and-values 使用 {expected} 代替 {actual}
🛠️

flake8-slots (SLOT)

更多信息,请参阅 PyPI 上的 flake8-slots

代码 名称 消息
SLOT000 no-slots-in-str-subclass str 的子类应定义 __slots__
SLOT001 no-slots-in-tuple-subclass tuple 的子类应定义 __slots__
SLOT002 no-slots-in-namedtuple-subclass {namedtuple_kind} 的子类应定义 __slots__

flake8-tidy-imports (TID)

更多信息,请参阅 PyPI 上的 flake8-tidy-imports

有关相关设置,请参阅 flake8-tidy-imports

代码 名称 消息
TID251 banned-api {name} 被禁用:{message}
TID252 relative-imports 优先使用绝对导入而非来自父模块的相对导入
🛠️
TID253 banned-module-level-imports {name} 在模块级别被禁用

flake8-todos (TD)

更多信息,请参阅 GitHub 上的 flake8-todos

代码 名称 消息
TD001 invalid-todo-tag 无效的 TODO 标签:{tag}
TD002 missing-todo-author TODO 中缺少作者;请尝试:# TODO(<author_name>): ...# TODO @<author_name>: ...
TD003 missing-todo-link 此 TODO 缺少问题链接
TD004 missing-todo-colon TODO 中缺少冒号
TD005 missing-todo-description TODO 后缺少问题描述
TD006 invalid-todo-capitalization 无效的 TODO 大写形式:{tag} 应该是 TODO
🛠️
TD007 missing-space-after-todo-colon TODO 冒号后缺少空格

flake8-type-checking (TC)

更多信息,请参阅 PyPI 上的 flake8-type-checking

有关相关设置,请参阅 flake8-type-checking

代码 名称 消息
TC001 typing-only-first-party-import 将应用程序导入 {} 移到类型检查块中
🛠️
TC002 typing-only-third-party-import 将第三方导入 {} 移到类型检查块中
🛠️
TC003 typing-only-standard-library-import 将标准库导入 {} 移到类型检查块中
🛠️
TC004 runtime-import-in-type-checking-block 将导入 {qualified_name} 移出类型检查块。此导入不仅用于类型提示。
🛠️
TC005 empty-type-checking-block 发现空的类型检查块
🛠️
TC006 runtime-cast-value typing.cast() 的类型表达式中添加引号
🛠️
TC007 unquoted-type-alias 为类型别名添加引号
🛠️
TC008 quoted-type-alias 从类型别名中移除引号
🧪🛠️
TC010 runtime-string-union X | Y 风格的联合类型中存在无效的字符串成员

flake8-unused-arguments (ARG)

更多信息,请参阅 PyPI 上的 flake8-unused-arguments

有关相关设置,请参阅 flake8-unused-arguments

代码 名称 消息
ARG001 unused-function-argument 未使用的函数参数:{name}
ARG002 unused-method-argument 未使用的方法参数:{name}
ARG003 unused-class-method-argument 未使用的类方法参数:{name}
ARG004 unused-static-method-argument 未使用的静态方法参数:{name}
ARG005 unused-lambda-argument 未使用的 lambda 参数:{name}

flake8-use-pathlib (PTH)

更多信息,请参阅 PyPI 上的 flake8-use-pathlib

代码 名称 消息
PTH100 os-path-abspath os.path.abspath() 应替换为 Path.resolve()
🛠️
PTH101 os-chmod os.chmod() 应替换为 Path.chmod()
PTH102 os-mkdir os.mkdir() 应替换为 Path.mkdir()
PTH103 os-makedirs os.makedirs() 应替换为 Path.mkdir(parents=True)
PTH104 os-rename os.rename() 应替换为 Path.rename()
PTH105 os-replace os.replace() 应替换为 Path.replace()
PTH106 os-rmdir os.rmdir() 应替换为 Path.rmdir()
🛠️
PTH107 os-remove os.remove() 应替换为 Path.unlink()
🛠️
PTH108 os-unlink os.unlink() 应替换为 Path.unlink()
🛠️
PTH109 os-getcwd os.getcwd() 应替换为 Path.cwd()
🛠️
PTH110 os-path-exists os.path.exists() 应替换为 Path.exists()
🛠️
PTH111 os-path-expanduser os.path.expanduser() 应替换为 Path.expanduser()
🛠️
PTH112 os-path-isdir os.path.isdir() 应替换为 Path.is_dir()
🛠️
PTH113 os-path-isfile os.path.isfile() 应替换为 Path.is_file()
🛠️
PTH114 os-path-islink os.path.islink() 应替换为 Path.is_symlink()
🛠️
PTH115 os-readlink os.readlink() 应替换为 Path.readlink()
🛠️
PTH116 os-stat os.stat() 应替换为 Path.stat()Path.owner()Path.group()
PTH117 os-path-isabs os.path.isabs() 应替换为 Path.is_absolute()
🛠️
PTH118 os-path-join os.{module}.join() 应替换为使用 / 运算符的 Path
PTH119 os-path-basename os.path.basename() 应替换为 Path.name
🛠️
PTH120 os-path-dirname os.path.dirname() 应替换为 Path.parent
🛠️
PTH121 os-path-samefile os.path.samefile() 应替换为 Path.samefile()
PTH122 os-path-splitext os.path.splitext() 应替换为 Path.suffixPath.stemPath.parent
PTH123 builtin-open open() 应替换为 Path.open()
PTH124 py-path py.path 处于维护模式,请改用 pathlib
PTH201 path-constructor-current-directory 不要显式将当前目录传递给 Path
🛠️
PTH202 os-path-getsize os.path.getsize 应替换为 Path.stat().st_size
🛠️
PTH203 os-path-getatime os.path.getatime 应替换为 Path.stat().st_atime
🛠️
PTH204 os-path-getmtime os.path.getmtime 应替换为 Path.stat().st_mtime
🛠️
PTH205 os-path-getctime os.path.getctime 应替换为 Path.stat().st_ctime
🛠️
PTH206 os-sep-split .split(os.sep) 替换为 Path.parts
PTH207 glob {function} 替换为 Path.globPath.rglob
PTH208 os-listdir 请改用 pathlib.Path.iterdir()
PTH210 invalid-pathlib-with-suffix 传递给 .with_suffix() 的后缀无效
🛠️
PTH211 os-symlink os.symlink 应替换为 Path.symlink_to
🧪

flynt (FLY)

更多信息,请参阅 PyPI 上的 flynt

代码 名称 消息
FLY002 static-join-to-f-string 考虑使用 {expression} 而不是字符串连接
🛠️

isort (I)

更多信息,请参阅 PyPI 上的 isort

有关相关设置,请参阅 isort

代码 名称 消息
I001 unsorted-imports 导入块未排序或未格式化
🛠️
I002 missing-required-import 缺少必要的导入:{name}
🛠️

mccabe (C90)

更多信息,请参阅 PyPI 上的 mccabe

有关相关设置,请参阅 mccabe

代码 名称 消息
C901 complex-structure {name} 太复杂 ({complexity} > {max_complexity})

NumPy-specific rules (NPY)

代码 名称 消息
NPY001 numpy-deprecated-type-alias 类型别名 np.{type_name} 已弃用,请替换为内置类型
🛠️
NPY002 numpy-legacy-random 将旧版 np.random.{method_name} 调用替换为 np.random.Generator
NPY003 numpy-deprecated-function np.{existing} 已弃用;请改用 np.{replacement}
🛠️
NPY201 numpy2-deprecation np.{existing} 将在 NumPy 2.0 中移除。{migration_guide}
🛠️

pandas-vet (PD)

更多信息,请参阅 PyPI 上的 pandas-vet

代码 名称 消息
PD002 pandas-use-of-inplace-argument 应避免使用 inplace=True;它的行为不一致
🛠️
PD003 pandas-use-of-dot-is-null .isna 优于 .isnull;功能相同
PD004 pandas-use-of-dot-not-null .notna 优于 .notnull;功能相同
PD007 pandas-使用-点-ix .ix 已弃用;请使用更明确的 .loc.iloc
PD008 pandas-使用-点-at 使用 .loc 代替 .at。如果速度很重要,请使用 NumPy。
PD009 pandas-使用-点-iat 使用 .iloc 代替 .iat。如果速度很重要,请使用 NumPy。
PD010 pandas-使用-点-pivot-或-unstack .pivot_table 优于 .pivot.unstack;它们提供相同的功能
PD011 pandas-使用-点-values 使用 .to_numpy() 代替 .values
PD012 pandas-使用-点-read-table 使用 .read_csv 代替 .read_table 来读取 CSV 文件
PD013 pandas-使用-点-stack .melt 优于 .stack;它们提供相同的功能
PD015 pandas-使用-pd-merge 使用 .merge 方法代替 pd.merge 函数。它们具有相同的功能。
PD101 pandas-nunique-常量-series-检查 使用 series.nunique() 检查 series 是否为常量效率低下
PD901 pandas-df-变量名 避免为 DataFrames 使用通用变量名 df
⚠️

pep8-naming (N)

更多信息请参阅 PyPI 上的 pep8-naming

相关设置请参阅 pep8-naming

代码 名称 消息
N801 无效类名 类名 {name} 应使用大驼峰命名法 (CapWords convention)
N802 无效函数名 函数名 {name} 应为小写
N803 无效参数名 参数名 {name} 应为小写
N804 类方法第一个参数名无效 类方法的第一个参数应命名为 cls
🛠️
N805 方法第一个参数名无效 方法的第一个参数应命名为 self
🛠️
N806 函数中非小写变量 函数中的变量 {name} 应为小写
N807 dunder 函数名 函数名不应以 __ 开头和结尾
N811 常量导入为非常量 常量 {name} 导入为非常量 {asname}
N812 小写导入为非小写 小写 {name} 导入为非小写 {asname}
N813 驼峰式导入为小写 驼峰式 {name} 导入为小写 {asname}
N814 驼峰式导入为常量 驼峰式 {name} 导入为常量 {asname}
N815 类作用域中混合大小写变量 类作用域中的变量 {name} 不应为混合大小写
N816 全局作用域中混合大小写变量 全局作用域中的变量 {name} 不应为混合大小写
N817 驼峰式导入为首字母缩写 驼峰式 {name} 导入为首字母缩写 {asname}
N818 异常名称应带 Error 后缀 异常名称 {name} 应以 Error 后缀命名
N999 无效模块名 无效模块名: '{name}'

Perflint (PERF)

更多信息请参阅 PyPI 上的 Perflint

代码 名称 消息
PERF101 不必要的列表转换 不要在迭代可迭代对象之前将其转换为 list
🛠️
PERF102 不正确的字典迭代器 当只使用字典的 {subset} 时,请使用 {subset}() 方法
🛠️
PERF203 循环中的 try-except 循环内的 try-except 会带来性能开销
PERF401 手动列表推导 使用 {message_str} 创建转换后的列表
🛠️
PERF402 手动列表复制 使用 listlist.copy 创建列表副本
PERF403 手动字典推导 使用字典推导代替 {modifier} for 循环
🛠️

pycodestyle (E, W)

更多信息请参阅 PyPI 上的 pycodestyle

相关设置请参阅 pycodestyle

错误 (E)

代码 名称 消息
E101 混合空格和制表符 缩进包含混合的空格和制表符
E111 缩进不是无效倍数 缩进不是 {indent_width} 的倍数
🧪
E112 无缩进块 期望一个缩进块
🧪
E113 意外缩进 意外缩进
🧪
E114 缩进不是无效倍数(注释) 缩进不是 {indent_width} 的倍数(注释)
🧪
E115 无缩进块(注释) 期望一个缩进块(注释)
🧪
E116 意外缩进(注释) 意外缩进(注释)
🧪
E117 过度缩进 过度缩进(注释)
🧪
E201 开括号后的空格 '{symbol}' 后有空格
🧪🛠️
E202 闭括号前的空格 '{symbol}' 前有空格
🧪🛠️
E203 标点符号前的空格 '{symbol}' 前有空格
🧪🛠️
E204 装饰器后的空格 装饰器后有空格
🧪🛠️
E211 参数前的空格 '{bracket}' 前有空格
🧪🛠️
E221 运算符前的多个空格 运算符前有多个空格
🧪🛠️
E222 运算符后的多个空格 运算符后有多个空格
🧪🛠️
E223 运算符前的制表符 运算符前有制表符
🧪🛠️
E224 运算符后的制表符 运算符后有制表符
🧪🛠️
E225 运算符周围缺少空格 运算符周围缺少空格
🧪🛠️
E226 算术运算符周围缺少空格 算术运算符周围缺少空格
🧪🛠️
E227 位运算符或移位运算符周围缺少空格 位运算符或移位运算符周围缺少空格
🧪🛠️
E228 模运算符周围缺少空格 模运算符周围缺少空格
🧪🛠️
E231 缺少空格 {} 后缺少空格
🧪🛠️
E241 逗号后的多个空格 逗号后有多个空格
🧪🛠️
E242 逗号后的制表符 逗号后有制表符
🧪🛠️
E251 关键字/参数等号周围有意外空格 关键字/参数等号周围有意外空格
🧪🛠️
E252 参数等号周围缺少空格 参数等号周围缺少空格
🧪🛠️
E261 行内注释前空格太少 行内注释前至少插入两个空格
🧪🛠️
E262 行内注释后无空格 行内注释应以 # 开头
🧪🛠️
E265 块注释后无空格 块注释应以 # 开头
🧪🛠️
E266 块注释前有多个 # 块注释前有太多 #
🧪🛠️
E271 关键字后的多个空格 关键字后有多个空格
🧪🛠️
E272 关键字前的多个空格 关键字前有多个空格
🧪🛠️
E273 关键字后的制表符 关键字后有制表符
🧪🛠️
E274 关键字前的制表符 关键字前有制表符
🧪🛠️
E275 关键字后缺少空格 关键字后缺少空格
🧪🛠️
E301 方法之间空行 期望 {BLANK_LINES_NESTED_LEVEL:?} 个空行,实际找到 0 个
🧪🛠️
E302 顶层空行 期望 {expected_blank_lines:?} 个空行,实际找到 {actual_blank_lines} 个
🧪🛠️
E303 太多空行 空行太多 ({actual_blank_lines})
🧪🛠️
E304 装饰器后空行 函数装饰器后发现空行 ({lines})
🧪🛠️
E305 函数或类后空行 类或函数定义后期望有 2 个空行,实际找到 ({blank_lines})
🧪🛠️
E306 嵌套定义前空行 嵌套定义前期望有 1 个空行,实际找到 0 个
🧪🛠️
E401 单行多个导入 单行有多个导入
🛠️
E402 模块导入不在文件顶部 模块级导入不在单元格顶部
E501 行过长 行过长 ({width} > {limit})
E502 冗余反斜杠 冗余反斜杠
🧪🛠️
E701 单行多个语句(冒号) 单行有多个语句(冒号)
E702 单行多个语句(分号) 单行有多个语句(分号)
E703 无用分号 语句以不必要的分号结尾
🛠️
E711 None 比较 None 的比较应为 cond is None
🛠️
E712 True/False 比较 避免与 True 进行相等性比较;使用 {cond}: 进行真值检查
🛠️
E713 不在测试 成员资格测试应为 not in
🛠️
E714 不是测试 对象身份测试应为 is not
🛠️
E721 类型比较 使用 isis not 进行类型比较,或使用 isinstance() 进行实例检查
E722 裸 except 不要使用裸 except
E731 lambda 赋值 不要赋值 lambda 表达式,请使用 def
🛠️
E741 歧义变量名 歧义变量名: {name}
E742 歧义类名 歧义类名: {name}
E743 歧义函数名 歧义函数名: {name}
E902 IO 错误 {message}
E999 语法错误 SyntaxError

警告 (W)

代码 名称 消息
W191 制表符缩进 缩进包含制表符
W291 尾随空格 尾随空格
🛠️
W292 文件末尾缺少换行符 文件末尾没有换行符
🛠️
W293 含空格的空行 空行包含空格
🛠️
W391 文件末尾换行符太多 {domain} 末尾有太多换行符
🧪🛠️
W505 文档行过长 文档行过长 ({width} > {limit})
W605 无效转义序列 无效转义序列: \{ch}
🛠️

pydoclint (DOC)

更多信息请参阅 PyPI 上的 pydoclint

相关设置请参阅 pydoclint

代码 名称 消息
DOC201 文档字符串缺少返回 return 在文档字符串中未说明
🧪
DOC202 文档字符串多余的返回 文档字符串不应包含 returns 部分,因为函数没有返回任何内容
🧪
DOC402 文档字符串缺少 yield yield 在文档字符串中未说明
🧪
DOC403 文档字符串多余的 yield 文档字符串包含 "Yields" 部分,但函数没有生成任何内容
🧪
DOC501 文档字符串缺少异常 文档字符串中缺少抛出的异常 {id}
🧪
DOC502 文档字符串多余的异常 未明确抛出异常: {id}
🧪

pydocstyle (D)

更多信息请参阅 PyPI 上的 pydocstyle

相关设置请参阅 pydocstyle

代码 名称 消息
D100 未文档化的公共模块 公共模块缺少文档字符串
D101 未文档化的公共类 公共类缺少文档字符串
D102 未文档化的公共方法 公共方法缺少文档字符串
D103 未文档化的公共函数 公共函数缺少文档字符串
D104 未文档化的公共包 公共包缺少文档字符串
D105 未文档化的魔法方法 魔法方法缺少文档字符串
D106 未文档化的公共嵌套类 公共嵌套类缺少文档字符串
D107 未文档化的公共 init __init__ 中缺少文档字符串
D200 不必要的多行文档字符串 单行文档字符串应放在一行上
🛠️
D201 函数前空行 函数文档字符串前不允许有空行(找到 {num_lines} 行)
🛠️
D202 函数后空行 函数文档字符串后不允许有空行(找到 {num_lines} 行)
🛠️
D203 类前不正确的空行 类文档字符串前需要 1 个空行
🛠️
D204 类后不正确的空行 类文档字符串后需要 1 个空行
🛠️
D205 摘要后缺少空行 摘要行与描述之间需要 1 个空行
🛠️
D206 文档字符串制表符缩进 文档字符串应使用空格而非制表符缩进
D207 缩进不足 文档字符串缩进不足
🛠️
D208 过度缩进 文档字符串过度缩进
🛠️
D209 最后一段后换行 多行文档字符串的结束引号应位于单独一行
🛠️
D210 周围的空格 文档字符串文本周围不允许有空格
🛠️
D211 类前空行 类文档字符串前不允许有空行
🛠️
D212 多行摘要第一行 多行文档字符串摘要应从第一行开始
🛠️
D213 多行摘要第二行 多行文档字符串摘要应从第二行开始
🛠️
D214 节过度缩进 节过度缩进("{name}")
🛠️
D215 节下划线过度缩进 节下划线过度缩进("{name}")
🛠️
D300 三引号 使用三引号 """
🛠️
D301 文档字符串中的转义序列 如果文档字符串中包含反斜杠,请使用 r"""
🛠️
D400 缺少句号 第一行应以句号结尾
🛠️
D401 非祈使语气 文档字符串的第一行应为祈使语气: "{first_line}"
D402 文档字符串中的签名 第一行不应是函数的签名
D403 首字母未大写 文档字符串的首个单词应大写: {} -> {}
🛠️
D404 文档字符串以 "This" 开头 文档字符串的首个单词不应是 "This"
D405 节名称未大写 节名称应正确大写("{name}")
🛠️
D406 节名称后缺少换行符 节名称应以换行符结尾("{name}")
🛠️
D407 节后缺少虚线下划线 节后缺少虚线下划线("{name}")
🛠️
D408 节名称后缺少节下划线 节下划线应位于节名称后的行中("{name}")
🛠️
D409 节下划线长度不匹配 节下划线应与其名称的长度匹配("{name}")
🛠️
D410 节后无空行 节后缺少空行("{name}")
🛠️
D411 节前无空行 节前缺少空行("{name}")
🛠️
D412 标题与内容之间有空行 节标题与其内容之间不允许有空行("{name}")
🛠️
D413 最后一节后缺少空行 最后一节后缺少空行("{name}")
🛠️
D414 空文档字符串节 节没有内容("{name}")
D415 缺少末尾标点符号 第一行应以句号、问号或感叹号结尾
🛠️
D416 节名称缺少冒号 节名称应以冒号结尾("{name}")
🛠️
D417 未文档化参数 文档字符串中缺少参数 {definition}: {name} 的描述
D418 带文档字符串的重载 @overload 装饰的函数不应包含文档字符串
D419 空文档字符串 文档字符串为空

Pyflakes (F)

更多信息请参阅 PyPI 上的 Pyflakes

代码 名称 消息
F401 未使用的导入 导入了 {name} 但未使用;考虑使用 importlib.util.find_spec 来测试可用性
🛠️
F402 导入被循环变量遮蔽 来自 {row} 的导入 {name} 被循环变量遮蔽
F403 使用 import * 时未定义局部变量 使用了 from {name} import *;无法检测到未定义名称
F404 晚期 future 导入 from __future__ 导入必须在文件开头
F405 使用 import * 时未定义局部变量 {name} 可能未定义,或由星形导入定义
F406 嵌套使用 import * 时未定义局部变量 from {name} import * 只允许在模块级别使用
F407 未来特性未定义 未来特性 {name} 未定义
F501 百分号格式无效 %-format 字符串的格式字符串无效: {message}
F502 百分号格式期望映射 %-format 字符串期望映射但得到序列
F503 百分号格式期望序列 %-format 字符串期望序列但得到映射
F504 百分号格式多余的命名参数 %-format 字符串有未使用的命名参数: {message}
🛠️
F505 百分号格式缺少参数 %-format 字符串缺少占位符的参数: {message}
F506 百分号格式混合位置和命名占位符 %-format 字符串混合了位置和命名占位符
F507 百分号格式位置参数数量不匹配 %-format 字符串有 {wanted} 个占位符,但有 {got} 个替换项
F508 百分号格式星号需要序列 %-format 字符串 * 指定符需要序列
F509 百分号格式不支持的格式字符 %-format 字符串有不支持的格式字符 {char}
F521 字符串点格式无效 .format 调用有无效的格式字符串: {message}
F522 字符串点格式多余的命名参数 .format 调用有未使用的命名参数: {message}
🛠️
F523 字符串点格式多余的位置参数 .format 调用在位置 {message} 处有未使用的参数
🛠️
F524 字符串点格式缺少参数 .format 调用缺少占位符的参数: {message}
F525 字符串点格式混合自动和手动编号 .format 字符串混合了自动和手动编号
F541 f-string 缺少占位符 f-string 不包含任何占位符
🛠️
F601 多值重复键字面量 字典键字面量 {name} 重复
🛠️
F602 多值重复键变量 字典键 {name} 重复
🛠️
F621 星号赋值中的表达式 星号解包赋值中的表达式过多
F622 多个带星号表达式 赋值中有两个带星号表达式
F631 断言元组 断言测试是非空元组,这始终为 True
F632 是字面量 使用 == 比较常量字面量
🛠️
F633 无效打印语法 print 函数中使用 >> 是无效的
F634 if 元组 if 测试是元组,这始终为 True
F701 循环外 break break 在循环外
F702 循环外 continue continue 未正确在循环中
F704 函数外 yield {keyword} 语句在函数外
F706 函数外 return return 语句在函数/方法外
F707 默认 except 不在最后 except 块不是最后一个异常处理器
F722 前向注解语法错误 前向注解语法错误: {parse_error}
F811 重定义但未使用 重定义了来自 {row} 的未使用 {name}
🛠️
F821 未定义名称 未定义名称 {name}。{tip}
F822 未定义导出 __all__ 中未定义名称 {name}
F823 未定义局部变量 局部变量 {name} 在赋值前被引用
F841 未使用变量 局部变量 {name} 已赋值但从未使用
🛠️
F842 未使用注解 局部变量 {name} 已注解但从未使用
F901 raise NotImplemented raise NotImplemented 应该改为 raise NotImplementedError
🛠️

pygrep-hooks (PGH)

更多信息请参阅 GitHub 上的 pygrep-hooks

代码 名称 消息
PGH001 eval 不允许使用内置函数 eval()
PGH002 弃用的日志警告 warn 已弃用,请使用 warning
🛠️
PGH003 全面类型忽略 忽略类型问题时使用特定规则代码
PGH004 全面 noqa 使用 noqa 时使用特定规则代码
🛠️
PGH005 无效模拟访问 应调用模拟方法: {name}

Pylint (PL)

更多信息请参阅 PyPI 上的 Pylint

约定 (PLC)

代码 名称 消息
PLC0105 类型名称方差不正确 {kind} 名称 "{param_name}" 未反映其 {variance};请考虑将其重命名为 "{replacement_name}"
PLC0131 类型双向方差 {kind} 不能既是协变的又是逆变的
PLC0132 类型参数名不匹配 {kind} 名称 {param_name} 与赋值变量名 {var_name} 不匹配
PLC0205 单一字符串槽位 __slots__ 应为非字符串可迭代对象
PLC0206 字典索引缺少 items 未调用 .items() 从字典中提取值
PLC0207 缺少 maxsplit 参数 maxsplit=1 传递给 str.{actual_split_type}()
🧪
PLC0208 集合迭代 迭代值时请使用序列类型而不是集合
🛠️
PLC0414 无用的导入别名 导入别名未重命名原始包
🛠️
PLC0415 顶层外部导入 import 应位于文件的顶层
PLC1802 len 测试 len({expression}) 作为条件使用而没有比较
🛠️
PLC1901 与空字符串比较 {existing} 可以简化为 {replacement},因为空字符串是虚值
🧪
PLC2401 非 ASCII 名称 {kind} 名称 {name} 包含非 ASCII 字符
PLC2403 非 ASCII 导入名称 模块别名 {name} 包含非 ASCII 字符
PLC2701 导入私有名称 从外部模块 {module} 导入私有名称 {name}
🧪
PLC2801 不必要的 dunder 调用 {method} 进行不必要的 dunder 调用。{replacement}。
🧪🛠️
PLC3002 不必要的直接 lambda 调用 lambda 表达式被直接调用。请内联执行该表达式。

错误 (PLE)

代码 名称 消息
PLE0100 init 中有 yield __init__ 方法是生成器
PLE0101 init 中有 return __init__ 中有显式 return
PLE0115 nonlocal 和 global 名称 {name} 既是 nonlocal 又是 global
PLE0116 finally 中有 continue continue 子句中不支持 finally
PLE0117 无绑定的 nonlocal 找到没有绑定的 nonlocal 名称 {name}
PLE0118 全局声明前加载 名称 {name} 在 {row} 处的全局声明之前使用
PLE0237 非槽位赋值 属性 {name} 未在类的 __slots__ 中定义
PLE0241 重复基类 {class} 有重复的基类 {base}
🛠️
PLE0302 意外的特殊方法签名 特殊方法 {} 期望 {},实际提供了 {} {}
PLE0303 无效长度返回类型 __len__ 未返回非负整数
PLE0304 无效布尔返回类型 __bool__ 未返回 bool
🧪
PLE0305 无效索引返回类型 __index__ 未返回整数
PLE0307 无效字符串返回类型 __str__ 未返回 str
PLE0308 无效字节返回类型 __bytes__ 未返回 bytes
PLE0309 无效哈希返回类型 __hash__ 未返回整数
PLE0604 无效的 __all__ 对象 __all__ 中存在无效对象,必须只包含字符串
PLE0605 无效的 __all__ 格式 __all__ 的格式无效,必须是 tuplelist
PLE0643 潜在索引错误 表达式可能引发 IndexError
PLE0704 裸 raise 语句位置不当 raise 语句不在异常处理器内
PLE1132 重复的关键字参数 重复的关键字参数: {duplicate_keyword}
PLE1141 字典迭代缺少 items 迭代中解包字典时未调用 .items()
🧪🛠️
PLE1142 async 外部 await await 应在 async 函数内部使用
PLE1205 日志记录参数过多 logging 格式字符串的参数过多
PLE1206 日志记录参数过少 logging 格式字符串的参数不足
PLE1300 错误字符串格式字符 不支持的格式字符 '{format_char}'
PLE1307 错误字符串格式类型 格式类型与参数类型不匹配
PLE1310 错误的 str.strip 调用 字符串 {strip} 调用包含重复字符(你是不是想写 {removal}?)
PLE1507 无效环境变量值 os.getenv 初始参数类型无效;期望 str
PLE1519 singledispatch 方法 @singledispatch 装饰器不应用于方法
🛠️
PLE1520 singledispatchmethod 函数 @singledispatchmethod 装饰器不应用于非方法函数
🛠️
PLE1700 异步函数中有 yield from 异步函数中有 yield from 语句;请改用 async for
PLE2502 双向 Unicode 包含可能导致代码混淆的控制字符
PLE2510 无效字符退格 无效的未转义字符退格,请使用 "\b"
🛠️
PLE2512 无效字符 SUB 无效的未转义字符 SUB,请使用 "\x1A"
🛠️
PLE2513 无效字符 ESC 无效的未转义字符 ESC,请使用 "\x1B"
🛠️
PLE2514 无效字符 NUL 无效的未转义字符 NUL,请使用 "\0"
🛠️
PLE2515 无效字符零宽度空格 无效的未转义字符零宽度空格,请使用 "\u200B"
🛠️
PLE4703 修改迭代中的集合 迭代中的集合 {name}for 循环内被修改
🧪🛠️

重构 (PLR)

代码 名称 消息
PLR0124 与自身比较 名称与自身比较,请考虑替换 {actual}
PLR0133 常量比较 比较中对两个常量进行比较,请考虑替换 {left_constant} {op} {right_constant}
PLR0202 无 classmethod 装饰器 类方法未定义装饰器
🧪🛠️
PLR0203 无 staticmethod 装饰器 静态方法未定义装饰器
🧪🛠️
PLR0206 带参数的属性 属性不能定义参数
PLR0402 手动 from 导入 请使用 from {module} import {name} 而非别名
🛠️
PLR0904 太多公共方法 公共方法过多 ({methods} > {max_methods})
🧪
PLR0911 太多 return 语句 return 语句过多 ({returns} > {max_returns})
PLR0912 太多分支 分支过多 ({branches} > {max_branches})
PLR0913 太多参数 函数定义中的参数过多 ({c_args} > {max_args})
PLR0914 太多局部变量 局部变量过多 ({current_amount}/{max_amount})
🧪
PLR0915 太多语句 语句过多 ({statements} > {max_statements})
PLR0916 太多布尔表达式 布尔表达式过多 ({expressions} > {max_expressions})
🧪
PLR0917 太多位置参数 位置参数过多 ({c_pos}/{max_pos})
🧪
PLR1701 重复的 isinstance 调用 合并 isinstance 调用: {expression}
🛠️
PLR1702 太多嵌套块 嵌套块过多 ({nested_blocks} > {max_nested_blocks})
🧪
PLR1704 从局部变量重定义参数 用局部名称 {name} 重定义参数
PLR1706 and-or 三元表达式 考虑使用 if-else 表达式
PLR1711 无用的 return 函数末尾有无用的 return 语句
🛠️
PLR1714 重复的相等性比较 考虑合并多个比较: {expression}。如果元素可哈希,请使用集合。
🛠️
PLR1716 布尔链式比较 包含可简化的链式布尔比较
🛠️
PLR1722 sys.exit 别名 请使用 sys.exit() 而非 {name}
🛠️
PLR1730 if 语句 min/max if 语句替换为 {replacement}
🛠️
PLR1733 不必要的字典索引查找 不必要地通过键查找字典值
🛠️
PLR1736 不必要的列表索引查找 enumerate() 循环中的列表索引查找
🛠️
PLR2004 魔术值比较 比较中使用了魔术值,请考虑用常量变量替换 {value}
PLR2044 空注释 空注释行
🛠️
PLR5501 可折叠的 else-if 使用 elif 而非 else 后跟 if,以减少缩进
🛠️
PLR6104 非增强赋值 直接使用 {operator} 执行增强赋值
🧪🛠️
PLR6201 字面量成员资格 测试成员资格时请使用集合字面量
🧪🛠️
PLR6301 无 self 使用 方法 {method_name} 可以是函数、类方法或静态方法
🧪

警告 (PLW)

代码 名称 消息
PLW0108 不必要的 lambda lambda 可能不必要;考虑内联内部函数
🧪🛠️
PLW0120 循环中无用的 else 循环中的 else 子句没有 break 语句;请移除 else 并取消其内容的缩进
🛠️
PLW0127 变量自赋值 变量 {name} 的自赋值
PLW0128 重新声明的赋值名称 赋值中重新声明的变量 {name}
PLW0129 对字符串字面量断言 对空字符串字面量进行断言永远不会通过
PLW0131 无上下文的命名表达式 命名表达式在无上下文的情况下使用
PLW0133 无用的异常语句 异常中缺少 raise 语句
🛠️
PLW0177 NaN 比较 与 NaN 值比较;请改用 math.isnan
PLW0211 bad-staticmethod-argument 静态方法的第一个参数不应命名为 {argument_name}
PLW0244 redefined-slots-in-subclass 槽位 {slot_name} 从基类 {base} 重新定义
🧪
PLW0245 super-without-brackets super 调用缺少括号
🛠️
PLW0406 import-self 模块 {name} 导入自身
PLW0602 global-variable-not-assigned {name} 使用了 global,但未进行赋值
PLW0603 global-statement 不建议使用 global 语句更新 {name}
PLW0604 global-at-module-level 模块级别的 global 是多余的
PLW0642 self-or-cls-assignment 在 {method_type} 方法中重新赋值了 {} 变量
PLW0711 binary-op-exception 要捕获的异常是二进制 and 操作的结果
PLW1501 bad-open-mode {mode} 对于 open 而言不是有效的模式
PLW1507 shallow-copy-environ 通过 copy.copy(os.environ) 浅拷贝 os.environ
🛠️
PLW1508 invalid-envvar-default 环境变量默认值类型无效;应为 strNone
PLW1509 subprocess-popen-preexec-fn 在使用线程时,preexec_fn 参数不安全
PLW1510 subprocess-run-without-check subprocess.run 未显式指定 check 参数
🛠️
PLW1514 unspecified-encoding 文本模式下的 {function_name} 未显式指定 encoding 参数
🧪🛠️
PLW1641 eq-without-hash 对象未实现 __hash__ 方法
PLW2101 useless-with-lock with 语句中直接创建的线程锁无效
PLW2901 redefined-loop-name 外部 {outer_kind} 变量 {name} 被内部 {inner_kind} 目标覆盖
PLW3201 bad-dunder-method-name 双下划线方法 {name} 在 Python 3 中没有特殊含义
🧪
PLW3301 nested-min-max 嵌套的 {func} 调用可以展平
🛠️

pyupgrade (UP)

更多信息,请参阅 PyPI 上的 pyupgrade

有关相关设置,请参阅 pyupgrade

代码 名称 消息
UP001 useless-metaclass-type __metaclass__ = type 是隐含的
🛠️
UP003 type-of-primitive 使用 {} 代替 type(...)
🛠️
UP004 useless-object-inheritance {name} 继承自 object
🛠️
UP005 deprecated-unittest-alias {alias} 已弃用,请使用 {target}
🛠️
UP006 non-pep585-annotation 类型注解请使用 {to} 代替 {from}
🛠️
UP007 non-pep604-annotation-union 类型注解请使用 X | Y
🛠️
UP008 super-call-with-parameters 使用 super() 代替 super(__class__, self)
🛠️
UP009 utf8-encoding-declaration UTF-8 编码声明是不必要的
🛠️
UP010 unnecessary-future-import 对于目标 Python 版本,不必要的 __future__ 导入 {import}
🛠️
UP011 lru-cache-without-parameters functools.lru_cache 多余的括号
🛠️
UP012 unnecessary-encode-utf8 不必要的 UTF-8 encode 调用
🛠️
UP013 convert-typed-dict-functional-to-class {name}TypedDict 函数式语法转换为类语法
🛠️
UP014 convert-named-tuple-functional-to-class {name}NamedTuple 函数式语法转换为类语法
🛠️
UP015 redundant-open-modes 多余的模式参数
🛠️
UP017 datetime-timezone-utc 使用 datetime.UTC 别名
🛠️
UP018 native-literals 不必要的 {literal_type} 调用(重写为字面量)
🛠️
UP019 typing-text-str-alias typing.Text 已弃用,请使用 str
🛠️
UP020 open-alias 使用内置的 open
🛠️
UP021 replace-universal-newlines universal_newlines 已弃用,请使用 text
🛠️
UP022 replace-stdout-stderr 优先使用 capture_output 而不是将 stdoutstderr 发送到 PIPE
🛠️
UP023 deprecated-c-element-tree cElementTree 已弃用,请使用 ElementTree
🛠️
UP024 os-error-alias 将别名错误替换为 OSError
🛠️
UP025 unicode-kind-prefix 从字符串中移除 unicode 字面量
🛠️
UP026 deprecated-mock-import mock 已弃用,请使用 unittest.mock
🛠️
UP027 unpacked-list-comprehension 将解包的列表推导式替换为生成器表达式
UP028 yield-in-for-loop for 循环中的 yield 替换为 yield from
🛠️
UP029 unnecessary-builtin-import 不必要的内置导入:{import}
🛠️
UP030 format-literals 对位置格式字段使用隐式引用
🛠️
UP031 printf-string-formatting 使用格式说明符而不是百分号格式
🛠️
UP032 f-string 使用 f-string 代替 format 调用
🛠️
UP033 lru-cache-with-maxsize-none 使用 @functools.cache 代替 @functools.lru_cache(maxsize=None)
🛠️
UP034 extraneous-parentheses 避免多余的括号
🛠️
UP035 deprecated-import 请从 {target} 导入:{names}
🛠️
UP036 outdated-version-block 对于最低 Python 版本,版本块已过时
🛠️
UP037 quoted-annotation 从类型注解中移除引号
🛠️
UP038 non-pep604-isinstance {} 调用中,使用 X | Y 代替 (X, Y)
⚠️🛠️
UP039 unnecessary-class-parentheses 类定义后多余的括号
🛠️
UP040 non-pep695-type-alias 类型别名 {name} 使用 {type_alias_method} 而不是 type 关键字
🛠️
UP041 timeout-error-alias 将别名错误替换为 TimeoutError
🛠️
UP042 replace-str-enum 类 {name} 同时继承自 strenum.Enum
🧪🛠️
UP043 unnecessary-default-type-args 不必要的默认类型参数
🛠️
UP044 non-pep646-unpack 使用 * 进行解包
🛠️
UP045 non-pep604-annotation-optional 类型注解请使用 X | None
🛠️
UP046 non-pep695-generic-class 泛型类 {name} 使用 Generic 子类而不是类型参数
🛠️
UP047 non-pep695-generic-function 泛型函数 {name} 应使用类型参数
🛠️
UP049 private-type-parameter 泛型 {} 使用私有类型参数
🛠️
UP050 useless-class-metaclass-type {name} 使用 metaclass=type,这是多余的
🧪🛠️

refurb (FURB)

更多信息,请参阅 PyPI 上的 refurb

代码 名称 消息
FURB101 read-whole-file openread 应替换为 Path({filename}).{suggestion}
🧪
FURB103 write-whole-file openwrite 应替换为 Path({filename}).{suggestion}
🧪
FURB105 print-empty-string 传递给 print 的空字符串是多余的
🛠️
FURB110 if-exp-instead-of-or-operator or 运算符替换三元 if 表达式
🧪🛠️
FURB113 repeated-append 使用 {suggestion} 代替重复调用 {name}.append()
🧪🛠️
FURB116 f-string-number-format {function_name} 调用替换为 {display}
🧪🛠️
FURB118 reimplemented-operator 使用 operator.{operator} 代替定义 {target}
🧪🛠️
FURB122 for-loop-writes 在 for 循环中使用 {}.write
🛠️
FURB129 readlines-in-for 不要调用 readlines(),直接迭代文件对象
🛠️
FURB131 delete-full-slice 优先使用 clear 而不是删除完整切片
🧪🛠️
FURB132 check-and-remove-from-set 使用 {suggestion} 代替检查并 remove
🛠️
FURB136 if-expr-min-max {min_max} 调用替换 if 表达式
🛠️
FURB140 reimplemented-starmap 使用 itertools.starmap 代替生成器
🧪🛠️
FURB142 for-loop-set-mutations 在 for 循环中使用 set.{}()
🧪🛠️
FURB145 slice-copy 优先使用 copy 方法而不是切片
🧪🛠️
FURB148 unnecessary-enumerate enumerate 值未被使用,请使用 for x in range(len(y))
🧪🛠️
FURB152 math-constant {literal} 替换为 math.{constant}
🧪🛠️
FURB154 repeated-global 重复连续使用 {}
🧪🛠️
FURB156 hardcoded-string-charset 使用了硬编码的字符串字符集
🧪🛠️
FURB157 verbose-decimal-constructor Decimal 构造函数中冗余的表达式
🛠️
FURB161 bit-count 使用了 bin({existing}).count('1')
🛠️
FURB162 fromisoformat-replace-z 不必要的零偏移时区替换
🛠️
FURB163 redundant-log-base 优先使用 math.{log_function}({arg}) 而不是带有冗余基数的 math.log
🛠️
FURB164 unnecessary-from-float {constructor} 构造中冗余的方法 {method_name}
🧪🛠️
FURB166 int-on-sliced-str 移除前缀后,使用带有显式 base={base}int
🛠️
FURB167 regex-flag-alias 使用了正则表达式别名 re.{}
🛠️
FURB168 isinstance-type-none 检查对象是否为 None 时,优先使用 is 运算符而不是 isinstance
🛠️
FURB169 type-none-comparison 在检查 None 时,使用 {} 代替与 type(None) 的比较
🛠️
FURB171 single-item-membership-test 针对单项容器的成员测试
🧪🛠️
FURB177 implicit-cwd 对于当前目录查找,优先使用 Path.cwd() 而不是 Path().resolve()
🛠️
FURB180 meta-class-abc-meta 使用 metaclass=abc.ABCMeta 定义抽象基类
🧪🛠️
FURB181 hashlib-digest-hex 使用 hashlib 的 .digest().hex()
🛠️
FURB187 list-reverse-copy 在列表 {name} 上使用 reversed 赋值
🛠️
FURB188 slice-to-remove-prefix-or-suffix 优先使用 str.removeprefix() 而不是有条件地用切片替换。
🛠️
FURB189 subclass-builtin 子类化 {subclass} 可能会出错,请使用 collections.{replacement} 代替
🧪🛠️
FURB192 sorted-min-max 计算序列中的最小值时,优先使用 min 而不是 sorted()
🧪🛠️

Ruff 特有规则 (RUF)

代码 名称 消息
RUF001 ambiguous-unicode-character-string 字符串包含模糊的 {}。您是指 {} 吗?
RUF002 ambiguous-unicode-character-docstring 文档字符串包含模糊的 {}。您是指 {} 吗?
RUF003 ambiguous-unicode-character-comment 注释包含模糊的 {}。您是指 {} 吗?
RUF005 collection-literal-concatenation 考虑使用 {expression} 而不是连接
🛠️
RUF006 asyncio-dangling-task 存储对 {expr}.{method} 返回值的引用
RUF007 zip-instead-of-pairwise 迭代连续对时,优先使用 itertools.pairwise() 而不是 zip()
🛠️
RUF008 mutable-dataclass-default 不要对 dataclass 属性使用可变默认值
RUF009 function-call-in-dataclass-default-argument 不要在 dataclass 默认参数中执行函数调用 {name}
RUF010 explicit-f-string-type-conversion 使用显式转换标志
🛠️
RUF011 ruff-static-key-dict-comprehension 字典推导式使用了静态键
RUF012 mutable-class-default 可变类属性应使用 typing.ClassVar 进行注解
RUF013 implicit-optional PEP 484 禁止隐式 Optional
🛠️
RUF015 unnecessary-iterable-allocation-for-first-element 优先使用 next({iterable}) 而不是单元素切片
🛠️
RUF016 invalid-index-type 类型 {value_type} 的索引访问中的切片使用了类型 {index_type} 而不是整数
RUF017 quadratic-list-summation 避免二次列表求和
🛠️
RUF018 assignment-in-assert 避免在 assert 语句中使用赋值表达式
RUF019 unnecessary-key-check 字典访问前不必要的键检查
🛠️
RUF020 never-union {never_like} | T 等同于 T
🛠️
RUF021 parenthesize-chained-operators andor 链式连接时,请给 a and b 表达式加上括号,以明确优先级
🛠️
RUF022 unsorted-dunder-all __all__ 未排序
🛠️
RUF023 unsorted-dunder-slots {}.__slots__ 未排序
🛠️
RUF024 mutable-fromkeys-value 不要将可变对象作为值传递给 dict.fromkeys
🛠️
RUF026 default-factory-kwarg default_factorydefaultdict 的仅限位置参数
🛠️
RUF027 missing-f-string-syntax 可能缺少 f 前缀的 f-string
🧪🛠️
RUF028 invalid-formatter-suppression-comment 此抑制注释无效,因为 {}
🛠️
RUF029 unused-async 函数 {name} 声明为 async,但未 await 或使用 async 特性。
🧪
RUF030 assert-with-print-message assert 语句中的 print() 调用可能不是有意的
🛠️
RUF031 incorrectly-parenthesized-tuple-in-subscript 下标中的元组请使用括号
🧪🛠️
RUF032 decimal-from-float-literal Decimal() 使用浮点数字面量作为参数
🛠️
RUF033 post-init-default 带有参数默认值的 __post_init__ 方法
🛠️
RUF034 useless-if-else 无用的 if-else 条件
RUF035 ruff-unsafe-markup-use 检测到不安全地使用 {name}
RUF036 none-not-at-end-of-union None 不在类型注解的末尾。
🧪
RUF037 unnecessary-empty-iterable-within-deque-call deque 调用中不必要的空可迭代对象
🧪🛠️
RUF038 redundant-bool-literal Literal[True, False, ...] 可以替换为 Literal[...] | bool
🧪🛠️
RUF039 unraw-re-pattern {call} 的第一个参数不是原始字符串
🧪🛠️
RUF040 invalid-assert-message-literal-argument 非字符串字面量用作 assert 消息
RUF041 unnecessary-nested-literal 不必要的嵌套 Literal
🛠️
RUF043 pytest-raises-ambiguous-pattern 传递给 match= 的模式包含元字符,但既未转义也非原始字符串
🧪
RUF045 implicit-class-var-in-dataclass 在 dataclass 主体中发现未带注解的赋值
🧪
RUF046 unnecessary-cast-to-int 被转换为 int 的值已经是整数
🛠️
RUF047 needless-else 空的 else 子句
🧪🛠️
RUF048 map-int-version-parsing __version__ 可能包含非整数类元素
RUF049 dataclass-enum 枚举类不应使用 @dataclass 装饰器
RUF051 if-key-in-dict-del 使用 pop 代替 key in dict 后跟 del dict[key]
🛠️
RUF052 used-dummy-variable 局部哑变量 {} 被访问
🧪🛠️
RUF053 class-with-mixed-type-vars 带有类型参数列表的类继承自 Generic
🛠️
RUF054 indented-form-feed 缩进的换页符
🧪
RUF055 unnecessary-regular-expression 普通字符串模式传递给 re 函数
🧪🛠️
RUF056 falsy-dict-get-fallback 在布尔测试位置避免为 dict.get() 提供虚假的回退值。默认回退值 None 已经是虚假的。
🧪🛠️
RUF057 unnecessary-round 被四舍五入的值已经是整数
🛠️
RUF058 starmap-zip itertools.starmapzip 可迭代对象上调用
🛠️
RUF059 unused-unpacked-variable 解包变量 {name} 从未使用过
🧪🛠️
RUF060 in-empty-collection 对空集合进行不必要的成员测试
🧪
RUF061 legacy-form-pytest-raises 使用 pytest.{}() 的上下文管理器形式
🧪🛠️
RUF063 access-annotations-from-class-dict 使用 {suggestion} 而不是 __dict__ 访问
🧪
RUF064 non-octal-permissions 非八进制模式
🧪🛠️
RUF100 unused-noqa 未使用的 noqa 指令
🛠️
RUF101 redirected-noqa {original}{target} 的重定向
🛠️
RUF102 invalid-rule-code # noqa 中的规则代码无效:{}
🧪🛠️
RUF200 invalid-pyproject-toml 解析 pyproject.toml 失败:{message}

tryceratops (TRY)

更多信息,请参阅 PyPI 上的 tryceratops

代码 名称 消息
TRY002 raise-vanilla-class 创建您自己的异常
TRY003 raise-vanilla-args 避免在异常类外部指定长消息
TRY004 type-check-without-type-error 对于无效类型,优先使用 TypeError 异常
TRY200 reraise-no-cause 使用 raise from 指定异常原因
TRY201 verbose-raise 使用 raise 而不指定异常名称
🛠️
TRY203 useless-try-except 移除异常处理程序;错误会立即重新引发
TRY300 try-consider-else 考虑将此语句移至 else
TRY301 raise-within-try raise 抽象为内部函数
TRY400 error-instead-of-exception 使用 logging.exception 而不是 logging.error
🛠️
TRY401 verbose-log-message logging.exception 调用中包含冗余的异常对象