规则
Ruff 支持 800 多条 lint 规则,其中许多规则的灵感来源于 Flake8、isort、pyupgrade 等流行工具。无论规则的来源是什么,Ruff 都将每条规则作为第一方功能在 Rust 中重新实现。
默认情况下,Ruff 启用 Flake8 的 F
规则以及部分 E
规则,同时省略了与格式化程序(如 ruff format
或 Black)使用重叠的任何样式规则。
如果您刚开始使用 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 | pickle 、cPickle 、dill 和 shelve 模块可能不安全 |
🧪 |
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。noAuthNoPriv 和 authNoPriv 是不安全的。 |
|
S601 | paramiko-call | 通过 Paramiko 调用可能存在 shell 注入;请检查输入是否已正确净化 | |
S602 | subprocess-popen-with-shell-equals-true | 带有 shell=True 的 subprocess 调用似乎是安全的,但将来可能会改变;请考虑在没有 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_cache 或 functools.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 | 在生成器函数中使用 yield 和 return {value} 可能导致混淆行为 |
🧪 |
B903 | class-as-data-structure | 类可以是数据类或命名元组 | 🧪 |
B904 | raise-without-from-inside-except | 在 except* 子句中,请使用 raise ... from err 或 raise ... 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 |
🛠️ |
flake8-copyright (CPY)
欲了解更多信息,请参阅 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 | 不要将 exclude 与 ModelForm 一起使用,请改用 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 应包含 python 、pytest 或 uv 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.exception 且 exc_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 |
🛠️ |
|
T203 | p-print | 发现 pprint |
🛠️ |
flake8-pyi (PYI)
更多信息,请参阅 PyPI 上的 flake8-pyi。
代码 | 名称 | 消息 | |
---|---|---|---|
PYI001 | unprefixed-type-param | 私有 {kind} 的名称必须以 _ 开头 |
|
PYI002 | complex-if-statement-in-stub | if 测试必须是对 sys.platform 或 sys.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 -except 和 finally 中使用 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.suffix 、Path.stem 和 Path.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.glob 或 Path.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 | 手动列表复制 | 使用 list 或 list.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 | 类型比较 | 使用 is 和 is 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__ 的格式无效,必须是 tuple 或 list |
|
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 | 环境变量默认值类型无效;应为 str 或 None |
|
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 而不是将 stdout 和 stderr 发送到 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} 同时继承自 str 和 enum.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 | open 和 read 应替换为 Path({filename}).{suggestion} |
🧪 |
FURB103 | write-whole-file | open 和 write 应替换为 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 | 当 and 和 or 链式连接时,请给 a and b 表达式加上括号,以明确优先级 |
🛠️ |
RUF022 | unsorted-dunder-all | __all__ 未排序 |
🛠️ |
RUF023 | unsorted-dunder-slots | {}.__slots__ 未排序 |
🛠️ |
RUF024 | mutable-fromkeys-value | 不要将可变对象作为值传递给 dict.fromkeys |
🛠️ |
RUF026 | default-factory-kwarg | default_factory 是 defaultdict 的仅限位置参数 |
🛠️ |
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.starmap 在 zip 可迭代对象上调用 |
🛠️ |
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 调用中包含冗余的异常对象 |