Skip to content

Rules

Ruff supports over 800 lint rules, many of which are inspired by popular tools like Flake8, isort, pyupgrade, and others. Regardless of the rule's origin, Ruff re-implements every rule in Rust as a first-party feature.

By default, Ruff enables Flake8's F rules, along with a subset of the E rules, omitting any stylistic rules that overlap with the use of a formatter, like ruff format or Black.

If you're just getting started with Ruff, the default rule set is a great place to start: it catches a wide variety of common errors (like unused imports) with zero configuration.

Legend

    ๐Ÿงช     The rule is unstable and is in "preview".
    โš ๏ธ     The rule has been deprecated and will be removed in a future release.
    โŒ     The rule has been removed only the documentation is available.
    ๐Ÿ› ๏ธ     The rule is automatically fixable by the --fix command-line option.

All rules not marked as preview, deprecated or removed are stable.

Airflow (AIR)

For more, see Airflow on PyPI.

Code Name Message
AIR001 airflow-variable-name-task-id-mismatch Task variable name should match the task_id: "{task_id}"
AIR002 airflow-dag-no-schedule-argument DAG should have an explicit schedule argument
๐Ÿงช
AIR301 airflow3-removal {deprecated} is removed in Airflow 3.0
๐Ÿงช๐Ÿ› ๏ธ
AIR302 airflow3-moved-to-provider {deprecated} is removed in Airflow 3.0
๐Ÿงช๐Ÿ› ๏ธ
AIR311 airflow3-suggested-update {deprecated} is removed in Airflow 3.0; It still works in Airflow 3.0 but is expected to be removed in a future version.
๐Ÿงช๐Ÿ› ๏ธ
AIR312 airflow3-suggested-to-move-to-provider {deprecated} is removed in Airflow 3.0
๐Ÿงช๐Ÿ› ๏ธ

eradicate (ERA)

For more, see eradicate on PyPI.

Code Name Message
ERA001 commented-out-code Found commented-out code

FastAPI (FAST)

For more, see FastAPI on PyPI.

Code Name Message
FAST001 fast-api-redundant-response-model FastAPI route with redundant response_model argument
๐Ÿ› ๏ธ
FAST002 fast-api-non-annotated-dependency FastAPI dependency without Annotated
๐Ÿ› ๏ธ
FAST003 fast-api-unused-path-parameter Parameter {arg_name} appears in route path, but not in {function_name} signature
๐Ÿ› ๏ธ

flake8-2020 (YTT)

For more, see flake8-2020 on PyPI.

Code Name Message
YTT101 sys-version-slice3 sys.version[:3] referenced (python3.10), use sys.version_info
YTT102 sys-version2 sys.version[2] referenced (python3.10), use sys.version_info
YTT103 sys-version-cmp-str3 sys.version compared to string (python3.10), use sys.version_info
YTT201 sys-version-info0-eq3 sys.version_info[0] == 3 referenced (python4), use >=
YTT202 six-py3 six.PY3 referenced (python4), use not six.PY2
YTT203 sys-version-info1-cmp-int sys.version_info[1] compared to integer (python4), compare sys.version_info to tuple
YTT204 sys-version-info-minor-cmp-int sys.version_info.minor compared to integer (python4), compare sys.version_info to tuple
YTT301 sys-version0 sys.version[0] referenced (python10), use sys.version_info
YTT302 sys-version-cmp-str10 sys.version compared to string (python10), use sys.version_info
YTT303 sys-version-slice1 sys.version[:1] referenced (python10), use sys.version_info

flake8-annotations (ANN)

For more, see flake8-annotations on PyPI.

For related settings, see flake8-annotations.

Code Name Message
ANN001 missing-type-function-argument Missing type annotation for function argument {name}
ANN002 missing-type-args Missing type annotation for *{name}
ANN003 missing-type-kwargs Missing type annotation for **{name}
ANN101 missing-type-self Missing type annotation for {name} in method
โŒ
ANN102 missing-type-cls Missing type annotation for {name} in classmethod
โŒ
ANN201 missing-return-type-undocumented-public-function Missing return type annotation for public function {name}
๐Ÿ› ๏ธ
ANN202 missing-return-type-private-function Missing return type annotation for private function {name}
๐Ÿ› ๏ธ
ANN204 missing-return-type-special-method Missing return type annotation for special method {name}
๐Ÿ› ๏ธ
ANN205 missing-return-type-static-method Missing return type annotation for staticmethod {name}
๐Ÿ› ๏ธ
ANN206 missing-return-type-class-method Missing return type annotation for classmethod {name}
๐Ÿ› ๏ธ
ANN401 any-type Dynamically typed expressions (typing.Any) are disallowed in {name}

flake8-async (ASYNC)

For more, see flake8-async on PyPI.

Code Name Message
ASYNC100 cancel-scope-no-checkpoint A with {method_name}(...): context does not contain any await statements. This makes it pointless, as the timeout can only be triggered by a checkpoint.
ASYNC105 trio-sync-call Call to {method_name} is not immediately awaited
๐Ÿ› ๏ธ
ASYNC109 async-function-with-timeout Async function definition with a timeout parameter
ASYNC110 async-busy-wait Use {module}.Event instead of awaiting {module}.sleep in a while loop
ASYNC115 async-zero-sleep Use {module}.lowlevel.checkpoint() instead of {module}.sleep(0)
๐Ÿ› ๏ธ
ASYNC116 long-sleep-not-forever {module}.sleep() with >24 hour interval should usually be {module}.sleep_forever()
๐Ÿงช๐Ÿ› ๏ธ
ASYNC210 blocking-http-call-in-async-function Async functions should not call blocking HTTP methods
ASYNC220 create-subprocess-in-async-function Async functions should not create subprocesses with blocking methods
ASYNC221 run-process-in-async-function Async functions should not run processes with blocking methods
ASYNC222 wait-for-process-in-async-function Async functions should not wait on processes with blocking methods
ASYNC230 blocking-open-call-in-async-function Async functions should not open files with blocking methods like open
ASYNC251 blocking-sleep-in-async-function Async functions should not call time.sleep

flake8-bandit (S)

For more, see flake8-bandit on PyPI.

For related settings, see flake8-bandit.

Code Name Message
S101 assert Use of assert detected
S102 exec-builtin Use of exec detected
S103 bad-file-permissions os.chmod setting a permissive mask {mask:#o} on file or directory
S104 hardcoded-bind-all-interfaces Possible binding to all interfaces
S105 hardcoded-password-string Possible hardcoded password assigned to: "{}"
S106 hardcoded-password-func-arg Possible hardcoded password assigned to argument: "{}"
S107 hardcoded-password-default Possible hardcoded password assigned to function default: "{}"
S108 hardcoded-temp-file Probable insecure usage of temporary file or directory: "{}"
S110 try-except-pass try-except-pass detected, consider logging the exception
S112 try-except-continue try-except-continue detected, consider logging the exception
S113 request-without-timeout Probable use of {module} call without timeout
S201 flask-debug-true Use of debug=True in Flask app detected
S202 tarfile-unsafe-members Uses of tarfile.extractall()
S301 suspicious-pickle-usage pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue
S302 suspicious-marshal-usage Deserialization with the marshal module is possibly dangerous
S303 suspicious-insecure-hash-usage Use of insecure MD2, MD4, MD5, or SHA1 hash function
S304 suspicious-insecure-cipher-usage Use of insecure cipher, replace with a known secure cipher such as AES
S305 suspicious-insecure-cipher-mode-usage Use of insecure block cipher mode, replace with a known secure mode such as CBC or CTR
S306 suspicious-mktemp-usage Use of insecure and deprecated function (mktemp)
S307 suspicious-eval-usage Use of possibly insecure function; consider using ast.literal_eval
S308 suspicious-mark-safe-usage Use of mark_safe may expose cross-site scripting vulnerabilities
S310 suspicious-url-open-usage Audit URL open for permitted schemes. Allowing use of file: or custom schemes is often unexpected.
S311 suspicious-non-cryptographic-random-usage Standard pseudo-random generators are not suitable for cryptographic purposes
S312 suspicious-telnet-usage Telnet is considered insecure. Use SSH or some other encrypted protocol.
S313 suspicious-xmlc-element-tree-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S314 suspicious-xml-element-tree-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S315 suspicious-xml-expat-reader-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S316 suspicious-xml-expat-builder-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S317 suspicious-xml-sax-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S318 suspicious-xml-mini-dom-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S319 suspicious-xml-pull-dom-usage Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents
S320 suspicious-xmle-tree-usage Using lxml to parse untrusted data is known to be vulnerable to XML attacks
โš ๏ธ
S321 suspicious-ftp-lib-usage FTP-related functions are being called. FTP is considered insecure. Use SSH/SFTP/SCP or some other encrypted protocol.
S323 suspicious-unverified-context-usage Python allows using an insecure context via the _create_unverified_context that reverts to the previous behavior that does not validate certificates or perform hostname checks.
S324 hashlib-insecure-hash-function Probable use of insecure hash functions in {library}: {string}
S401 suspicious-telnetlib-import telnetlib and related modules are considered insecure. Use SSH or another encrypted protocol.
๐Ÿงช
S402 suspicious-ftplib-import ftplib and related modules are considered insecure. Use SSH, SFTP, SCP, or another encrypted protocol.
๐Ÿงช
S403 suspicious-pickle-import pickle, cPickle, dill, and shelve modules are possibly insecure
๐Ÿงช
S404 suspicious-subprocess-import subprocess module is possibly insecure
๐Ÿงช
S405 suspicious-xml-etree-import xml.etree methods are vulnerable to XML attacks
๐Ÿงช
S406 suspicious-xml-sax-import xml.sax methods are vulnerable to XML attacks
๐Ÿงช
S407 suspicious-xml-expat-import xml.dom.expatbuilder is vulnerable to XML attacks
๐Ÿงช
S408 suspicious-xml-minidom-import xml.dom.minidom is vulnerable to XML attacks
๐Ÿงช
S409 suspicious-xml-pulldom-import xml.dom.pulldom is vulnerable to XML attacks
๐Ÿงช
S410 suspicious-lxml-import lxml is vulnerable to XML attacks
โŒ
S411 suspicious-xmlrpc-import XMLRPC is vulnerable to remote XML attacks
๐Ÿงช
S412 suspicious-httpoxy-import httpoxy is a set of vulnerabilities that affect application code running inCGI, or CGI-like environments. The use of CGI for web applications should be avoided
๐Ÿงช
S413 suspicious-pycrypto-import pycrypto library is known to have publicly disclosed buffer overflow vulnerability
๐Ÿงช
S415 suspicious-pyghmi-import An IPMI-related module is being imported. Prefer an encrypted protocol over IPMI.
๐Ÿงช
S501 request-with-no-cert-validation Probable use of {string} call with verify=False disabling SSL certificate checks
S502 ssl-insecure-version Call made with insecure SSL protocol: {protocol}
S503 ssl-with-bad-defaults Argument default set to insecure SSL protocol: {protocol}
S504 ssl-with-no-version ssl.wrap_socket called without an `ssl_version``
S505 weak-cryptographic-key {cryptographic_key} key sizes below {minimum_key_size} bits are considered breakable
S506 unsafe-yaml-load Probable use of unsafe loader {name} with yaml.load. Allows instantiation of arbitrary objects. Consider yaml.safe_load.
S507 ssh-no-host-key-verification Paramiko call with policy set to automatically trust the unknown host key
S508 snmp-insecure-version The use of SNMPv1 and SNMPv2 is insecure. Use SNMPv3 if able.
S509 snmp-weak-cryptography You should not use SNMPv3 without encryption. noAuthNoPriv & authNoPriv is insecure.
S601 paramiko-call Possible shell injection via Paramiko call; check inputs are properly sanitized
S602 subprocess-popen-with-shell-equals-true subprocess call with shell=True seems safe, but may be changed in the future; consider rewriting without shell
S603 subprocess-without-shell-equals-true subprocess call: check for execution of untrusted input
S604 call-with-shell-equals-true Function call with shell=True parameter identified, security issue
S605 start-process-with-a-shell Starting a process with a shell: seems safe, but may be changed in the future; consider rewriting without shell
S606 start-process-with-no-shell Starting a process without a shell
S607 start-process-with-partial-path Starting a process with a partial executable path
S608 hardcoded-sql-expression Possible SQL injection vector through string-based query construction
S609 unix-command-wildcard-injection Possible wildcard injection in call due to * usage
S610 django-extra Use of Django extra can lead to SQL injection vulnerabilities
S611 django-raw-sql Use of RawSQL can lead to SQL injection vulnerabilities
S612 logging-config-insecure-listen Use of insecure logging.config.listen detected
S701 jinja2-autoescape-false Using jinja2 templates with autoescape=False is dangerous and can lead to XSS. Ensure autoescape=True or use the select_autoescape function.
S702 mako-templates Mako templates allow HTML and JavaScript rendering by default and are inherently open to XSS attacks
S704 unsafe-markup-use Unsafe use of {name} detected

flake8-blind-except (BLE)

For more, see flake8-blind-except on PyPI.

Code Name Message
BLE001 blind-except Do not catch blind exception: {name}

flake8-boolean-trap (FBT)

For more, see flake8-boolean-trap on PyPI.

For related settings, see flake8-boolean-trap.

Code Name Message
FBT001 boolean-type-hint-positional-argument Boolean-typed positional argument in function definition
FBT002 boolean-default-value-positional-argument Boolean default positional argument in function definition
FBT003 boolean-positional-value-in-call Boolean positional value in function call

flake8-bugbear (B)

For more, see flake8-bugbear on PyPI.

For related settings, see flake8-bugbear.

Code Name Message
B002 unary-prefix-increment-decrement Python does not support the unary prefix increment operator (++)
B003 assignment-to-os-environ Assigning to os.environ doesn't clear the environment
B004 unreliable-callable-check Using hasattr(x, "__call__") to test if x is callable is unreliable. Use callable(x) for consistent results.
๐Ÿ› ๏ธ
B005 strip-with-multi-characters Using .strip() with multi-character strings is misleading
B006 mutable-argument-default Do not use mutable data structures for argument defaults
๐Ÿ› ๏ธ
B007 unused-loop-control-variable Loop control variable {name} not used within loop body
๐Ÿ› ๏ธ
B008 function-call-in-default-argument Do not perform function call {name} in argument defaults; instead, perform the call within the function, or read the default from a module-level singleton variable
B009 get-attr-with-constant Do not call getattr with a constant attribute value. It is not any safer than normal property access.
๐Ÿ› ๏ธ
B010 set-attr-with-constant Do not call setattr with a constant attribute value. It is not any safer than normal property access.
๐Ÿ› ๏ธ
B011 assert-false Do not assert False (python -O removes these calls), raise AssertionError()
๐Ÿ› ๏ธ
B012 jump-statement-in-finally {name} inside finally blocks cause exceptions to be silenced
B013 redundant-tuple-in-exception-handler A length-one tuple literal is redundant in exception handlers
๐Ÿ› ๏ธ
B014 duplicate-handler-exception Exception handler with duplicate exception: {name}
๐Ÿ› ๏ธ
B015 useless-comparison Pointless comparison. Did you mean to assign a value? Otherwise, prepend assert or remove it.
B016 raise-literal Cannot raise a literal. Did you intend to return it or raise an Exception?
B017 assert-raises-exception Do not assert blind exception: {exception}
B018 useless-expression Found useless expression. Either assign it to a variable or remove it.
B019 cached-instance-method Use of functools.lru_cache or functools.cache on methods can lead to memory leaks
B020 loop-variable-overrides-iterator Loop control variable {name} overrides iterable it iterates
B021 f-string-docstring f-string used as docstring. Python will interpret this as a joined string, rather than a docstring.
B022 useless-contextlib-suppress No arguments passed to contextlib.suppress. No exceptions will be suppressed and therefore this context manager is redundant
B023 function-uses-loop-variable Function definition does not bind loop variable {name}
B024 abstract-base-class-without-abstract-method {name} is an abstract base class, but it has no abstract methods or properties
B025 duplicate-try-block-exception try-except* block with duplicate exception {name}
B026 star-arg-unpacking-after-keyword-arg Star-arg unpacking after a keyword argument is strongly discouraged
B027 empty-method-without-abstract-decorator {name} is an empty method in an abstract base class, but has no abstract decorator
B028 no-explicit-stacklevel No explicit stacklevel keyword argument found
๐Ÿ› ๏ธ
B029 except-with-empty-tuple Using except* (): with an empty tuple does not catch anything; add exceptions to handle
B030 except-with-non-exception-classes except* handlers should only be exception classes or tuples of exception classes
B031 reuse-of-groupby-generator Using the generator returned from itertools.groupby() more than once will do nothing on the second usage
B032 unintentional-type-annotation Possible unintentional type annotation (using :). Did you mean to assign (using =)?
B033 duplicate-value Sets should not contain duplicate item {value}
๐Ÿ› ๏ธ
B034 re-sub-positional-args {method} should pass {param_name} and flags as keyword arguments to avoid confusion due to unintuitive argument positions
B035 static-key-dict-comprehension Dictionary comprehension uses static key: {key}
B039 mutable-contextvar-default Do not use mutable data structures for ContextVar defaults
B901 return-in-generator Using yield and return {value} in a generator function can lead to confusing behavior
๐Ÿงช
B903 class-as-data-structure Class could be dataclass or namedtuple
๐Ÿงช
B904 raise-without-from-inside-except Within an except* clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
B905 zip-without-explicit-strict zip() without an explicit strict= parameter
๐Ÿ› ๏ธ
B909 loop-iterator-mutation Mutation to loop iterable {name} during iteration
๐Ÿงช
B911 batched-without-explicit-strict itertools.batched() without an explicit strict parameter

flake8-builtins (A)

For more, see flake8-builtins on PyPI.

For related settings, see flake8-builtins.

Code Name Message
A001 builtin-variable-shadowing Variable {name} is shadowing a Python builtin
A002 builtin-argument-shadowing Function argument {name} is shadowing a Python builtin
A003 builtin-attribute-shadowing Python builtin is shadowed by class attribute {name} from {row}
A004 builtin-import-shadowing Import {name} is shadowing a Python builtin
A005 stdlib-module-shadowing Module {name} shadows a Python standard-library module
A006 builtin-lambda-argument-shadowing Lambda argument {name} is shadowing a Python builtin

flake8-commas (COM)

For more, see flake8-commas on PyPI.

Code Name Message
COM812 missing-trailing-comma Trailing comma missing
๐Ÿ› ๏ธ
COM818 trailing-comma-on-bare-tuple Trailing comma on bare tuple prohibited
COM819 prohibited-trailing-comma Trailing comma prohibited
๐Ÿ› ๏ธ

flake8-comprehensions (C4)

For more, see flake8-comprehensions on PyPI.

For related settings, see flake8-comprehensions.

Code Name Message
C400 unnecessary-generator-list Unnecessary generator (rewrite using list())
๐Ÿ› ๏ธ
C401 unnecessary-generator-set Unnecessary generator (rewrite using set())
๐Ÿ› ๏ธ
C402 unnecessary-generator-dict Unnecessary generator (rewrite as a dict comprehension)
๐Ÿ› ๏ธ
C403 unnecessary-list-comprehension-set Unnecessary list comprehension (rewrite as a set comprehension)
๐Ÿ› ๏ธ
C404 unnecessary-list-comprehension-dict Unnecessary list comprehension (rewrite as a dict comprehension)
๐Ÿ› ๏ธ
C405 unnecessary-literal-set Unnecessary {kind} literal (rewrite as a set literal)
๐Ÿ› ๏ธ
C406 unnecessary-literal-dict Unnecessary {obj_type} literal (rewrite as a dict literal)
๐Ÿ› ๏ธ
C408 unnecessary-collection-call Unnecessary {kind}() call (rewrite as a literal)
๐Ÿ› ๏ธ
C409 unnecessary-literal-within-tuple-call Unnecessary list literal passed to tuple() (rewrite as a tuple literal)
๐Ÿ› ๏ธ
C410 unnecessary-literal-within-list-call Unnecessary list literal passed to list() (remove the outer call to list())
๐Ÿ› ๏ธ
C411 unnecessary-list-call Unnecessary list() call (remove the outer call to list())
๐Ÿ› ๏ธ
C413 unnecessary-call-around-sorted Unnecessary {func}() call around sorted()
๐Ÿ› ๏ธ
C414 unnecessary-double-cast-or-process Unnecessary {inner}() call within {outer}()
๐Ÿ› ๏ธ
C415 unnecessary-subscript-reversal Unnecessary subscript reversal of iterable within {func}()
C416 unnecessary-comprehension Unnecessary {kind} comprehension (rewrite using {kind}())
๐Ÿ› ๏ธ
C417 unnecessary-map Unnecessary map() usage (rewrite using a {object_type})
๐Ÿ› ๏ธ
C418 unnecessary-literal-within-dict-call Unnecessary dict {kind} passed to dict() (remove the outer call to dict())
๐Ÿ› ๏ธ
C419 unnecessary-comprehension-in-call Unnecessary list comprehension
๐Ÿ› ๏ธ
C420 unnecessary-dict-comprehension-for-iterable Unnecessary dict comprehension for iterable; use dict.fromkeys instead
๐Ÿ› ๏ธ

For more, see flake8-copyright on PyPI.

For related settings, see flake8-copyright.

Code Name Message
CPY001 missing-copyright-notice Missing copyright notice at top of file
๐Ÿงช

flake8-datetimez (DTZ)

For more, see flake8-datetimez on PyPI.

Code Name Message
DTZ001 call-datetime-without-tzinfo datetime.datetime() called without a tzinfo argument
DTZ002 call-datetime-today datetime.datetime.today() used
DTZ003 call-datetime-utcnow datetime.datetime.utcnow() used
DTZ004 call-datetime-utcfromtimestamp datetime.datetime.utcfromtimestamp() used
DTZ005 call-datetime-now-without-tzinfo datetime.datetime.now() called without a tz argument
DTZ006 call-datetime-fromtimestamp datetime.datetime.fromtimestamp() called without a tz argument
DTZ007 call-datetime-strptime-without-zone Naive datetime constructed using datetime.datetime.strptime() without %z
DTZ011 call-date-today datetime.date.today() used
DTZ012 call-date-fromtimestamp datetime.date.fromtimestamp() used
DTZ901 datetime-min-max Use of datetime.datetime.{min_max} without timezone information

flake8-debugger (T10)

For more, see flake8-debugger on PyPI.

Code Name Message
T100 debugger Trace found: {name} used

flake8-django (DJ)

For more, see flake8-django on PyPI.

Code Name Message
DJ001 django-nullable-model-string-field Avoid using null=True on string-based fields such as {field_name}
DJ003 django-locals-in-render-function Avoid passing locals() as context to a render function
DJ006 django-exclude-with-model-form Do not use exclude with ModelForm, use fields instead
DJ007 django-all-with-model-form Do not use __all__ with ModelForm, use fields instead
DJ008 django-model-without-dunder-str Model does not define __str__ method
DJ012 django-unordered-body-content-in-model Order of model's inner classes, methods, and fields does not follow the Django Style Guide: {element_type} should come before {prev_element_type}
DJ013 django-non-leading-receiver-decorator @receiver decorator must be on top of all the other decorators

flake8-errmsg (EM)

For more, see flake8-errmsg on PyPI.

For related settings, see flake8-errmsg.

Code Name Message
EM101 raw-string-in-exception Exception must not use a string literal, assign to variable first
๐Ÿ› ๏ธ
EM102 f-string-in-exception Exception must not use an f-string literal, assign to variable first
๐Ÿ› ๏ธ
EM103 dot-format-in-exception Exception must not use a .format() string directly, assign to variable first
๐Ÿ› ๏ธ

flake8-executable (EXE)

For more, see flake8-executable on PyPI.

Code Name Message
EXE001 shebang-not-executable Shebang is present but file is not executable
EXE002 shebang-missing-executable-file The file is executable but no shebang is present
EXE003 shebang-missing-python Shebang should contain python, pytest, or uv run
EXE004 shebang-leading-whitespace Avoid whitespace before shebang
๐Ÿ› ๏ธ
EXE005 shebang-not-first-line Shebang should be at the beginning of the file

flake8-fixme (FIX)

For more, see flake8-fixme on GitHub.

Code Name Message
FIX001 line-contains-fixme Line contains FIXME, consider resolving the issue
FIX002 line-contains-todo Line contains TODO, consider resolving the issue
FIX003 line-contains-xxx Line contains XXX, consider resolving the issue
FIX004 line-contains-hack Line contains HACK, consider resolving the issue

flake8-future-annotations (FA)

For more, see flake8-future-annotations on PyPI.

Code Name Message
FA100 future-rewritable-type-annotation Add from __future__ import annotations to simplify {name}
FA102 future-required-type-annotation Missing from __future__ import annotations, but uses {reason}
๐Ÿ› ๏ธ

flake8-gettext (INT)

For more, see flake8-gettext on PyPI.

For related settings, see flake8-gettext.

Code Name Message
INT001 f-string-in-get-text-func-call f-string is resolved before function call; consider _("string %s") % arg
INT002 format-in-get-text-func-call format method argument is resolved before function call; consider _("string %s") % arg
INT003 printf-in-get-text-func-call printf-style format is resolved before function call; consider _("string %s") % arg

flake8-implicit-str-concat (ISC)

For more, see flake8-implicit-str-concat on PyPI.

For related settings, see flake8-implicit-str-concat.

Code Name Message
ISC001 single-line-implicit-string-concatenation Implicitly concatenated string literals on one line
๐Ÿ› ๏ธ
ISC002 multi-line-implicit-string-concatenation Implicitly concatenated string literals over multiple lines
ISC003 explicit-string-concatenation Explicitly concatenated string should be implicitly concatenated
๐Ÿ› ๏ธ

flake8-import-conventions (ICN)

For more, see flake8-import-conventions on GitHub.

For related settings, see flake8-import-conventions.

Code Name Message
ICN001 unconventional-import-alias {name} should be imported as {asname}
๐Ÿ› ๏ธ
ICN002 banned-import-alias {name} should not be imported as {asname}
ICN003 banned-import-from Members of {name} should not be imported explicitly

flake8-logging (LOG)

For more, see flake8-logging on PyPI.

Code Name Message
LOG001 direct-logger-instantiation Use logging.getLogger() to instantiate loggers
๐Ÿ› ๏ธ
LOG002 invalid-get-logger-argument Use __name__ with logging.getLogger()
๐Ÿ› ๏ธ
LOG004 log-exception-outside-except-handler .exception() call outside exception handlers
๐Ÿงช๐Ÿ› ๏ธ
LOG007 exception-without-exc-info Use of logging.exception with falsy exc_info
LOG009 undocumented-warn Use of undocumented logging.WARN constant
๐Ÿ› ๏ธ
LOG014 exc-info-outside-except-handler exc_info= outside exception handlers
๐Ÿงช๐Ÿ› ๏ธ
LOG015 root-logger-call {}() call on root logger

flake8-logging-format (G)

For more, see flake8-logging-format on PyPI.

Code Name Message
G001 logging-string-format Logging statement uses str.format
G002 logging-percent-format Logging statement uses %
G003 logging-string-concat Logging statement uses +
G004 logging-f-string Logging statement uses f-string
G010 logging-warn Logging statement uses warn instead of warning
๐Ÿ› ๏ธ
G101 logging-extra-attr-clash Logging statement uses an extra field that clashes with a LogRecord field: {key}
G201 logging-exc-info Logging .exception(...) should be used instead of .error(..., exc_info=True)
G202 logging-redundant-exc-info Logging statement has redundant exc_info

flake8-no-pep420 (INP)

For more, see flake8-no-pep420 on PyPI.

Code Name Message
INP001 implicit-namespace-package File {filename} is part of an implicit namespace package. Add an __init__.py.

flake8-pie (PIE)

For more, see flake8-pie on PyPI.

Code Name Message
PIE790 unnecessary-placeholder Unnecessary pass statement
๐Ÿ› ๏ธ
PIE794 duplicate-class-field-definition Class field {name} is defined multiple times
๐Ÿ› ๏ธ
PIE796 non-unique-enums Enum contains duplicate value: {value}
PIE800 unnecessary-spread Unnecessary spread **
๐Ÿ› ๏ธ
PIE804 unnecessary-dict-kwargs Unnecessary dict kwargs
๐Ÿ› ๏ธ
PIE807 reimplemented-container-builtin Prefer {container} over useless lambda
๐Ÿ› ๏ธ
PIE808 unnecessary-range-start Unnecessary start argument in range
๐Ÿ› ๏ธ
PIE810 multiple-starts-ends-with Call {attr} once with a tuple
๐Ÿ› ๏ธ

flake8-print (T20)

For more, see flake8-print on PyPI.

Code Name Message
T201 print print found
๐Ÿ› ๏ธ
T203 p-print pprint found
๐Ÿ› ๏ธ

flake8-pyi (PYI)

For more, see flake8-pyi on PyPI.

Code Name Message
PYI001 unprefixed-type-param Name of private {kind} must start with _
PYI002 complex-if-statement-in-stub if test must be a simple comparison against sys.platform or sys.version_info
PYI003 unrecognized-version-info-check Unrecognized sys.version_info check
PYI004 patch-version-comparison Version comparison must use only major and minor version
PYI005 wrong-tuple-length-version-comparison Version comparison must be against a length-{expected_length} tuple
PYI006 bad-version-info-comparison Use < or >= for sys.version_info comparisons
PYI007 unrecognized-platform-check Unrecognized sys.platform check
PYI008 unrecognized-platform-name Unrecognized platform {platform}
PYI009 pass-statement-stub-body Empty body should contain ..., not pass
๐Ÿ› ๏ธ
PYI010 non-empty-stub-body Function body must contain only ...
๐Ÿ› ๏ธ
PYI011 typed-argument-default-in-stub Only simple default values allowed for typed arguments
๐Ÿ› ๏ธ
PYI012 pass-in-class-body Class body must not contain pass
๐Ÿ› ๏ธ
PYI013 ellipsis-in-non-empty-class-body Non-empty class body must not contain ...
๐Ÿ› ๏ธ
PYI014 argument-default-in-stub Only simple default values allowed for arguments
๐Ÿ› ๏ธ
PYI015 assignment-default-in-stub Only simple default values allowed for assignments
๐Ÿ› ๏ธ
PYI016 duplicate-union-member Duplicate union member {}
๐Ÿ› ๏ธ
PYI017 complex-assignment-in-stub Stubs should not contain assignments to attributes or multiple targets
PYI018 unused-private-type-var Private {type_var_like_kind} {type_var_like_name} is never used
๐Ÿ› ๏ธ
PYI019 custom-type-var-for-self Use Self instead of custom TypeVar {}
๐Ÿ› ๏ธ
PYI020 quoted-annotation-in-stub Quoted annotations should not be included in stubs
๐Ÿ› ๏ธ
PYI021 docstring-in-stub Docstrings should not be included in stubs
๐Ÿ› ๏ธ
PYI024 collections-named-tuple Use typing.NamedTuple instead of collections.namedtuple
PYI025 unaliased-collections-abc-set-import Use from collections.abc import Set as AbstractSet to avoid confusion with the set builtin
๐Ÿ› ๏ธ
PYI026 type-alias-without-annotation Use {module}.TypeAlias for type alias, e.g., {name}: TypeAlias = {value}
๐Ÿ› ๏ธ
PYI029 str-or-repr-defined-in-stub Defining {name} in a stub is almost always redundant
๐Ÿ› ๏ธ
PYI030 unnecessary-literal-union Multiple literal members in a union. Use a single literal, e.g. Literal[{}]
๐Ÿ› ๏ธ
PYI032 any-eq-ne-annotation Prefer object to Any for the second parameter to {method_name}
๐Ÿ› ๏ธ
PYI033 type-comment-in-stub Don't use type comments in stub file
PYI034 non-self-return-type __new__ methods usually return self at runtime
๐Ÿ› ๏ธ
PYI035 unassigned-special-variable-in-stub {name} in a stub file must have a value, as it has the same semantics as {name} at runtime
PYI036 bad-exit-annotation Star-args in {method_name} should be annotated with object
๐Ÿ› ๏ธ
PYI041 redundant-numeric-union Use {supertype} instead of {subtype} | {supertype}
๐Ÿ› ๏ธ
PYI042 snake-case-type-alias Type alias {name} should be CamelCase
PYI043 t-suffixed-type-alias Private type alias {name} should not be suffixed with T (the T suffix implies that an object is a TypeVar)
PYI044 future-annotations-in-stub from __future__ import annotations has no effect in stub files, since type checkers automatically treat stubs as having those semantics
๐Ÿ› ๏ธ
PYI045 iter-method-return-iterable __aiter__ methods should return an AsyncIterator, not an AsyncIterable
PYI046 unused-private-protocol Private protocol {name} is never used
PYI047 unused-private-type-alias Private TypeAlias {name} is never used
PYI048 stub-body-multiple-statements Function body must contain exactly one statement
PYI049 unused-private-typed-dict Private TypedDict {name} is never used
PYI050 no-return-argument-annotation-in-stub Prefer {module}.Never over NoReturn for argument annotations
PYI051 redundant-literal-union Literal[{literal}] is redundant in a union with {builtin_type}
PYI052 unannotated-assignment-in-stub Need type annotation for {name}
PYI053 string-or-bytes-too-long String and bytes literals longer than 50 characters are not permitted
๐Ÿ› ๏ธ
PYI054 numeric-literal-too-long Numeric literals with a string representation longer than ten characters are not permitted
๐Ÿ› ๏ธ
PYI055 unnecessary-type-union Multiple type members in a union. Combine them into one, e.g., type[{union_str}].
๐Ÿ› ๏ธ
PYI056 unsupported-method-call-on-all Calling .{name}() on __all__ may not be supported by all type checkers (use += instead)
PYI057 byte-string-usage Do not use {origin}.ByteString, which has unclear semantics and is deprecated
PYI058 generator-return-from-iter-method Use {return_type} as the return value for simple {method} methods
๐Ÿ› ๏ธ
PYI059 generic-not-last-base-class Generic[] should always be the last base class
๐Ÿงช๐Ÿ› ๏ธ
PYI061 redundant-none-literal Use None rather than Literal[None]
๐Ÿงช๐Ÿ› ๏ธ
PYI062 duplicate-literal-member Duplicate literal member {}
๐Ÿ› ๏ธ
PYI063 pep484-style-positional-only-parameter Use PEP 570 syntax for positional-only parameters
PYI064 redundant-final-literal Final[Literal[{literal}]] can be replaced with a bare Final
๐Ÿ› ๏ธ
PYI066 bad-version-info-order Put branches for newer Python versions first when branching on sys.version_info comparisons

flake8-pytest-style (PT)

For more, see flake8-pytest-style on PyPI.

For related settings, see flake8-pytest-style.

Code Name Message
PT001 pytest-fixture-incorrect-parentheses-style Use @pytest.fixture{expected} over @pytest.fixture{actual}
๐Ÿ› ๏ธ
PT002 pytest-fixture-positional-args Configuration for fixture {function} specified via positional args, use kwargs
PT003 pytest-extraneous-scope-function scope='function' is implied in @pytest.fixture()
๐Ÿ› ๏ธ
PT004 pytest-missing-fixture-name-underscore Fixture {function} does not return anything, add leading underscore
โŒ
PT005 pytest-incorrect-fixture-name-underscore Fixture {function} returns a value, remove leading underscore
โŒ
PT006 pytest-parametrize-names-wrong-type Wrong type passed to first argument of pytest.mark.parametrize; expected {expected_string}
๐Ÿ› ๏ธ
PT007 pytest-parametrize-values-wrong-type Wrong values type in pytest.mark.parametrize expected {values} of {row}
๐Ÿ› ๏ธ
PT008 pytest-patch-with-lambda Use return_value= instead of patching with lambda
PT009 pytest-unittest-assertion Use a regular assert instead of unittest-style {assertion}
๐Ÿ› ๏ธ
PT010 pytest-raises-without-exception Set the expected exception in pytest.raises()
PT011 pytest-raises-too-broad pytest.raises({exception}) is too broad, set the match parameter or use a more specific exception
PT012 pytest-raises-with-multiple-statements pytest.raises() block should contain a single simple statement
PT013 pytest-incorrect-pytest-import Incorrect import of pytest; use import pytest instead
PT014 pytest-duplicate-parametrize-test-cases Duplicate of test case at index {index} in pytest.mark.parametrize
๐Ÿ› ๏ธ
PT015 pytest-assert-always-false Assertion always fails, replace with pytest.fail()
PT016 pytest-fail-without-message No message passed to pytest.fail()
PT017 pytest-assert-in-except Found assertion on exception {name} in except block, use pytest.raises() instead
PT018 pytest-composite-assertion Assertion should be broken down into multiple parts
๐Ÿ› ๏ธ
PT019 pytest-fixture-param-without-value Fixture {name} without value is injected as parameter, use @pytest.mark.usefixtures instead
PT020 pytest-deprecated-yield-fixture @pytest.yield_fixture is deprecated, use @pytest.fixture
PT021 pytest-fixture-finalizer-callback Use yield instead of request.addfinalizer
PT022 pytest-useless-yield-fixture No teardown in fixture {name}, use return instead of yield
๐Ÿ› ๏ธ
PT023 pytest-incorrect-mark-parentheses-style Use @pytest.mark.{mark_name}{expected_parens} over @pytest.mark.{mark_name}{actual_parens}
๐Ÿ› ๏ธ
PT024 pytest-unnecessary-asyncio-mark-on-fixture pytest.mark.asyncio is unnecessary for fixtures
๐Ÿ› ๏ธ
PT025 pytest-erroneous-use-fixtures-on-fixture pytest.mark.usefixtures has no effect on fixtures
๐Ÿ› ๏ธ
PT026 pytest-use-fixtures-without-parameters Useless pytest.mark.usefixtures without parameters
๐Ÿ› ๏ธ
PT027 pytest-unittest-raises-assertion Use pytest.raises instead of unittest-style {assertion}
๐Ÿ› ๏ธ
PT028 pytest-parameter-with-default-argument Test function parameter {} has default argument
๐Ÿงช
PT029 pytest-warns-without-warning Set the expected warning in pytest.warns()
๐Ÿงช
PT030 pytest-warns-too-broad pytest.warns({warning}) is too broad, set the match parameter or use a more specific warning
๐Ÿงช
PT031 pytest-warns-with-multiple-statements pytest.warns() block should contain a single simple statement
๐Ÿงช

flake8-quotes (Q)

For more, see flake8-quotes on PyPI.

For related settings, see flake8-quotes.

Code Name Message
Q000 bad-quotes-inline-string Single quotes found but double quotes preferred
๐Ÿ› ๏ธ
Q001 bad-quotes-multiline-string Single quote multiline found but double quotes preferred
๐Ÿ› ๏ธ
Q002 bad-quotes-docstring Single quote docstring found but double quotes preferred
๐Ÿ› ๏ธ
Q003 avoidable-escaped-quote Change outer quotes to avoid escaping inner quotes
๐Ÿ› ๏ธ
Q004 unnecessary-escaped-quote Unnecessary escape on inner quote character
๐Ÿ› ๏ธ

flake8-raise (RSE)

For more, see flake8-raise on PyPI.

Code Name Message
RSE102 unnecessary-paren-on-raise-exception Unnecessary parentheses on raised exception
๐Ÿ› ๏ธ

flake8-return (RET)

For more, see flake8-return on PyPI.

Code Name Message
RET501 unnecessary-return-none Do not explicitly return None in function if it is the only possible return value
๐Ÿ› ๏ธ
RET502 implicit-return-value Do not implicitly return None in function able to return non-None value
๐Ÿ› ๏ธ
RET503 implicit-return Missing explicit return at the end of function able to return non-None value
๐Ÿ› ๏ธ
RET504 unnecessary-assign Unnecessary assignment to {name} before return statement
๐Ÿ› ๏ธ
RET505 superfluous-else-return Unnecessary {branch} after return statement
๐Ÿ› ๏ธ
RET506 superfluous-else-raise Unnecessary {branch} after raise statement
๐Ÿ› ๏ธ
RET507 superfluous-else-continue Unnecessary {branch} after continue statement
๐Ÿ› ๏ธ
RET508 superfluous-else-break Unnecessary {branch} after break statement
๐Ÿ› ๏ธ

flake8-self (SLF)

For more, see flake8-self on PyPI.

For related settings, see flake8-self.

Code Name Message
SLF001 private-member-access Private member accessed: {access}

flake8-simplify (SIM)

For more, see flake8-simplify on PyPI.

Code Name Message
SIM101 duplicate-isinstance-call Multiple isinstance calls for {name}, merge into a single call
๐Ÿ› ๏ธ
SIM102 collapsible-if Use a single if statement instead of nested if statements
๐Ÿ› ๏ธ
SIM103 needless-bool Return the condition {condition} directly
๐Ÿ› ๏ธ
SIM105 suppressible-exception Use contextlib.suppress({exception}) instead of try-except-pass
๐Ÿ› ๏ธ
SIM107 return-in-try-except-finally Don't use return in try-except and finally
SIM108 if-else-block-instead-of-if-exp Use ternary operator {contents} instead of if-else-block
๐Ÿ› ๏ธ
SIM109 compare-with-tuple Use {replacement} instead of multiple equality comparisons
๐Ÿ› ๏ธ
SIM110 reimplemented-builtin Use {replacement} instead of for loop
๐Ÿ› ๏ธ
SIM112 uncapitalized-environment-variables Use capitalized environment variable {expected} instead of {actual}
๐Ÿ› ๏ธ
SIM113 enumerate-for-loop Use enumerate() for index variable {index} in for loop
SIM114 if-with-same-arms Combine if branches using logical or operator
๐Ÿ› ๏ธ
SIM115 open-file-with-context-handler Use a context manager for opening files
SIM116 if-else-block-instead-of-dict-lookup Use a dictionary instead of consecutive if statements
SIM117 multiple-with-statements Use a single with statement with multiple contexts instead of nested with statements
๐Ÿ› ๏ธ
SIM118 in-dict-keys Use key {operator} dict instead of key {operator} dict.keys()
๐Ÿ› ๏ธ
SIM201 negate-equal-op Use {left} != {right} instead of not {left} == {right}
๐Ÿ› ๏ธ
SIM202 negate-not-equal-op Use {left} == {right} instead of not {left} != {right}
๐Ÿ› ๏ธ
SIM208 double-negation Use {expr} instead of not (not {expr})
๐Ÿ› ๏ธ
SIM210 if-expr-with-true-false Remove unnecessary True if ... else False
๐Ÿ› ๏ธ
SIM211 if-expr-with-false-true Use not ... instead of False if ... else True
๐Ÿ› ๏ธ
SIM212 if-expr-with-twisted-arms Use {expr_else} if {expr_else} else {expr_body} instead of {expr_body} if not {expr_else} else {expr_else}
๐Ÿ› ๏ธ
SIM220 expr-and-not-expr Use False instead of {name} and not {name}
๐Ÿ› ๏ธ
SIM221 expr-or-not-expr Use True instead of {name} or not {name}
๐Ÿ› ๏ธ
SIM222 expr-or-true Use {expr} instead of {replaced}
๐Ÿ› ๏ธ
SIM223 expr-and-false Use {expr} instead of {replaced}
๐Ÿ› ๏ธ
SIM300 yoda-conditions Yoda condition detected
๐Ÿ› ๏ธ
SIM401 if-else-block-instead-of-dict-get Use {contents} instead of an if block
๐Ÿ› ๏ธ
SIM905 split-static-string Consider using a list literal instead of str.split
๐Ÿ› ๏ธ
SIM910 dict-get-with-none-default Use {expected} instead of {actual}
๐Ÿ› ๏ธ
SIM911 zip-dict-keys-and-values Use {expected} instead of {actual}
๐Ÿ› ๏ธ

flake8-slots (SLOT)

For more, see flake8-slots on PyPI.

Code Name Message
SLOT000 no-slots-in-str-subclass Subclasses of str should define __slots__
SLOT001 no-slots-in-tuple-subclass Subclasses of tuple should define __slots__
SLOT002 no-slots-in-namedtuple-subclass Subclasses of {namedtuple_kind} should define __slots__

flake8-tidy-imports (TID)

For more, see flake8-tidy-imports on PyPI.

For related settings, see flake8-tidy-imports.

Code Name Message
TID251 banned-api {name} is banned: {message}
TID252 relative-imports Prefer absolute imports over relative imports from parent modules
๐Ÿ› ๏ธ
TID253 banned-module-level-imports {name} is banned at the module level

flake8-todos (TD)

For more, see flake8-todos on GitHub.

Code Name Message
TD001 invalid-todo-tag Invalid TODO tag: {tag}
TD002 missing-todo-author Missing author in TODO; try: # TODO(<author_name>): ... or # TODO @<author_name>: ...
TD003 missing-todo-link Missing issue link for this TODO
TD004 missing-todo-colon Missing colon in TODO
TD005 missing-todo-description Missing issue description after TODO
TD006 invalid-todo-capitalization Invalid TODO capitalization: {tag} should be TODO
๐Ÿ› ๏ธ
TD007 missing-space-after-todo-colon Missing space after colon in TODO

flake8-type-checking (TC)

For more, see flake8-type-checking on PyPI.

For related settings, see flake8-type-checking.

Code Name Message
TC001 typing-only-first-party-import Move application import {} into a type-checking block
๐Ÿ› ๏ธ
TC002 typing-only-third-party-import Move third-party import {} into a type-checking block
๐Ÿ› ๏ธ
TC003 typing-only-standard-library-import Move standard library import {} into a type-checking block
๐Ÿ› ๏ธ
TC004 runtime-import-in-type-checking-block Move import {qualified_name} out of type-checking block. Import is used for more than type hinting.
๐Ÿ› ๏ธ
TC005 empty-type-checking-block Found empty type-checking block
๐Ÿ› ๏ธ
TC006 runtime-cast-value Add quotes to type expression in typing.cast()
๐Ÿ› ๏ธ
TC007 unquoted-type-alias Add quotes to type alias
๐Ÿ› ๏ธ
TC008 quoted-type-alias Remove quotes from type alias
๐Ÿงช๐Ÿ› ๏ธ
TC010 runtime-string-union Invalid string member in X | Y-style union type

flake8-unused-arguments (ARG)

For more, see flake8-unused-arguments on PyPI.

For related settings, see flake8-unused-arguments.

Code Name Message
ARG001 unused-function-argument Unused function argument: {name}
ARG002 unused-method-argument Unused method argument: {name}
ARG003 unused-class-method-argument Unused class method argument: {name}
ARG004 unused-static-method-argument Unused static method argument: {name}
ARG005 unused-lambda-argument Unused lambda argument: {name}

flake8-use-pathlib (PTH)

For more, see flake8-use-pathlib on PyPI.

Code Name Message
PTH100 os-path-abspath os.path.abspath() should be replaced by Path.resolve()
PTH101 os-chmod os.chmod() should be replaced by Path.chmod()
PTH102 os-mkdir os.mkdir() should be replaced by Path.mkdir()
PTH103 os-makedirs os.makedirs() should be replaced by Path.mkdir(parents=True)
PTH104 os-rename os.rename() should be replaced by Path.rename()
PTH105 os-replace os.replace() should be replaced by Path.replace()
PTH106 os-rmdir os.rmdir() should be replaced by Path.rmdir()
PTH107 os-remove os.remove() should be replaced by Path.unlink()
PTH108 os-unlink os.unlink() should be replaced by Path.unlink()
PTH109 os-getcwd os.getcwd() should be replaced by Path.cwd()
PTH110 os-path-exists os.path.exists() should be replaced by Path.exists()
PTH111 os-path-expanduser os.path.expanduser() should be replaced by Path.expanduser()
PTH112 os-path-isdir os.path.isdir() should be replaced by Path.is_dir()
PTH113 os-path-isfile os.path.isfile() should be replaced by Path.is_file()
PTH114 os-path-islink os.path.islink() should be replaced by Path.is_symlink()
PTH115 os-readlink os.readlink() should be replaced by Path.readlink()
PTH116 os-stat os.stat() should be replaced by Path.stat(), Path.owner(), or Path.group()
PTH117 os-path-isabs os.path.isabs() should be replaced by Path.is_absolute()
PTH118 os-path-join os.{module}.join() should be replaced by Path with / operator
PTH119 os-path-basename os.path.basename() should be replaced by Path.name
PTH120 os-path-dirname os.path.dirname() should be replaced by Path.parent
PTH121 os-path-samefile os.path.samefile() should be replaced by Path.samefile()
PTH122 os-path-splitext os.path.splitext() should be replaced by Path.suffix, Path.stem, and Path.parent
PTH123 builtin-open open() should be replaced by Path.open()
PTH124 py-path py.path is in maintenance mode, use pathlib instead
PTH201 path-constructor-current-directory Do not pass the current directory explicitly to Path
๐Ÿ› ๏ธ
PTH202 os-path-getsize os.path.getsize should be replaced by Path.stat().st_size
PTH203 os-path-getatime os.path.getatime should be replaced by Path.stat().st_atime
PTH204 os-path-getmtime os.path.getmtime should be replaced by Path.stat().st_mtime
PTH205 os-path-getctime os.path.getctime should be replaced by Path.stat().st_ctime
PTH206 os-sep-split Replace .split(os.sep) with Path.parts
PTH207 glob Replace {function} with Path.glob or Path.rglob
PTH208 os-listdir Use pathlib.Path.iterdir() instead.
PTH210 invalid-pathlib-with-suffix Invalid suffix passed to .with_suffix()
๐Ÿ› ๏ธ
PTH211 os-symlink os.symlink should be replaced by Path.symlink_to
๐Ÿงช

flynt (FLY)

For more, see flynt on PyPI.

Code Name Message
FLY002 static-join-to-f-string Consider {expression} instead of string join
๐Ÿ› ๏ธ

isort (I)

For more, see isort on PyPI.

For related settings, see isort.

Code Name Message
I001 unsorted-imports Import block is un-sorted or un-formatted
๐Ÿ› ๏ธ
I002 missing-required-import Missing required import: {name}
๐Ÿ› ๏ธ

mccabe (C90)

For more, see mccabe on PyPI.

For related settings, see mccabe.

Code Name Message
C901 complex-structure {name} is too complex ({complexity} > {max_complexity})

NumPy-specific rules (NPY)

Code Name Message
NPY001 numpy-deprecated-type-alias Type alias np.{type_name} is deprecated, replace with builtin type
๐Ÿ› ๏ธ
NPY002 numpy-legacy-random Replace legacy np.random.{method_name} call with np.random.Generator
NPY003 numpy-deprecated-function np.{existing} is deprecated; use np.{replacement} instead
๐Ÿ› ๏ธ
NPY201 numpy2-deprecation np.{existing} will be removed in NumPy 2.0. {migration_guide}
๐Ÿ› ๏ธ

pandas-vet (PD)

For more, see pandas-vet on PyPI.

Code Name Message
PD002 pandas-use-of-inplace-argument inplace=True should be avoided; it has inconsistent behavior
๐Ÿ› ๏ธ
PD003 pandas-use-of-dot-is-null .isna is preferred to .isnull; functionality is equivalent
PD004 pandas-use-of-dot-not-null .notna is preferred to .notnull; functionality is equivalent
PD007 pandas-use-of-dot-ix .ix is deprecated; use more explicit .loc or .iloc
PD008 pandas-use-of-dot-at Use .loc instead of .at. If speed is important, use NumPy.
PD009 pandas-use-of-dot-iat Use .iloc instead of .iat. If speed is important, use NumPy.
PD010 pandas-use-of-dot-pivot-or-unstack .pivot_table is preferred to .pivot or .unstack; provides same functionality
PD011 pandas-use-of-dot-values Use .to_numpy() instead of .values
PD012 pandas-use-of-dot-read-table Use .read_csv instead of .read_table to read CSV files
PD013 pandas-use-of-dot-stack .melt is preferred to .stack; provides same functionality
PD015 pandas-use-of-pd-merge Use .merge method instead of pd.merge function. They have equivalent functionality.
PD101 pandas-nunique-constant-series-check Using series.nunique() for checking that a series is constant is inefficient
PD901 pandas-df-variable-name Avoid using the generic variable name df for DataFrames

pep8-naming (N)

For more, see pep8-naming on PyPI.

For related settings, see pep8-naming.

Code Name Message
N801 invalid-class-name Class name {name} should use CapWords convention
N802 invalid-function-name Function name {name} should be lowercase
N803 invalid-argument-name Argument name {name} should be lowercase
N804 invalid-first-argument-name-for-class-method First argument of a class method should be named cls
๐Ÿ› ๏ธ
N805 invalid-first-argument-name-for-method First argument of a method should be named self
๐Ÿ› ๏ธ
N806 non-lowercase-variable-in-function Variable {name} in function should be lowercase
N807 dunder-function-name Function name should not start and end with __
N811 constant-imported-as-non-constant Constant {name} imported as non-constant {asname}
N812 lowercase-imported-as-non-lowercase Lowercase {name} imported as non-lowercase {asname}
N813 camelcase-imported-as-lowercase Camelcase {name} imported as lowercase {asname}
N814 camelcase-imported-as-constant Camelcase {name} imported as constant {asname}
N815 mixed-case-variable-in-class-scope Variable {name} in class scope should not be mixedCase
N816 mixed-case-variable-in-global-scope Variable {name} in global scope should not be mixedCase
N817 camelcase-imported-as-acronym CamelCase {name} imported as acronym {asname}
N818 error-suffix-on-exception-name Exception name {name} should be named with an Error suffix
N999 invalid-module-name Invalid module name: '{name}'

Perflint (PERF)

For more, see Perflint on PyPI.

Code Name Message
PERF101 unnecessary-list-cast Do not cast an iterable to list before iterating over it
๐Ÿ› ๏ธ
PERF102 incorrect-dict-iterator When using only the {subset} of a dict use the {subset}() method
๐Ÿ› ๏ธ
PERF203 try-except-in-loop try-except within a loop incurs performance overhead
PERF401 manual-list-comprehension Use {message_str} to create a transformed list
๐Ÿ› ๏ธ
PERF402 manual-list-copy Use list or list.copy to create a copy of a list
PERF403 manual-dict-comprehension Use a dictionary comprehension instead of {modifier} for-loop
๐Ÿ› ๏ธ

pycodestyle (E, W)

For more, see pycodestyle on PyPI.

For related settings, see pycodestyle.

Error (E)

Code Name Message
E101 mixed-spaces-and-tabs Indentation contains mixed spaces and tabs
E111 indentation-with-invalid-multiple Indentation is not a multiple of {indent_width}
๐Ÿงช
E112 no-indented-block Expected an indented block
๐Ÿงช
E113 unexpected-indentation Unexpected indentation
๐Ÿงช
E114 indentation-with-invalid-multiple-comment Indentation is not a multiple of {indent_width} (comment)
๐Ÿงช
E115 no-indented-block-comment Expected an indented block (comment)
๐Ÿงช
E116 unexpected-indentation-comment Unexpected indentation (comment)
๐Ÿงช
E117 over-indented Over-indented (comment)
๐Ÿงช
E201 whitespace-after-open-bracket Whitespace after '{symbol}'
๐Ÿงช๐Ÿ› ๏ธ
E202 whitespace-before-close-bracket Whitespace before '{symbol}'
๐Ÿงช๐Ÿ› ๏ธ
E203 whitespace-before-punctuation Whitespace before '{symbol}'
๐Ÿงช๐Ÿ› ๏ธ
E204 whitespace-after-decorator Whitespace after decorator
๐Ÿงช๐Ÿ› ๏ธ
E211 whitespace-before-parameters Whitespace before '{bracket}'
๐Ÿงช๐Ÿ› ๏ธ
E221 multiple-spaces-before-operator Multiple spaces before operator
๐Ÿงช๐Ÿ› ๏ธ
E222 multiple-spaces-after-operator Multiple spaces after operator
๐Ÿงช๐Ÿ› ๏ธ
E223 tab-before-operator Tab before operator
๐Ÿงช๐Ÿ› ๏ธ
E224 tab-after-operator Tab after operator
๐Ÿงช๐Ÿ› ๏ธ
E225 missing-whitespace-around-operator Missing whitespace around operator
๐Ÿงช๐Ÿ› ๏ธ
E226 missing-whitespace-around-arithmetic-operator Missing whitespace around arithmetic operator
๐Ÿงช๐Ÿ› ๏ธ
E227 missing-whitespace-around-bitwise-or-shift-operator Missing whitespace around bitwise or shift operator
๐Ÿงช๐Ÿ› ๏ธ
E228 missing-whitespace-around-modulo-operator Missing whitespace around modulo operator
๐Ÿงช๐Ÿ› ๏ธ
E231 missing-whitespace Missing whitespace after {}
๐Ÿงช๐Ÿ› ๏ธ
E241 multiple-spaces-after-comma Multiple spaces after comma
๐Ÿงช๐Ÿ› ๏ธ
E242 tab-after-comma Tab after comma
๐Ÿงช๐Ÿ› ๏ธ
E251 unexpected-spaces-around-keyword-parameter-equals Unexpected spaces around keyword / parameter equals
๐Ÿงช๐Ÿ› ๏ธ
E252 missing-whitespace-around-parameter-equals Missing whitespace around parameter equals
๐Ÿงช๐Ÿ› ๏ธ
E261 too-few-spaces-before-inline-comment Insert at least two spaces before an inline comment
๐Ÿงช๐Ÿ› ๏ธ
E262 no-space-after-inline-comment Inline comment should start with #
๐Ÿงช๐Ÿ› ๏ธ
E265 no-space-after-block-comment Block comment should start with #
๐Ÿงช๐Ÿ› ๏ธ
E266 multiple-leading-hashes-for-block-comment Too many leading # before block comment
๐Ÿงช๐Ÿ› ๏ธ
E271 multiple-spaces-after-keyword Multiple spaces after keyword
๐Ÿงช๐Ÿ› ๏ธ
E272 multiple-spaces-before-keyword Multiple spaces before keyword
๐Ÿงช๐Ÿ› ๏ธ
E273 tab-after-keyword Tab after keyword
๐Ÿงช๐Ÿ› ๏ธ
E274 tab-before-keyword Tab before keyword
๐Ÿงช๐Ÿ› ๏ธ
E275 missing-whitespace-after-keyword Missing whitespace after keyword
๐Ÿงช๐Ÿ› ๏ธ
E301 blank-line-between-methods Expected {BLANK_LINES_NESTED_LEVEL:?} blank line, found 0
๐Ÿงช๐Ÿ› ๏ธ
E302 blank-lines-top-level Expected {expected_blank_lines:?} blank lines, found {actual_blank_lines}
๐Ÿงช๐Ÿ› ๏ธ
E303 too-many-blank-lines Too many blank lines ({actual_blank_lines})
๐Ÿงช๐Ÿ› ๏ธ
E304 blank-line-after-decorator Blank lines found after function decorator ({lines})
๐Ÿงช๐Ÿ› ๏ธ
E305 blank-lines-after-function-or-class Expected 2 blank lines after class or function definition, found ({blank_lines})
๐Ÿงช๐Ÿ› ๏ธ
E306 blank-lines-before-nested-definition Expected 1 blank line before a nested definition, found 0
๐Ÿงช๐Ÿ› ๏ธ
E401 multiple-imports-on-one-line Multiple imports on one line
๐Ÿ› ๏ธ
E402 module-import-not-at-top-of-file Module level import not at top of cell
E501 line-too-long Line too long ({width} > {limit})
E502 redundant-backslash Redundant backslash
๐Ÿงช๐Ÿ› ๏ธ
E701 multiple-statements-on-one-line-colon Multiple statements on one line (colon)
E702 multiple-statements-on-one-line-semicolon Multiple statements on one line (semicolon)
E703 useless-semicolon Statement ends with an unnecessary semicolon
๐Ÿ› ๏ธ
E711 none-comparison Comparison to None should be cond is None
๐Ÿ› ๏ธ
E712 true-false-comparison Avoid equality comparisons to True; use {cond}: for truth checks
๐Ÿ› ๏ธ
E713 not-in-test Test for membership should be not in
๐Ÿ› ๏ธ
E714 not-is-test Test for object identity should be is not
๐Ÿ› ๏ธ
E721 type-comparison Use is and is not for type comparisons, or isinstance() for isinstance checks
E722 bare-except Do not use bare except
E731 lambda-assignment Do not assign a lambda expression, use a def
๐Ÿ› ๏ธ
E741 ambiguous-variable-name Ambiguous variable name: {name}
E742 ambiguous-class-name Ambiguous class name: {name}
E743 ambiguous-function-name Ambiguous function name: {name}
E902 io-error {message}
E999 syntax-error SyntaxError
โŒ

Warning (W)

Code Name Message
W191 tab-indentation Indentation contains tabs
W291 trailing-whitespace Trailing whitespace
๐Ÿ› ๏ธ
W292 missing-newline-at-end-of-file No newline at end of file
๐Ÿ› ๏ธ
W293 blank-line-with-whitespace Blank line contains whitespace
๐Ÿ› ๏ธ
W391 too-many-newlines-at-end-of-file Too many newlines at end of {domain}
๐Ÿงช๐Ÿ› ๏ธ
W505 doc-line-too-long Doc line too long ({width} > {limit})
W605 invalid-escape-sequence Invalid escape sequence: \{ch}
๐Ÿ› ๏ธ

pydoclint (DOC)

For more, see pydoclint on PyPI.

For related settings, see pydoclint.

Code Name Message
DOC201 docstring-missing-returns return is not documented in docstring
๐Ÿงช
DOC202 docstring-extraneous-returns Docstring should not have a returns section because the function doesn't return anything
๐Ÿงช
DOC402 docstring-missing-yields yield is not documented in docstring
๐Ÿงช
DOC403 docstring-extraneous-yields Docstring has a "Yields" section but the function doesn't yield anything
๐Ÿงช
DOC501 docstring-missing-exception Raised exception {id} missing from docstring
๐Ÿงช
DOC502 docstring-extraneous-exception Raised exception is not explicitly raised: {id}
๐Ÿงช

pydocstyle (D)

For more, see pydocstyle on PyPI.

For related settings, see pydocstyle.

Code Name Message
D100 undocumented-public-module Missing docstring in public module
D101 undocumented-public-class Missing docstring in public class
D102 undocumented-public-method Missing docstring in public method
D103 undocumented-public-function Missing docstring in public function
D104 undocumented-public-package Missing docstring in public package
D105 undocumented-magic-method Missing docstring in magic method
D106 undocumented-public-nested-class Missing docstring in public nested class
D107 undocumented-public-init Missing docstring in __init__
D200 unnecessary-multiline-docstring One-line docstring should fit on one line
๐Ÿ› ๏ธ
D201 blank-line-before-function No blank lines allowed before function docstring (found {num_lines})
๐Ÿ› ๏ธ
D202 blank-line-after-function No blank lines allowed after function docstring (found {num_lines})
๐Ÿ› ๏ธ
D203 incorrect-blank-line-before-class 1 blank line required before class docstring
๐Ÿ› ๏ธ
D204 incorrect-blank-line-after-class 1 blank line required after class docstring
๐Ÿ› ๏ธ
D205 missing-blank-line-after-summary 1 blank line required between summary line and description
๐Ÿ› ๏ธ
D206 docstring-tab-indentation Docstring should be indented with spaces, not tabs
D207 under-indentation Docstring is under-indented
๐Ÿ› ๏ธ
D208 over-indentation Docstring is over-indented
๐Ÿ› ๏ธ
D209 new-line-after-last-paragraph Multi-line docstring closing quotes should be on a separate line
๐Ÿ› ๏ธ
D210 surrounding-whitespace No whitespaces allowed surrounding docstring text
๐Ÿ› ๏ธ
D211 blank-line-before-class No blank lines allowed before class docstring
๐Ÿ› ๏ธ
D212 multi-line-summary-first-line Multi-line docstring summary should start at the first line
๐Ÿ› ๏ธ
D213 multi-line-summary-second-line Multi-line docstring summary should start at the second line
๐Ÿ› ๏ธ
D214 overindented-section Section is over-indented ("{name}")
๐Ÿ› ๏ธ
D215 overindented-section-underline Section underline is over-indented ("{name}")
๐Ÿ› ๏ธ
D300 triple-single-quotes Use triple double quotes """
๐Ÿ› ๏ธ
D301 escape-sequence-in-docstring Use r""" if any backslashes in a docstring
๐Ÿ› ๏ธ
D400 missing-trailing-period First line should end with a period
๐Ÿ› ๏ธ
D401 non-imperative-mood First line of docstring should be in imperative mood: "{first_line}"
D402 signature-in-docstring First line should not be the function's signature
D403 first-word-uncapitalized First word of the docstring should be capitalized: {} -> {}
๐Ÿ› ๏ธ
D404 docstring-starts-with-this First word of the docstring should not be "This"
D405 non-capitalized-section-name Section name should be properly capitalized ("{name}")
๐Ÿ› ๏ธ
D406 missing-new-line-after-section-name Section name should end with a newline ("{name}")
๐Ÿ› ๏ธ
D407 missing-dashed-underline-after-section Missing dashed underline after section ("{name}")
๐Ÿ› ๏ธ
D408 missing-section-underline-after-name Section underline should be in the line following the section's name ("{name}")
๐Ÿ› ๏ธ
D409 mismatched-section-underline-length Section underline should match the length of its name ("{name}")
๐Ÿ› ๏ธ
D410 no-blank-line-after-section Missing blank line after section ("{name}")
๐Ÿ› ๏ธ
D411 no-blank-line-before-section Missing blank line before section ("{name}")
๐Ÿ› ๏ธ
D412 blank-lines-between-header-and-content No blank lines allowed between a section header and its content ("{name}")
๐Ÿ› ๏ธ
D413 missing-blank-line-after-last-section Missing blank line after last section ("{name}")
๐Ÿ› ๏ธ
D414 empty-docstring-section Section has no content ("{name}")
D415 missing-terminal-punctuation First line should end with a period, question mark, or exclamation point
๐Ÿ› ๏ธ
D416 missing-section-name-colon Section name should end with a colon ("{name}")
๐Ÿ› ๏ธ
D417 undocumented-param Missing argument description in the docstring for {definition}: {name}
D418 overload-with-docstring Function decorated with @overload shouldn't contain a docstring
D419 empty-docstring Docstring is empty

Pyflakes (F)

For more, see Pyflakes on PyPI.

Code Name Message
F401 unused-import {name} imported but unused; consider using importlib.util.find_spec to test for availability
๐Ÿ› ๏ธ
F402 import-shadowed-by-loop-var Import {name} from {row} shadowed by loop variable
F403 undefined-local-with-import-star from {name} import * used; unable to detect undefined names
F404 late-future-import from __future__ imports must occur at the beginning of the file
F405 undefined-local-with-import-star-usage {name} may be undefined, or defined from star imports
F406 undefined-local-with-nested-import-star-usage from {name} import * only allowed at module level
F407 future-feature-not-defined Future feature {name} is not defined
F501 percent-format-invalid-format %-format string has invalid format string: {message}
F502 percent-format-expected-mapping %-format string expected mapping but got sequence
F503 percent-format-expected-sequence %-format string expected sequence but got mapping
F504 percent-format-extra-named-arguments %-format string has unused named argument(s): {message}
๐Ÿ› ๏ธ
F505 percent-format-missing-argument %-format string is missing argument(s) for placeholder(s): {message}
F506 percent-format-mixed-positional-and-named %-format string has mixed positional and named placeholders
F507 percent-format-positional-count-mismatch %-format string has {wanted} placeholder(s) but {got} substitution(s)
F508 percent-format-star-requires-sequence %-format string * specifier requires sequence
F509 percent-format-unsupported-format-character %-format string has unsupported format character {char}
F521 string-dot-format-invalid-format .format call has invalid format string: {message}
F522 string-dot-format-extra-named-arguments .format call has unused named argument(s): {message}
๐Ÿ› ๏ธ
F523 string-dot-format-extra-positional-arguments .format call has unused arguments at position(s): {message}
๐Ÿ› ๏ธ
F524 string-dot-format-missing-arguments .format call is missing argument(s) for placeholder(s): {message}
F525 string-dot-format-mixing-automatic .format string mixes automatic and manual numbering
F541 f-string-missing-placeholders f-string without any placeholders
๐Ÿ› ๏ธ
F601 multi-value-repeated-key-literal Dictionary key literal {name} repeated
๐Ÿ› ๏ธ
F602 multi-value-repeated-key-variable Dictionary key {name} repeated
๐Ÿ› ๏ธ
F621 expressions-in-star-assignment Too many expressions in star-unpacking assignment
F622 multiple-starred-expressions Two starred expressions in assignment
F631 assert-tuple Assert test is a non-empty tuple, which is always True
F632 is-literal Use == to compare constant literals
๐Ÿ› ๏ธ
F633 invalid-print-syntax Use of >> is invalid with print function
F634 if-tuple If test is a tuple, which is always True
F701 break-outside-loop break outside loop
F702 continue-outside-loop continue not properly in loop
F704 yield-outside-function {keyword} statement outside of a function
F706 return-outside-function return statement outside of a function/method
F707 default-except-not-last An except block as not the last exception handler
F722 forward-annotation-syntax-error Syntax error in forward annotation: {parse_error}
F811 redefined-while-unused Redefinition of unused {name} from {row}
๐Ÿ› ๏ธ
F821 undefined-name Undefined name {name}. {tip}
F822 undefined-export Undefined name {name} in __all__
F823 undefined-local Local variable {name} referenced before assignment
F841 unused-variable Local variable {name} is assigned to but never used
๐Ÿ› ๏ธ
F842 unused-annotation Local variable {name} is annotated but never used
F901 raise-not-implemented raise NotImplemented should be raise NotImplementedError
๐Ÿ› ๏ธ

pygrep-hooks (PGH)

For more, see pygrep-hooks on GitHub.

Code Name Message
PGH001 eval No builtin eval() allowed
โŒ
PGH002 deprecated-log-warn warn is deprecated in favor of warning
โŒ๐Ÿ› ๏ธ
PGH003 blanket-type-ignore Use specific rule codes when ignoring type issues
PGH004 blanket-noqa Use specific rule codes when using noqa
๐Ÿ› ๏ธ
PGH005 invalid-mock-access Mock method should be called: {name}

Pylint (PL)

For more, see Pylint on PyPI.

Convention (PLC)

Code Name Message
PLC0105 type-name-incorrect-variance {kind} name "{param_name}" does not reflect its {variance}; consider renaming it to "{replacement_name}"
PLC0131 type-bivariance {kind} cannot be both covariant and contravariant
PLC0132 type-param-name-mismatch {kind} name {param_name} does not match assigned variable name {var_name}
PLC0205 single-string-slots Class __slots__ should be a non-string iterable
PLC0206 dict-index-missing-items Extracting value from dictionary without calling .items()
PLC0207 missing-maxsplit-arg Accessing only the first or last element of str.split() without setting maxsplit=1
๐Ÿงช
PLC0208 iteration-over-set Use a sequence type instead of a set when iterating over values
๐Ÿ› ๏ธ
PLC0414 useless-import-alias Import alias does not rename original package
๐Ÿ› ๏ธ
PLC0415 import-outside-top-level import should be at the top-level of a file
๐Ÿงช
PLC1802 len-test len({expression}) used as condition without comparison
๐Ÿ› ๏ธ
PLC1901 compare-to-empty-string {existing} can be simplified to {replacement} as an empty string is falsey
๐Ÿงช
PLC2401 non-ascii-name {kind} name {name} contains a non-ASCII character
PLC2403 non-ascii-import-name Module alias {name} contains a non-ASCII character
PLC2701 import-private-name Private name import {name} from external module {module}
๐Ÿงช
PLC2801 unnecessary-dunder-call Unnecessary dunder call to {method}. {replacement}.
๐Ÿงช๐Ÿ› ๏ธ
PLC3002 unnecessary-direct-lambda-call Lambda expression called directly. Execute the expression inline instead.

Error (PLE)

Code Name Message
PLE0100 yield-in-init __init__ method is a generator
PLE0101 return-in-init Explicit return in __init__
PLE0115 nonlocal-and-global Name {name} is both nonlocal and global
PLE0116 continue-in-finally continue not supported inside finally clause
PLE0117 nonlocal-without-binding Nonlocal name {name} found without binding
PLE0118 load-before-global-declaration Name {name} is used prior to global declaration on {row}
PLE0237 non-slot-assignment Attribute {name} is not defined in class's __slots__
PLE0241 duplicate-bases Duplicate base {base} for class {class}
๐Ÿ› ๏ธ
PLE0302 unexpected-special-method-signature The special method {} expects {}, {} {} given
PLE0303 invalid-length-return-type __len__ does not return a non-negative integer
PLE0304 invalid-bool-return-type __bool__ does not return bool
๐Ÿงช
PLE0305 invalid-index-return-type __index__ does not return an integer
PLE0307 invalid-str-return-type __str__ does not return str
PLE0308 invalid-bytes-return-type __bytes__ does not return bytes
PLE0309 invalid-hash-return-type __hash__ does not return an integer
PLE0604 invalid-all-object Invalid object in __all__, must contain only strings
PLE0605 invalid-all-format Invalid format for __all__, must be tuple or list
PLE0643 potential-index-error Expression is likely to raise IndexError
PLE0704 misplaced-bare-raise Bare raise statement is not inside an exception handler
PLE1132 repeated-keyword-argument Repeated keyword argument: {duplicate_keyword}
PLE1141 dict-iter-missing-items Unpacking a dictionary in iteration without calling .items()
๐Ÿงช๐Ÿ› ๏ธ
PLE1142 await-outside-async await should be used within an async function
PLE1205 logging-too-many-args Too many arguments for logging format string
PLE1206 logging-too-few-args Not enough arguments for logging format string
PLE1300 bad-string-format-character Unsupported format character '{format_char}'
PLE1307 bad-string-format-type Format type does not match argument type
PLE1310 bad-str-strip-call String {strip} call contains duplicate characters (did you mean {removal}?)
PLE1507 invalid-envvar-value Invalid type for initial os.getenv argument; expected str
PLE1519 singledispatch-method @singledispatch decorator should not be used on methods
๐Ÿ› ๏ธ
PLE1520 singledispatchmethod-function @singledispatchmethod decorator should not be used on non-method functions
๐Ÿ› ๏ธ
PLE1700 yield-from-in-async-function yield from statement in async function; use async for instead
PLE2502 bidirectional-unicode Contains control characters that can permit obfuscated code
PLE2510 invalid-character-backspace Invalid unescaped character backspace, use "\b" instead
๐Ÿ› ๏ธ
PLE2512 invalid-character-sub Invalid unescaped character SUB, use "\x1A" instead
๐Ÿ› ๏ธ
PLE2513 invalid-character-esc Invalid unescaped character ESC, use "\x1B" instead
๐Ÿ› ๏ธ
PLE2514 invalid-character-nul Invalid unescaped character NUL, use "\0" instead
๐Ÿ› ๏ธ
PLE2515 invalid-character-zero-width-space Invalid unescaped character zero-width-space, use "\u200B" instead
๐Ÿ› ๏ธ
PLE4703 modified-iterating-set Iterated set {name} is modified within the for loop
๐Ÿงช๐Ÿ› ๏ธ

Refactor (PLR)

Code Name Message
PLR0124 comparison-with-itself Name compared with itself, consider replacing {actual}
PLR0133 comparison-of-constant Two constants compared in a comparison, consider replacing {left_constant} {op} {right_constant}
PLR0202 no-classmethod-decorator Class method defined without decorator
๐Ÿงช๐Ÿ› ๏ธ
PLR0203 no-staticmethod-decorator Static method defined without decorator
๐Ÿงช๐Ÿ› ๏ธ
PLR0206 property-with-parameters Cannot have defined parameters for properties
PLR0402 manual-from-import Use from {module} import {name} in lieu of alias
๐Ÿ› ๏ธ
PLR0904 too-many-public-methods Too many public methods ({methods} > {max_methods})
๐Ÿงช
PLR0911 too-many-return-statements Too many return statements ({returns} > {max_returns})
PLR0912 too-many-branches Too many branches ({branches} > {max_branches})
PLR0913 too-many-arguments Too many arguments in function definition ({c_args} > {max_args})
PLR0914 too-many-locals Too many local variables ({current_amount}/{max_amount})
๐Ÿงช
PLR0915 too-many-statements Too many statements ({statements} > {max_statements})
PLR0916 too-many-boolean-expressions Too many Boolean expressions ({expressions} > {max_expressions})
๐Ÿงช
PLR0917 too-many-positional-arguments Too many positional arguments ({c_pos}/{max_pos})
๐Ÿงช
PLR1701 repeated-isinstance-calls Merge isinstance calls: {expression}
โŒ๐Ÿ› ๏ธ
PLR1702 too-many-nested-blocks Too many nested blocks ({nested_blocks} > {max_nested_blocks})
๐Ÿงช
PLR1704 redefined-argument-from-local Redefining argument with the local name {name}
PLR1706 and-or-ternary Consider using if-else expression
โŒ
PLR1711 useless-return Useless return statement at end of function
๐Ÿ› ๏ธ
PLR1714 repeated-equality-comparison Consider merging multiple comparisons: {expression}. Use a set if the elements are hashable.
๐Ÿ› ๏ธ
PLR1716 boolean-chained-comparison Contains chained boolean comparison that can be simplified
๐Ÿ› ๏ธ
PLR1722 sys-exit-alias Use sys.exit() instead of {name}
๐Ÿ› ๏ธ
PLR1730 if-stmt-min-max Replace if statement with {replacement}
๐Ÿ› ๏ธ
PLR1733 unnecessary-dict-index-lookup Unnecessary lookup of dictionary value by key
๐Ÿงช๐Ÿ› ๏ธ
PLR1736 unnecessary-list-index-lookup List index lookup in enumerate() loop
๐Ÿ› ๏ธ
PLR2004 magic-value-comparison Magic value used in comparison, consider replacing {value} with a constant variable
PLR2044 empty-comment Line with empty comment
๐Ÿ› ๏ธ
PLR5501 collapsible-else-if Use elif instead of else then if, to reduce indentation
๐Ÿ› ๏ธ
PLR6104 non-augmented-assignment Use {operator} to perform an augmented assignment directly
๐Ÿงช๐Ÿ› ๏ธ
PLR6201 literal-membership Use a set literal when testing for membership
๐Ÿงช๐Ÿ› ๏ธ
PLR6301 no-self-use Method {method_name} could be a function, class method, or static method
๐Ÿงช

Warning (PLW)

Code Name Message
PLW0108 unnecessary-lambda Lambda may be unnecessary; consider inlining inner function
๐Ÿงช๐Ÿ› ๏ธ
PLW0120 useless-else-on-loop else clause on loop without a break statement; remove the else and dedent its contents
๐Ÿ› ๏ธ
PLW0127 self-assigning-variable Self-assignment of variable {name}
PLW0128 redeclared-assigned-name Redeclared variable {name} in assignment
PLW0129 assert-on-string-literal Asserting on an empty string literal will never pass
PLW0131 named-expr-without-context Named expression used without context
PLW0133 useless-exception-statement Missing raise statement on exception
๐Ÿ› ๏ธ
PLW0177 nan-comparison Comparing against a NaN value; use math.isnan instead
๐Ÿงช
PLW0211 bad-staticmethod-argument First argument of a static method should not be named {argument_name}
PLW0244 redefined-slots-in-subclass Slot {slot_name} redefined from base class {base}
๐Ÿงช
PLW0245 super-without-brackets super call is missing parentheses
๐Ÿ› ๏ธ
PLW0406 import-self Module {name} imports itself
PLW0602 global-variable-not-assigned Using global for {name} but no assignment is done
PLW0603 global-statement Using the global statement to update {name} is discouraged
PLW0604 global-at-module-level global at module level is redundant
PLW0642 self-or-cls-assignment Reassigned {} variable in {method_type} method
PLW0711 binary-op-exception Exception to catch is the result of a binary and operation
PLW1501 bad-open-mode {mode} is not a valid mode for open
PLW1507 shallow-copy-environ Shallow copy of os.environ via copy.copy(os.environ)
๐Ÿ› ๏ธ
PLW1508 invalid-envvar-default Invalid type for environment variable default; expected str or None
PLW1509 subprocess-popen-preexec-fn preexec_fn argument is unsafe when using threads
PLW1510 subprocess-run-without-check subprocess.run without explicit check argument
๐Ÿ› ๏ธ
PLW1514 unspecified-encoding {function_name} in text mode without explicit encoding argument
๐Ÿงช๐Ÿ› ๏ธ
PLW1641 eq-without-hash Object does not implement __hash__ method
๐Ÿงช
PLW2101 useless-with-lock Threading lock directly created in with statement has no effect
PLW2901 redefined-loop-name Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target
PLW3201 bad-dunder-method-name Dunder method {name} has no special meaning in Python 3
๐Ÿงช
PLW3301 nested-min-max Nested {func} calls can be flattened
๐Ÿ› ๏ธ

pyupgrade (UP)

For more, see pyupgrade on PyPI.

For related settings, see pyupgrade.

Code Name Message
UP001 useless-metaclass-type __metaclass__ = type is implied
๐Ÿ› ๏ธ
UP003 type-of-primitive Use {} instead of type(...)
๐Ÿ› ๏ธ
UP004 useless-object-inheritance Class {name} inherits from object
๐Ÿ› ๏ธ
UP005 deprecated-unittest-alias {alias} is deprecated, use {target}
๐Ÿ› ๏ธ
UP006 non-pep585-annotation Use {to} instead of {from} for type annotation
๐Ÿ› ๏ธ
UP007 non-pep604-annotation-union Use X | Y for type annotations
๐Ÿ› ๏ธ
UP008 super-call-with-parameters Use super() instead of super(__class__, self)
๐Ÿ› ๏ธ
UP009 utf8-encoding-declaration UTF-8 encoding declaration is unnecessary
๐Ÿ› ๏ธ
UP010 unnecessary-future-import Unnecessary __future__ import {import} for target Python version
๐Ÿ› ๏ธ
UP011 lru-cache-without-parameters Unnecessary parentheses to functools.lru_cache
๐Ÿ› ๏ธ
UP012 unnecessary-encode-utf8 Unnecessary call to encode as UTF-8
๐Ÿ› ๏ธ
UP013 convert-typed-dict-functional-to-class Convert {name} from TypedDict functional to class syntax
๐Ÿ› ๏ธ
UP014 convert-named-tuple-functional-to-class Convert {name} from NamedTuple functional to class syntax
๐Ÿ› ๏ธ
UP015 redundant-open-modes Unnecessary mode argument
๐Ÿ› ๏ธ
UP017 datetime-timezone-utc Use datetime.UTC alias
๐Ÿ› ๏ธ
UP018 native-literals Unnecessary {literal_type} call (rewrite as a literal)
๐Ÿ› ๏ธ
UP019 typing-text-str-alias typing.Text is deprecated, use str
๐Ÿ› ๏ธ
UP020 open-alias Use builtin open
๐Ÿ› ๏ธ
UP021 replace-universal-newlines universal_newlines is deprecated, use text
๐Ÿ› ๏ธ
UP022 replace-stdout-stderr Prefer capture_output over sending stdout and stderr to PIPE
๐Ÿ› ๏ธ
UP023 deprecated-c-element-tree cElementTree is deprecated, use ElementTree
๐Ÿ› ๏ธ
UP024 os-error-alias Replace aliased errors with OSError
๐Ÿ› ๏ธ
UP025 unicode-kind-prefix Remove unicode literals from strings
๐Ÿ› ๏ธ
UP026 deprecated-mock-import mock is deprecated, use unittest.mock
๐Ÿ› ๏ธ
UP027 unpacked-list-comprehension Replace unpacked list comprehension with a generator expression
โŒ
UP028 yield-in-for-loop Replace yield over for loop with yield from
๐Ÿ› ๏ธ
UP029 unnecessary-builtin-import Unnecessary builtin import: {import}
๐Ÿ› ๏ธ
UP030 format-literals Use implicit references for positional format fields
๐Ÿ› ๏ธ
UP031 printf-string-formatting Use format specifiers instead of percent format
๐Ÿ› ๏ธ
UP032 f-string Use f-string instead of format call
๐Ÿ› ๏ธ
UP033 lru-cache-with-maxsize-none Use @functools.cache instead of @functools.lru_cache(maxsize=None)
๐Ÿ› ๏ธ
UP034 extraneous-parentheses Avoid extraneous parentheses
๐Ÿ› ๏ธ
UP035 deprecated-import Import from {target} instead: {names}
๐Ÿ› ๏ธ
UP036 outdated-version-block Version block is outdated for minimum Python version
๐Ÿ› ๏ธ
UP037 quoted-annotation Remove quotes from type annotation
๐Ÿ› ๏ธ
UP038 non-pep604-isinstance Use X | Y in {} call instead of (X, Y)
โš ๏ธ๐Ÿ› ๏ธ
UP039 unnecessary-class-parentheses Unnecessary parentheses after class definition
๐Ÿ› ๏ธ
UP040 non-pep695-type-alias Type alias {name} uses {type_alias_method} instead of the type keyword
๐Ÿ› ๏ธ
UP041 timeout-error-alias Replace aliased errors with TimeoutError
๐Ÿ› ๏ธ
UP042 replace-str-enum Class {name} inherits from both str and enum.Enum
๐Ÿงช๐Ÿ› ๏ธ
UP043 unnecessary-default-type-args Unnecessary default type arguments
๐Ÿ› ๏ธ
UP044 non-pep646-unpack Use * for unpacking
๐Ÿ› ๏ธ
UP045 non-pep604-annotation-optional Use X | None for type annotations
๐Ÿงช๐Ÿ› ๏ธ
UP046 non-pep695-generic-class Generic class {name} uses Generic subclass instead of type parameters
๐Ÿงช๐Ÿ› ๏ธ
UP047 non-pep695-generic-function Generic function {name} should use type parameters
๐Ÿงช๐Ÿ› ๏ธ
UP049 private-type-parameter Generic {} uses private type parameters
๐Ÿงช๐Ÿ› ๏ธ
UP050 useless-class-metaclass-type Class {name} uses metaclass=type, which is redundant
๐Ÿงช๐Ÿ› ๏ธ

refurb (FURB)

For more, see refurb on PyPI.

Code Name Message
FURB101 read-whole-file open and read should be replaced by Path({filename}).{suggestion}
๐Ÿงช
FURB103 write-whole-file open and write should be replaced by Path({filename}).{suggestion}
๐Ÿงช
FURB105 print-empty-string Unnecessary empty string passed to print
๐Ÿ› ๏ธ
FURB110 if-exp-instead-of-or-operator Replace ternary if expression with or operator
๐Ÿงช๐Ÿ› ๏ธ
FURB113 repeated-append Use {suggestion} instead of repeatedly calling {name}.append()
๐Ÿงช๐Ÿ› ๏ธ
FURB116 f-string-number-format Replace {function_name} call with {display}
๐Ÿงช๐Ÿ› ๏ธ
FURB118 reimplemented-operator Use operator.{operator} instead of defining a {target}
๐Ÿงช๐Ÿ› ๏ธ
FURB122 for-loop-writes Use of {}.write in a for loop
๐Ÿงช๐Ÿ› ๏ธ
FURB129 readlines-in-for Instead of calling readlines(), iterate over file object directly
๐Ÿ› ๏ธ
FURB131 delete-full-slice Prefer clear over deleting a full slice
๐Ÿงช๐Ÿ› ๏ธ
FURB132 check-and-remove-from-set Use {suggestion} instead of check and remove
๐Ÿงช๐Ÿ› ๏ธ
FURB136 if-expr-min-max Replace if expression with {min_max} call
๐Ÿ› ๏ธ
FURB140 reimplemented-starmap Use itertools.starmap instead of the generator
๐Ÿงช๐Ÿ› ๏ธ
FURB142 for-loop-set-mutations Use of set.{}() in a for loop
๐Ÿงช๐Ÿ› ๏ธ
FURB145 slice-copy Prefer copy method over slicing
๐Ÿงช๐Ÿ› ๏ธ
FURB148 unnecessary-enumerate enumerate value is unused, use for x in range(len(y)) instead
๐Ÿงช๐Ÿ› ๏ธ
FURB152 math-constant Replace {literal} with math.{constant}
๐Ÿงช๐Ÿ› ๏ธ
FURB154 repeated-global Use of repeated consecutive {}
๐Ÿงช๐Ÿ› ๏ธ
FURB156 hardcoded-string-charset Use of hardcoded string charset
๐Ÿงช๐Ÿ› ๏ธ
FURB157 verbose-decimal-constructor Verbose expression in Decimal constructor
๐Ÿงช๐Ÿ› ๏ธ
FURB161 bit-count Use of bin({existing}).count('1')
๐Ÿ› ๏ธ
FURB162 fromisoformat-replace-z Unnecessary timezone replacement with zero offset
๐Ÿงช๐Ÿ› ๏ธ
FURB163 redundant-log-base Prefer math.{log_function}({arg}) over math.log with a redundant base
๐Ÿ› ๏ธ
FURB164 unnecessary-from-float Verbose method {method_name} in {constructor} construction
๐Ÿงช๐Ÿ› ๏ธ
FURB166 int-on-sliced-str Use of int with explicit base={base} after removing prefix
๐Ÿงช๐Ÿ› ๏ธ
FURB167 regex-flag-alias Use of regular expression alias re.{}
๐Ÿ› ๏ธ
FURB168 isinstance-type-none Prefer is operator over isinstance to check if an object is None
๐Ÿ› ๏ธ
FURB169 type-none-comparison When checking against None, use {} instead of comparison with type(None)
๐Ÿ› ๏ธ
FURB171 single-item-membership-test Membership test against single-item container
๐Ÿงช๐Ÿ› ๏ธ
FURB177 implicit-cwd Prefer Path.cwd() over Path().resolve() for current-directory lookups
๐Ÿ› ๏ธ
FURB180 meta-class-abc-meta Use of metaclass=abc.ABCMeta to define abstract base class
๐Ÿงช๐Ÿ› ๏ธ
FURB181 hashlib-digest-hex Use of hashlib's .digest().hex()
๐Ÿ› ๏ธ
FURB187 list-reverse-copy Use of assignment of reversed on list {name}
๐Ÿ› ๏ธ
FURB188 slice-to-remove-prefix-or-suffix Prefer str.removeprefix() over conditionally replacing with slice.
๐Ÿ› ๏ธ
FURB189 subclass-builtin Subclassing {subclass} can be error prone, use collections.{replacement} instead
๐Ÿงช๐Ÿ› ๏ธ
FURB192 sorted-min-max Prefer min over sorted() to compute the minimum value in a sequence
๐Ÿงช๐Ÿ› ๏ธ

Ruff-specific rules (RUF)

Code Name Message
RUF001 ambiguous-unicode-character-string String contains ambiguous {}. Did you mean {}?
RUF002 ambiguous-unicode-character-docstring Docstring contains ambiguous {}. Did you mean {}?
RUF003 ambiguous-unicode-character-comment Comment contains ambiguous {}. Did you mean {}?
RUF005 collection-literal-concatenation Consider {expression} instead of concatenation
๐Ÿ› ๏ธ
RUF006 asyncio-dangling-task Store a reference to the return value of {expr}.{method}
RUF007 zip-instead-of-pairwise Prefer itertools.pairwise() over zip() when iterating over successive pairs
๐Ÿ› ๏ธ
RUF008 mutable-dataclass-default Do not use mutable default values for dataclass attributes
RUF009 function-call-in-dataclass-default-argument Do not perform function call {name} in dataclass defaults
RUF010 explicit-f-string-type-conversion Use explicit conversion flag
๐Ÿ› ๏ธ
RUF011 ruff-static-key-dict-comprehension Dictionary comprehension uses static key
โŒ
RUF012 mutable-class-default Mutable class attributes should be annotated with typing.ClassVar
RUF013 implicit-optional PEP 484 prohibits implicit Optional
๐Ÿ› ๏ธ
RUF015 unnecessary-iterable-allocation-for-first-element Prefer next({iterable}) over single element slice
๐Ÿ› ๏ธ
RUF016 invalid-index-type Slice in indexed access to type {value_type} uses type {index_type} instead of an integer
RUF017 quadratic-list-summation Avoid quadratic list summation
๐Ÿ› ๏ธ
RUF018 assignment-in-assert Avoid assignment expressions in assert statements
RUF019 unnecessary-key-check Unnecessary key check before dictionary access
๐Ÿ› ๏ธ
RUF020 never-union {never_like} | T is equivalent to T
๐Ÿ› ๏ธ
RUF021 parenthesize-chained-operators Parenthesize a and b expressions when chaining and and or together, to make the precedence clear
๐Ÿ› ๏ธ
RUF022 unsorted-dunder-all __all__ is not sorted
๐Ÿ› ๏ธ
RUF023 unsorted-dunder-slots {}.__slots__ is not sorted
๐Ÿ› ๏ธ
RUF024 mutable-fromkeys-value Do not pass mutable objects as values to dict.fromkeys
๐Ÿ› ๏ธ
RUF026 default-factory-kwarg default_factory is a positional-only argument to defaultdict
๐Ÿ› ๏ธ
RUF027 missing-f-string-syntax Possible f-string without an f prefix
๐Ÿงช๐Ÿ› ๏ธ
RUF028 invalid-formatter-suppression-comment This suppression comment is invalid because {}
๐Ÿงช๐Ÿ› ๏ธ
RUF029 unused-async Function {name} is declared async, but doesn't await or use async features.
๐Ÿงช
RUF030 assert-with-print-message print() call in assert statement is likely unintentional
๐Ÿ› ๏ธ
RUF031 incorrectly-parenthesized-tuple-in-subscript Use parentheses for tuples in subscripts
๐Ÿงช๐Ÿ› ๏ธ
RUF032 decimal-from-float-literal Decimal() called with float literal argument
๐Ÿ› ๏ธ
RUF033 post-init-default __post_init__ method with argument defaults
๐Ÿ› ๏ธ
RUF034 useless-if-else Useless if-else condition
RUF035 ruff-unsafe-markup-use Unsafe use of {name} detected
โŒ
RUF036 none-not-at-end-of-union None not at the end of the type annotation.
๐Ÿงช
RUF037 unnecessary-empty-iterable-within-deque-call Unnecessary empty iterable within a deque call
๐Ÿงช๐Ÿ› ๏ธ
RUF038 redundant-bool-literal Literal[True, False, ...] can be replaced with Literal[...] | bool
๐Ÿงช๐Ÿ› ๏ธ
RUF039 unraw-re-pattern First argument to {call} is not raw string
๐Ÿงช๐Ÿ› ๏ธ
RUF040 invalid-assert-message-literal-argument Non-string literal used as assert message
RUF041 unnecessary-nested-literal Unnecessary nested Literal
๐Ÿ› ๏ธ
RUF043 pytest-raises-ambiguous-pattern Pattern passed to match= contains metacharacters but is neither escaped nor raw
๐Ÿงช
RUF045 implicit-class-var-in-dataclass Assignment without annotation found in dataclass body
๐Ÿงช
RUF046 unnecessary-cast-to-int Value being cast to int is already an integer
๐Ÿ› ๏ธ
RUF047 needless-else Empty else clause
๐Ÿงช๐Ÿ› ๏ธ
RUF048 map-int-version-parsing __version__ may contain non-integral-like elements
RUF049 dataclass-enum An enum class should not be decorated with @dataclass
๐Ÿงช
RUF051 if-key-in-dict-del Use pop instead of key in dict followed by del dict[key]
๐Ÿ› ๏ธ
RUF052 used-dummy-variable Local dummy variable {} is accessed
๐Ÿงช๐Ÿ› ๏ธ
RUF053 class-with-mixed-type-vars Class with type parameter list inherits from Generic
๐Ÿงช๐Ÿ› ๏ธ
RUF054 indented-form-feed Indented form feed
๐Ÿงช
RUF055 unnecessary-regular-expression Plain string pattern passed to re function
๐Ÿงช๐Ÿ› ๏ธ
RUF056 falsy-dict-get-fallback Avoid providing a falsy fallback to dict.get() in boolean test positions. The default fallback None is already falsy.
๐Ÿงช๐Ÿ› ๏ธ
RUF057 unnecessary-round Value being rounded is already an integer
๐Ÿงช๐Ÿ› ๏ธ
RUF058 starmap-zip itertools.starmap called on zip iterable
๐Ÿงช๐Ÿ› ๏ธ
RUF059 unused-unpacked-variable Unpacked variable {name} is never used
๐Ÿงช๐Ÿ› ๏ธ
RUF060 in-empty-collection Unnecessary membership test on empty collection
๐Ÿงช
RUF100 unused-noqa Unused noqa directive
๐Ÿ› ๏ธ
RUF101 redirected-noqa {original} is a redirect to {target}
๐Ÿ› ๏ธ
RUF102 invalid-rule-code Invalid rule code in # noqa: {}
๐Ÿงช๐Ÿ› ๏ธ
RUF200 invalid-pyproject-toml Failed to parse pyproject.toml: {message}

tryceratops (TRY)

For more, see tryceratops on PyPI.

Code Name Message
TRY002 raise-vanilla-class Create your own exception
TRY003 raise-vanilla-args Avoid specifying long messages outside the exception class
TRY004 type-check-without-type-error Prefer TypeError exception for invalid type
TRY200 reraise-no-cause Use raise from to specify exception cause
โŒ
TRY201 verbose-raise Use raise without specifying exception name
๐Ÿ› ๏ธ
TRY203 useless-try-except Remove exception handler; error is immediately re-raised
TRY300 try-consider-else Consider moving this statement to an else block
TRY301 raise-within-try Abstract raise to an inner function
TRY400 error-instead-of-exception Use logging.exception instead of logging.error
๐Ÿ› ๏ธ
TRY401 verbose-log-message Redundant exception object included in logging.exception call