Formatting strings, either with the %
operator or str.format
method, requires a valid string and arguments matching this
string's replacement fields.
This also applies to loggers from the logging
module. Internally they use %-formatting
. The only difference is that they
will log an error instead of raising an exception when provided arguments are invalid.
Formatted string literals, also called "f-strings", are generally simpler to use, and any syntax mistake will fail at compile time. However it is easy to forget curly braces and it won't raise any error.
This rule raises an issue when:
%
will not return the expected string because some arguments are not used. str.format
will not return the expected string because some arguments are not used. Rule {rule:python:S2275} covers cases where formatting a string will raise an exception.
"Error %(message)s" % {"message": "something failed", "extra": "some dead code"} # Noncompliant. Remove the unused argument "extra" or add a replacement field. "Error: User {} has not been able to access []".format("Alice", "MyFile") # Noncompliant. Remove 1 unexpected argument or add a replacement field. user = "Alice" resource = "MyFile" message = f"Error: User [user] has not been able to access [resource]" # Noncompliant. Add replacement fields or use a normal string instead of an f-string. import logging logging.error("Error: User %s has not been able to access %s", "Alice") # Noncompliant. Add 1 missing argument.
"Error %(message)s" % {"message": "something failed"} "Error: User {} has not been able to access {}".format("Alice", "MyFile") user = "Alice" resource = "MyFile" message = f"Error: User {user} has not been able to access {resource}" import logging logging.error("Error: User %s has not been able to access %s", "Alice", "MyFile")