summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Sassoulas <pierre.sassoulas@gmail.com>2021-02-21 13:27:11 +0100
committerPierre Sassoulas <pierre.sassoulas@gmail.com>2021-02-21 15:36:16 +0100
commit5bed07eba999130b6551acc7c43192d6a8eada43 (patch)
tree09e3a11503bd074363556e8a5fd33fc0e8db7fc4
parenta1e553d3bb07c56ca99c31279f9af104bede0a32 (diff)
downloadpylint-git-5bed07eba999130b6551acc7c43192d6a8eada43.tar.gz
Move from % string formatting syntax to f-string or .format()
-rw-r--r--doc/conf.py2
-rw-r--r--pylint/checkers/base.py22
-rw-r--r--pylint/checkers/classes.py4
-rw-r--r--pylint/checkers/exceptions.py6
-rw-r--r--pylint/checkers/imports.py12
-rw-r--r--pylint/checkers/misc.py2
-rw-r--r--pylint/checkers/refactoring/not_checker.py4
-rw-r--r--pylint/checkers/refactoring/refactoring_checker.py2
-rw-r--r--pylint/checkers/similar.py4
-rw-r--r--pylint/checkers/spelling.py4
-rw-r--r--pylint/checkers/strings.py2
-rw-r--r--pylint/checkers/typecheck.py2
-rw-r--r--pylint/checkers/utils.py2
-rw-r--r--pylint/checkers/variables.py12
-rw-r--r--pylint/config/__init__.py4
-rw-r--r--pylint/config/man_help_formatter.py30
-rw-r--r--pylint/config/option.py2
-rw-r--r--pylint/config/options_provider_mixin.py2
-rw-r--r--pylint/constants.py2
-rw-r--r--pylint/extensions/bad_builtin.py2
-rw-r--r--pylint/extensions/mccabe.py4
-rw-r--r--pylint/graph.py8
-rw-r--r--pylint/lint/pylinter.py6
-rw-r--r--pylint/message/message_definition.py14
-rw-r--r--pylint/pyreverse/diadefslib.py2
-rw-r--r--pylint/pyreverse/diagrams.py6
-rw-r--r--pylint/pyreverse/inspector.py6
-rw-r--r--pylint/pyreverse/vcgutils.py8
-rw-r--r--pylint/pyreverse/writer.py16
-rw-r--r--pylint/reporters/text.py2
-rw-r--r--pylint/testutils/lint_module_test.py2
-rw-r--r--pylint/testutils/reporter_for_tests.py2
-rw-r--r--pylint/utils/pragma_parser.py4
-rw-r--r--pylint/utils/utils.py10
-rw-r--r--setup.py4
-rw-r--r--tests/checkers/unittest_python3.py2
-rw-r--r--tests/test_func.py2
-rw-r--r--tests/test_self.py4
-rw-r--r--tests/unittest_pyreverse_writer.py6
39 files changed, 115 insertions, 115 deletions
diff --git a/doc/conf.py b/doc/conf.py
index c2d1a6d1b..a727c75e3 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -55,7 +55,7 @@ master_doc = "index"
# General information about the project.
project = "Pylint"
current_year = datetime.utcnow().year
-copyright = "2003-{year}, Logilab, PyCQA and contributors".format(year=current_year)
+copyright = f"2003-{current_year}, Logilab, PyCQA and contributors"
# The full version, including alpha/beta/rc tags.
release = version
diff --git a/pylint/checkers/base.py b/pylint/checkers/base.py
index e9d2bb785..647c201d9 100644
--- a/pylint/checkers/base.py
+++ b/pylint/checkers/base.py
@@ -1345,12 +1345,12 @@ class BasicChecker(_BasicChecker):
if is_iterable(default):
msg = value.pytype()
elif isinstance(default, astroid.Call):
- msg = "%s() (%s)" % (value.name, value.qname())
+ msg = f"{value.name}() ({value.qname()})"
else:
- msg = "%s (%s)" % (default.as_string(), value.qname())
+ msg = f"{default.as_string()} ({value.qname()})"
else:
# this argument is a name
- msg = "%s (%s)" % (
+ msg = "{} ({})".format(
default.as_string(),
DEFAULT_ARGUMENT_SYMBOLS[value.qname()],
)
@@ -1695,7 +1695,7 @@ def _create_naming_options():
name_type = name_type.replace("_", "-")
name_options.append(
(
- "%s-naming-style" % (name_type,),
+ f"{name_type}-naming-style",
{
"default": default_style,
"type": "choice",
@@ -1708,7 +1708,7 @@ def _create_naming_options():
)
name_options.append(
(
- "%s-rgx" % (name_type,),
+ f"{name_type}-rgx",
{
"default": None,
"type": "regexp",
@@ -1852,7 +1852,7 @@ class NameChecker(_BasicChecker):
)
for group in self.config.name_group:
for name_type in group.split(":"):
- self._name_group[name_type] = "group_%s" % (group,)
+ self._name_group[name_type] = f"group_{group}"
regexps, hints = self._create_naming_rules()
self._name_regexps = regexps
@@ -1869,12 +1869,12 @@ class NameChecker(_BasicChecker):
hints = {}
for name_type in KNOWN_NAME_TYPES:
- naming_style_option_name = "%s_naming_style" % (name_type,)
+ naming_style_option_name = f"{name_type}_naming_style"
naming_style_name = getattr(self.config, naming_style_option_name)
regexps[name_type] = NAMING_STYLES[naming_style_name].get_regex(name_type)
- custom_regex_setting_name = "%s_rgx" % (name_type,)
+ custom_regex_setting_name = f"{name_type}_rgx"
custom_regex = getattr(self.config, custom_regex_setting_name, None)
if custom_regex is not None:
regexps[name_type] = custom_regex
@@ -2448,7 +2448,7 @@ class ComparisonChecker(_BasicChecker):
self.add_message(
"nan-comparison",
node=root_node,
- args=("'{}'".format(root_node.as_string()), suggestion),
+ args=(f"'{root_node.as_string()}'", suggestion),
)
def _check_literal_comparison(self, literal, node):
@@ -2469,7 +2469,7 @@ class ComparisonChecker(_BasicChecker):
if isinstance(right, astroid.Const):
return
operator = REVERSED_COMPS.get(operator, operator)
- suggestion = "%s %s %r" % (right.as_string(), operator, left.value)
+ suggestion = f"{right.as_string()} {operator} {left.value!r}"
self.add_message("misplaced-comparison-constant", node=node, args=(suggestion,))
def _check_logical_tautology(self, node):
@@ -2496,7 +2496,7 @@ class ComparisonChecker(_BasicChecker):
right_operand = right_operand.name
if left_operand == right_operand:
- suggestion = "%s %s %s" % (left_operand, operator, right_operand)
+ suggestion = f"{left_operand} {operator} {right_operand}"
self.add_message("comparison-with-itself", node=node, args=(suggestion,))
def _check_callable_comparison(self, node):
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py
index 8ad035081..aada6bbf3 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -827,7 +827,7 @@ a metaclass class method.",
if not ancestor:
continue
if isinstance(ancestor, astroid.Instance) and ancestor.is_subtype_of(
- "%s.type" % (BUILTINS,)
+ f"{BUILTINS}.type"
):
continue
if (
@@ -1604,7 +1604,7 @@ a metaclass class method.",
valid = repr(config[0])
else:
valid = ", ".join(repr(v) for v in config[:-1])
- valid = "%s or %r" % (valid, config[-1])
+ valid = "{} or {!r}".format(valid, config[-1])
self.add_message(message, args=(method_name, valid), node=node)
def _check_bases_classes(self, node):
diff --git a/pylint/checkers/exceptions.py b/pylint/checkers/exceptions.py
index b4683d1b6..589ec060f 100644
--- a/pylint/checkers/exceptions.py
+++ b/pylint/checkers/exceptions.py
@@ -495,7 +495,7 @@ class ExceptionsChecker(checkers.BaseChecker):
def visit_binop(self, node):
if isinstance(node.parent, astroid.ExceptHandler):
# except (V | A)
- suggestion = "Did you mean '(%s, %s)' instead?" % (
+ suggestion = "Did you mean '({}, {})' instead?".format(
node.left.as_string(),
node.right.as_string(),
)
@@ -505,7 +505,7 @@ class ExceptionsChecker(checkers.BaseChecker):
def visit_compare(self, node):
if isinstance(node.parent, astroid.ExceptHandler):
# except (V < A)
- suggestion = "Did you mean '(%s, %s)' instead?" % (
+ suggestion = "Did you mean '({}, {})' instead?".format(
node.left.as_string(),
", ".join(operand.as_string() for _, operand in node.ops),
)
@@ -568,7 +568,7 @@ class ExceptionsChecker(checkers.BaseChecker):
for previous_exc in exceptions_classes:
if previous_exc in exc_ancestors:
- msg = "%s is an ancestor class of %s" % (
+ msg = "{} is an ancestor class of {}".format(
previous_exc.name,
exc.name,
)
diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py
index b1dc68e93..3c90a42d6 100644
--- a/pylint/checkers/imports.py
+++ b/pylint/checkers/imports.py
@@ -94,7 +94,7 @@ def _get_import_name(importnode, modname):
def _get_first_import(node, context, name, base, level, alias):
"""return the node where [base.]<name> is imported or None if not found"""
- fullname = "%s.%s" % (base, name) if base else name
+ fullname = f"{base}.{name}" if base else name
first = None
found = False
@@ -110,7 +110,7 @@ def _get_first_import(node, context, name, base, level, alias):
elif isinstance(first, astroid.ImportFrom):
if level == first.level:
for imported_name, imported_alias in first.names:
- if fullname == "%s.%s" % (first.modname, imported_name):
+ if fullname == f"{first.modname}.{imported_name}":
found = True
break
if (
@@ -161,10 +161,10 @@ def _repr_tree_defs(data, indent_str=None):
else:
files = "(%s)" % ",".join(sorted(files))
if indent_str is None:
- lines.append("%s %s" % (mod, files))
+ lines.append(f"{mod} {files}")
sub_indent_str = " "
else:
- lines.append(r"%s\-%s %s" % (indent_str, mod, files))
+ lines.append(fr"{indent_str}\-{mod} {files}")
if i == len(nodes) - 1:
sub_indent_str = "%s " % indent_str
else:
@@ -197,7 +197,7 @@ def _make_graph(filename, dep_info, sect, gtype):
report's section
"""
_dependencies_graph(filename, dep_info)
- sect.append(Paragraph("%simports graph has been written to %s" % (gtype, filename)))
+ sect.append(Paragraph(f"{gtype}imports graph has been written to {filename}"))
# the import checker itself ###################################################
@@ -537,7 +537,7 @@ class ImportsChecker(BaseChecker):
return
for name, _ in node.names:
if name != "*":
- self._add_imported_module(node, "%s.%s" % (imported_module.name, name))
+ self._add_imported_module(node, f"{imported_module.name}.{name}")
else:
self._add_imported_module(node, imported_module.name)
diff --git a/pylint/checkers/misc.py b/pylint/checkers/misc.py
index fd17fba33..2da9082d6 100644
--- a/pylint/checkers/misc.py
+++ b/pylint/checkers/misc.py
@@ -107,7 +107,7 @@ class EncodingChecker(BaseChecker):
notes = "|".join(map(re.escape, self.config.notes))
if self.config.notes_rgx:
- regex_string = r"#\s*(%s|%s)\b" % (notes, self.config.notes_rgx)
+ regex_string = fr"#\s*({notes}|{self.config.notes_rgx})\b"
else:
regex_string = r"#\s*(%s)\b" % (notes)
diff --git a/pylint/checkers/refactoring/not_checker.py b/pylint/checkers/refactoring/not_checker.py
index e48a7eaae..48592c1b5 100644
--- a/pylint/checkers/refactoring/not_checker.py
+++ b/pylint/checkers/refactoring/not_checker.py
@@ -40,7 +40,7 @@ class NotChecker(checkers.BaseChecker):
skipped_nodes = (astroid.Set,)
# 'builtins' py3, '__builtin__' py2
skipped_classnames = [
- "%s.%s" % (builtins.__name__, qname) for qname in ("set", "frozenset")
+ f"{builtins.__name__}.{qname}" for qname in ("set", "frozenset")
]
@utils.check_messages("unneeded-not")
@@ -77,7 +77,7 @@ class NotChecker(checkers.BaseChecker):
and _type.qname() in self.skipped_classnames
):
return
- suggestion = "%s %s %s" % (
+ suggestion = "{} {} {}".format(
left.as_string(),
self.reverse_op[operator],
right.as_string(),
diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py
index ae02b1655..c22e26163 100644
--- a/pylint/checkers/refactoring/refactoring_checker.py
+++ b/pylint/checkers/refactoring/refactoring_checker.py
@@ -937,7 +937,7 @@ class RefactoringChecker(checkers.BaseTokenChecker):
values = list(collections.OrderedDict.fromkeys(values))
values.remove(common_variable)
values_string = ", ".join(values) if len(values) != 1 else values[0] + ","
- suggestion = "%s %s (%s)" % (common_variable, comprehension, values_string)
+ suggestion = f"{common_variable} {comprehension} ({values_string})"
self.add_message("consider-using-in", node=node, args=(suggestion,))
diff --git a/pylint/checkers/similar.py b/pylint/checkers/similar.py
index 1f817ada2..5b141c6dc 100644
--- a/pylint/checkers/similar.py
+++ b/pylint/checkers/similar.py
@@ -107,7 +107,7 @@ class Similar:
couples = sorted(couples)
lineset = idx = None
for lineset, idx in couples:
- print("==%s:%s" % (lineset.name, idx))
+ print(f"=={lineset.name}:{idx}")
if lineset:
for line in lineset._real_lines[idx : idx + num]:
print(" ", line.rstrip())
@@ -404,7 +404,7 @@ class SimilarChecker(BaseChecker, Similar, MapReduceMixin):
msg = []
lineset = idx = None
for lineset, idx in couples:
- msg.append("==%s:%s" % (lineset.name, idx))
+ msg.append(f"=={lineset.name}:{idx}")
msg.sort()
if lineset:
diff --git a/pylint/checkers/spelling.py b/pylint/checkers/spelling.py
index 4abf6fa97..587807723 100644
--- a/pylint/checkers/spelling.py
+++ b/pylint/checkers/spelling.py
@@ -66,7 +66,7 @@ if enchant is not None:
br = enchant.Broker()
dicts = br.list_dicts()
dict_choices = [""] + [d[0] for d in dicts]
- dicts = ["%s (%s)" % (d[0], d[1].name) for d in dicts]
+ dicts = ["{} ({})".format(d[0], d[1].name) for d in dicts]
dicts = ", ".join(dicts)
instr = ""
else:
@@ -358,7 +358,7 @@ class SpellingChecker(BaseTokenChecker):
col += 1
indicator = (" " * col) + ("^" * len(word))
all_suggestion = "' or '".join(suggestions)
- args = (word, original_line, indicator, "'{}'".format(all_suggestion))
+ args = (word, original_line, indicator, f"'{all_suggestion}'")
self.add_message(msgid, line=line_num, args=args)
def process_tokens(self, tokens):
diff --git a/pylint/checkers/strings.py b/pylint/checkers/strings.py
index 5769f6e52..c23906ec9 100644
--- a/pylint/checkers/strings.py
+++ b/pylint/checkers/strings.py
@@ -227,7 +227,7 @@ def get_access_path(key, parts):
if is_attribute:
path.append(f".{specifier}")
else:
- path.append("[{!r}]".format(specifier))
+ path.append(f"[{specifier!r}]")
return str(key) + "".join(path)
diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py
index 84607b3e1..e0785a4f0 100644
--- a/pylint/checkers/typecheck.py
+++ b/pylint/checkers/typecheck.py
@@ -958,7 +958,7 @@ accessed. Python regular expressions are accepted.",
):
continue
- qualname = "{}.{}".format(owner.pytype(), node.attrname)
+ qualname = f"{owner.pytype()}.{node.attrname}"
if any(
pattern.match(qualname) for pattern in self._compiled_generated_members
):
diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py
index 66a6d5f4d..6c2a934c7 100644
--- a/pylint/checkers/utils.py
+++ b/pylint/checkers/utils.py
@@ -313,7 +313,7 @@ def clobber_in_except(
(False, None) otherwise.
"""
if isinstance(node, astroid.AssignAttr):
- return True, (node.attrname, "object %r" % (node.expr.as_string(),))
+ return True, (node.attrname, f"object {node.expr.as_string()!r}")
if isinstance(node, astroid.AssignName):
name = node.name
if is_builtin(name):
diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py
index bae89d7d5..01cf8ecbd 100644
--- a/pylint/checkers/variables.py
+++ b/pylint/checkers/variables.py
@@ -181,7 +181,7 @@ def _get_unpacking_extra_info(node, inferred):
elif inferred.lineno:
more = " defined at line %s" % inferred.lineno
elif inferred.lineno:
- more = " defined at line %s of %s" % (inferred.lineno, inferred_module)
+ more = f" defined at line {inferred.lineno} of {inferred_module}"
return more
@@ -1636,20 +1636,20 @@ class VariablesChecker(BaseChecker):
else:
if isinstance(stmt, astroid.Import):
if asname is not None:
- msg = "%s imported as %s" % (qname, asname)
+ msg = f"{qname} imported as {asname}"
else:
msg = "import %s" % name
self.add_message("unused-import", args=msg, node=stmt)
return
if isinstance(stmt, astroid.ImportFrom):
if asname is not None:
- msg = "%s imported from %s as %s" % (
+ msg = "{} imported from {} as {}".format(
qname,
stmt.modname,
asname,
)
else:
- msg = "%s imported from %s" % (name, stmt.modname)
+ msg = f"{name} imported from {stmt.modname}"
self.add_message("unused-import", args=msg, node=stmt)
return
message_name = "unused-variable"
@@ -2002,7 +2002,7 @@ class VariablesChecker(BaseChecker):
if as_name is None:
msg = "import %s" % imported_name
else:
- msg = "%s imported as %s" % (imported_name, as_name)
+ msg = f"{imported_name} imported as {as_name}"
if not _is_type_checking_import(stmt):
self.add_message("unused-import", args=msg, node=stmt)
elif isinstance(stmt, astroid.ImportFrom) and stmt.modname != FUTURE:
@@ -2024,7 +2024,7 @@ class VariablesChecker(BaseChecker):
self.add_message("unused-wildcard-import", args=name, node=stmt)
else:
if as_name is None:
- msg = "%s imported from %s" % (imported_name, stmt.modname)
+ msg = f"{imported_name} imported from {stmt.modname}"
else:
fields = (imported_name, stmt.modname, as_name)
msg = "%s imported from %s as %s" % fields
diff --git a/pylint/config/__init__.py b/pylint/config/__init__.py
index 21387a9df..41c303666 100644
--- a/pylint/config/__init__.py
+++ b/pylint/config/__init__.py
@@ -68,7 +68,7 @@ else:
def _get_pdata_path(base_name, recurs):
base_name = base_name.replace(os.sep, "_")
- return os.path.join(PYLINT_HOME, "%s%s%s" % (base_name, recurs, ".stats"))
+ return os.path.join(PYLINT_HOME, "{}{}{}".format(base_name, recurs, ".stats"))
def load_results(base):
@@ -91,7 +91,7 @@ def save_results(results, base):
with open(data_file, "wb") as stream:
pickle.dump(results, stream)
except OSError as ex:
- print("Unable to create file %s: %s" % (data_file, ex), file=sys.stderr)
+ print(f"Unable to create file {data_file}: {ex}", file=sys.stderr)
def find_pylintrc():
diff --git a/pylint/config/man_help_formatter.py b/pylint/config/man_help_formatter.py
index 66aa1cb9c..ab3b7e749 100644
--- a/pylint/config/man_help_formatter.py
+++ b/pylint/config/man_help_formatter.py
@@ -33,9 +33,9 @@ class _ManHelpFormatter(optparse.HelpFormatter):
help_string = help_string.replace("[current:", "[default:")
else:
help_string = ""
- return """.IP "%s"
-%s
-""" % (
+ return """.IP "{}"
+{}
+""".format(
optstring,
help_string,
)
@@ -50,7 +50,7 @@ class _ManHelpFormatter(optparse.HelpFormatter):
short_desc = self.format_short_description(pgm, pkginfo.description)
if hasattr(pkginfo, "long_desc"):
long_desc = self.format_long_description(pgm, pkginfo.long_desc)
- return "%s\n%s\n%s\n%s" % (
+ return "{}\n{}\n{}\n{}".format(
self.format_title(pgm, section),
short_desc,
self.format_synopsis(pgm),
@@ -60,14 +60,14 @@ class _ManHelpFormatter(optparse.HelpFormatter):
@staticmethod
def format_title(pgm, section):
date = "%d-%02d-%02d" % time.localtime()[:3]
- return '.TH %s %s "%s" %s' % (pgm, section, date, pgm)
+ return f'.TH {pgm} {section} "{date}" {pgm}'
@staticmethod
def format_short_description(pgm, short_desc):
return """.SH NAME
-.B %s
-\\- %s
-""" % (
+.B {}
+\\- {}
+""".format(
pgm,
short_desc.strip(),
)
@@ -93,9 +93,9 @@ class _ManHelpFormatter(optparse.HelpFormatter):
if long_desc.lower().startswith(pgm):
long_desc = long_desc[len(pgm) :]
return """.SH DESCRIPTION
-.B %s
-%s
-""" % (
+.B {}
+{}
+""".format(
pgm,
long_desc.strip(),
)
@@ -103,15 +103,15 @@ class _ManHelpFormatter(optparse.HelpFormatter):
@staticmethod
def format_tail(pkginfo):
tail = """.SH SEE ALSO
-/usr/share/doc/pythonX.Y-%s/
+/usr/share/doc/pythonX.Y-{}/
.SH BUGS
Please report bugs on the project\'s mailing list:
-%s
+{}
.SH AUTHOR
-%s <%s>
-""" % (
+{} <{}>
+""".format(
getattr(pkginfo, "debian_name", "pylint"),
pkginfo.mailinglist,
pkginfo.author,
diff --git a/pylint/config/option.py b/pylint/config/option.py
index 74a335d61..b2573e96e 100644
--- a/pylint/config/option.py
+++ b/pylint/config/option.py
@@ -89,7 +89,7 @@ def _call_validator(opttype, optdict, option, value):
return VALIDATORS[opttype](value)
except Exception as e:
raise optparse.OptionValueError(
- "%s value (%r) should be of type %s" % (option, value, opttype)
+ f"{option} value ({value!r}) should be of type {opttype}"
) from e
diff --git a/pylint/config/options_provider_mixin.py b/pylint/config/options_provider_mixin.py
index cae6d5865..2c5f7fb41 100644
--- a/pylint/config/options_provider_mixin.py
+++ b/pylint/config/options_provider_mixin.py
@@ -86,7 +86,7 @@ class OptionsProviderMixIn:
if option[0] == opt:
return option[1]
raise optparse.OptionError(
- "no such option %s in section %r" % (opt, self.name), opt
+ f"no such option {opt} in section {self.name!r}", opt
)
def options_by_section(self):
diff --git a/pylint/constants.py b/pylint/constants.py
index 660204eef..f6f3b189b 100644
--- a/pylint/constants.py
+++ b/pylint/constants.py
@@ -44,7 +44,7 @@ class WarningScope:
NODE = "node-based-msg"
-full_version = "pylint %s\nastroid %s\nPython %s" % (
+full_version = "pylint {}\nastroid {}\nPython {}".format(
pylint_version,
astroid_version,
sys.version,
diff --git a/pylint/extensions/bad_builtin.py b/pylint/extensions/bad_builtin.py
index 49aa5a8f9..9f1108606 100644
--- a/pylint/extensions/bad_builtin.py
+++ b/pylint/extensions/bad_builtin.py
@@ -56,7 +56,7 @@ class BadBuiltinChecker(BaseChecker):
if name in self.config.bad_functions:
hint = BUILTIN_HINTS.get(name)
if hint:
- args = "%r. %s" % (name, hint)
+ args = f"{name!r}. {hint}"
else:
args = repr(name)
self.add_message("bad-builtin", node=node, args=args)
diff --git a/pylint/extensions/mccabe.py b/pylint/extensions/mccabe.py
index 7865551d1..0eea393ee 100644
--- a/pylint/extensions/mccabe.py
+++ b/pylint/extensions/mccabe.py
@@ -58,7 +58,7 @@ class PathGraphingAstVisitor(Mccabe_PathGraphingAstVisitor):
self.graph = PathGraph(node)
self.tail = node
self.dispatch_list(node.body)
- self.graphs["%s%s" % (self.classname, node.name)] = self.graph
+ self.graphs[f"{self.classname}{node.name}"] = self.graph
self.reset()
visitAsyncFunctionDef = visitFunctionDef
@@ -111,7 +111,7 @@ class PathGraphingAstVisitor(Mccabe_PathGraphingAstVisitor):
# global loop
self.graph = PathGraph(node)
self._subgraph_parse(node, node, extra_blocks)
- self.graphs["%s%s" % (self.classname, name)] = self.graph
+ self.graphs[f"{self.classname}{name}"] = self.graph
self.reset()
else:
self._append_node(node)
diff --git a/pylint/graph.py b/pylint/graph.py
index b1fe460d8..e689a6883 100644
--- a/pylint/graph.py
+++ b/pylint/graph.py
@@ -134,16 +134,16 @@ class DotBackend:
"""emit an edge from <name1> to <name2>.
edge properties: see https://www.graphviz.org/doc/info/attrs.html
"""
- attrs = ['%s="%s"' % (prop, value) for prop, value in props.items()]
+ attrs = [f'{prop}="{value}"' for prop, value in props.items()]
n_from, n_to = normalize_node_id(name1), normalize_node_id(name2)
- self.emit("%s -> %s [%s];" % (n_from, n_to, ", ".join(sorted(attrs))))
+ self.emit("{} -> {} [{}];".format(n_from, n_to, ", ".join(sorted(attrs))))
def emit_node(self, name, **props):
"""emit a node with given properties.
node properties: see https://www.graphviz.org/doc/info/attrs.html
"""
- attrs = ['%s="%s"' % (prop, value) for prop, value in props.items()]
- self.emit("%s [%s];" % (normalize_node_id(name), ", ".join(sorted(attrs))))
+ attrs = [f'{prop}="{value}"' for prop, value in props.items()]
+ self.emit("{} [{}];".format(normalize_node_id(name), ", ".join(sorted(attrs))))
def normalize_node_id(nid):
diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py
index 63ba9b02f..3ce5f53b3 100644
--- a/pylint/lint/pylinter.py
+++ b/pylint/lint/pylinter.py
@@ -657,12 +657,12 @@ class PyLinter(
def list_messages_enabled(self):
enabled = [
- " %s (%s)" % (message.symbol, message.msgid)
+ f" {message.symbol} ({message.msgid})"
for message in self.msgs_store.messages
if self.is_message_enabled(message.msgid)
]
disabled = [
- " %s (%s)" % (message.symbol, message.msgid)
+ f" {message.symbol} ({message.msgid})"
for message in self.msgs_store.messages
if not self.is_message_enabled(message.msgid)
]
@@ -1158,7 +1158,7 @@ class PyLinter(
msg = "Your code has been rated at %.2f/10" % note
pnote = previous_stats.get("global_note")
if pnote is not None:
- msg += " (previous run: %.2f/10, %+.2f)" % (pnote, note - pnote)
+ msg += " (previous run: {:.2f}/10, {:+.2f})".format(pnote, note - pnote)
if self.config.score:
sect = report_nodes.EvaluationSection(msg)
diff --git a/pylint/message/message_definition.py b/pylint/message/message_definition.py
index 8b2fcaf08..3fb9af945 100644
--- a/pylint/message/message_definition.py
+++ b/pylint/message/message_definition.py
@@ -41,13 +41,15 @@ class MessageDefinition:
if len(msgid) != 5:
raise InvalidMessageError("Invalid message id %r" % msgid)
if msgid[0] not in MSG_TYPES:
- raise InvalidMessageError("Bad message type %s in %r" % (msgid[0], msgid))
+ raise InvalidMessageError(
+ "Bad message type {} in {!r}".format(msgid[0], msgid)
+ )
def __repr__(self):
- return "MessageDefinition:%s (%s)" % (self.symbol, self.msgid)
+ return f"MessageDefinition:{self.symbol} ({self.msgid})"
def __str__(self):
- return "%s:\n%s %s" % (repr(self), self.msg, self.description)
+ return "{}:\n{} {}".format(repr(self), self.msg, self.description)
def may_be_emitted(self):
"""return True if message may be emitted using the current interpreter"""
@@ -75,8 +77,8 @@ class MessageDefinition:
else:
desc += " This message can't be emitted when using Python %s." % restr
msg_help = normalize_text(" ".join(desc.split()), indent=" ")
- message_id = "%s (%s)" % (self.symbol, self.msgid)
+ message_id = f"{self.symbol} ({self.msgid})"
if title != "%s":
title = title.splitlines()[0]
- return ":%s: *%s*\n%s" % (message_id, title.rstrip(" "), msg_help)
- return ":%s:\n%s" % (message_id, msg_help)
+ return ":{}: *{}*\n{}".format(message_id, title.rstrip(" "), msg_help)
+ return f":{message_id}:\n{msg_help}"
diff --git a/pylint/pyreverse/diadefslib.py b/pylint/pyreverse/diadefslib.py
index 86a15d590..5cc6a83cf 100644
--- a/pylint/pyreverse/diadefslib.py
+++ b/pylint/pyreverse/diadefslib.py
@@ -42,7 +42,7 @@ class DiaDefGenerator:
"""get title for objects"""
title = node.name
if self.module_names:
- title = "%s.%s" % (node.root().name, title)
+ title = f"{node.root().name}.{title}"
return title
def _set_option(self, option):
diff --git a/pylint/pyreverse/diagrams.py b/pylint/pyreverse/diagrams.py
index aae46fd6e..9fb30b974 100644
--- a/pylint/pyreverse/diagrams.py
+++ b/pylint/pyreverse/diagrams.py
@@ -92,7 +92,7 @@ class ClassDiagram(Figure, FilterMixIn):
continue
names = self.class_names(associated_nodes)
if names:
- node_name = "%s : %s" % (node_name, ", ".join(names))
+ node_name = "{} : {}".format(node_name, ", ".join(names))
attrs.append(node_name)
return sorted(attrs)
@@ -220,9 +220,9 @@ class PackageDiagram(ClassDiagram):
return mod
# search for fullname of relative import modules
package = node.root().name
- if mod_name == "%s.%s" % (package, name):
+ if mod_name == f"{package}.{name}":
return mod
- if mod_name == "%s.%s" % (package.rsplit(".", 1)[0], name):
+ if mod_name == "{}.{}".format(package.rsplit(".", 1)[0], name):
return mod
raise KeyError(name)
diff --git a/pylint/pyreverse/inspector.py b/pylint/pyreverse/inspector.py
index bba6d26c0..17ef46bff 100644
--- a/pylint/pyreverse/inspector.py
+++ b/pylint/pyreverse/inspector.py
@@ -261,7 +261,7 @@ class Linker(IdGeneratorMixIn, utils.LocalsVisitor):
if name[0] == "*":
continue
# analyze dependencies
- fullname = "%s.%s" % (basename, name[0])
+ fullname = "{}.{}".format(basename, name[0])
if fullname.find(".") > -1:
try:
fullname = modutils.get_module_part(fullname, context_file)
@@ -284,7 +284,7 @@ class Linker(IdGeneratorMixIn, utils.LocalsVisitor):
module = node.root()
context_name = module.name
if relative:
- mod_path = "%s.%s" % (".".join(context_name.split(".")[:-1]), mod_path)
+ mod_path = "{}.{}".format(".".join(context_name.split(".")[:-1]), mod_path)
if self.compute_module(context_name, mod_path):
# handle dependencies
if not hasattr(module, "depends"):
@@ -319,7 +319,7 @@ class Project:
return self.modules
def __repr__(self):
- return "<Project %r at %s (%s modules)>" % (
+ return "<Project {!r} at {} ({} modules)>".format(
self.name,
id(self),
len(self.modules),
diff --git a/pylint/pyreverse/vcgutils.py b/pylint/pyreverse/vcgutils.py
index 612769e28..36e82032a 100644
--- a/pylint/pyreverse/vcgutils.py
+++ b/pylint/pyreverse/vcgutils.py
@@ -174,7 +174,7 @@ class VCGPrinter:
def node(self, title, **args):
"""draw a node"""
- self._stream.write('%snode: {title:"%s"' % (self._indent, title))
+ self._stream.write(f'{self._indent}node: {{title:"{title}"')
self._write_attributes(NODE_ATTRS, **args)
self._stream.write("}\n")
@@ -202,11 +202,11 @@ possible attributes are %s"""
) from e
if not _type:
- self._stream.write('%s%s:"%s"\n' % (self._indent, key, value))
+ self._stream.write(f'{self._indent}{key}:"{value}"\n')
elif _type == 1:
- self._stream.write("%s%s:%s\n" % (self._indent, key, int(value)))
+ self._stream.write("{}{}:{}\n".format(self._indent, key, int(value)))
elif value in _type:
- self._stream.write("%s%s:%s\n" % (self._indent, key, value))
+ self._stream.write(f"{self._indent}{key}:{value}\n")
else:
raise Exception(
"""value %s isn\'t correct for attribute %s
diff --git a/pylint/pyreverse/writer.py b/pylint/pyreverse/writer.py
index b603ab16d..e9bd02aaf 100644
--- a/pylint/pyreverse/writer.py
+++ b/pylint/pyreverse/writer.py
@@ -31,7 +31,7 @@ class DiagramWriter:
"""write files for <project> according to <diadefs>"""
for diagram in diadefs:
basename = diagram.title.strip().replace(" ", "_")
- file_name = "%s.%s" % (basename, self.config.output_format)
+ file_name = f"{basename}.{self.config.output_format}"
self.set_printer(file_name, basename)
if diagram.TYPE == "class":
self.write_classes(diagram)
@@ -73,7 +73,7 @@ class DiagramWriter:
rel.from_object.fig_id,
rel.to_object.fig_id,
label=rel.name,
- **self.association_edges
+ **self.association_edges,
)
def set_printer(self, file_name, basename):
@@ -126,13 +126,13 @@ class DotWriter(DiagramWriter):
if obj.shape == "interface":
label = "«interface»\\n%s" % label
if not self.config.only_classnames:
- label = r"%s|%s\l|" % (label, r"\l".join(obj.attrs))
+ label = r"{}|{}\l|".format(label, r"\l".join(obj.attrs))
for func in obj.methods:
if func.args.args:
args = [arg.name for arg in func.args.args if arg.name != "self"]
else:
args = []
- label = r"%s%s(%s)\l" % (label, func.name, ", ".join(args))
+ label = r"{}{}({})\l".format(label, func.name, ", ".join(args))
label = "{%s}" % label
if is_exception(obj.node):
return dict(fontcolor="red", label=label, shape="record")
@@ -197,13 +197,13 @@ class VCGWriter(DiagramWriter):
# box width for UML like diagram
maxlen = max(len(name) for name in [obj.title] + methods + attrs)
line = "_" * (maxlen + 2)
- label = r"%s\n\f%s" % (label, line)
+ label = fr"{label}\n\f{line}"
for attr in attrs:
- label = r"%s\n\f08%s" % (label, attr)
+ label = fr"{label}\n\f08{attr}"
if attrs:
- label = r"%s\n\f%s" % (label, line)
+ label = fr"{label}\n\f{line}"
for func in methods:
- label = r"%s\n\f10%s()" % (label, func)
+ label = fr"{label}\n\f10{func}()"
return dict(label=label, shape=shape)
def close_graph(self):
diff --git a/pylint/reporters/text.py b/pylint/reporters/text.py
index 9321bac57..46fa0a9b8 100644
--- a/pylint/reporters/text.py
+++ b/pylint/reporters/text.py
@@ -116,7 +116,7 @@ def colorize_ansi(msg, color=None, style=None):
escape_code = _get_ansi_code(color, style)
# If invalid (or unknown) color, don't wrap msg with ansi codes
if escape_code:
- return "%s%s%s" % (escape_code, msg, ANSI_RESET)
+ return f"{escape_code}{msg}{ANSI_RESET}"
return msg
diff --git a/pylint/testutils/lint_module_test.py b/pylint/testutils/lint_module_test.py
index 2524f8c0e..5b9dc5c7a 100644
--- a/pylint/testutils/lint_module_test.py
+++ b/pylint/testutils/lint_module_test.py
@@ -70,7 +70,7 @@ class LintModuleTest:
)
def __str__(self):
- return "%s (%s.%s)" % (
+ return "{} ({}.{})".format(
self._test_file.base,
self.__class__.__module__,
self.__class__.__name__,
diff --git a/pylint/testutils/reporter_for_tests.py b/pylint/testutils/reporter_for_tests.py
index 33d94dee0..4343694a3 100644
--- a/pylint/testutils/reporter_for_tests.py
+++ b/pylint/testutils/reporter_for_tests.py
@@ -37,7 +37,7 @@ class GenericTestReporter(BaseReporter):
# 2to3 writes os.linesep instead of using
# the previously used line separators
msg = msg.replace("\r\n", "\n")
- self.messages.append("%s:%3s%s: %s" % (sigle, line, obj, msg))
+ self.messages.append(f"{sigle}:{line:>3}{obj}: {msg}")
def finalize(self):
self.messages.sort()
diff --git a/pylint/utils/pragma_parser.py b/pylint/utils/pragma_parser.py
index 2afbae5a3..1e180cddd 100644
--- a/pylint/utils/pragma_parser.py
+++ b/pylint/utils/pragma_parser.py
@@ -38,14 +38,14 @@ ALL_KEYWORDS = "|".join(
TOKEN_SPECIFICATION = [
- ("KEYWORD", r"\b({:s})\b".format(ALL_KEYWORDS)),
+ ("KEYWORD", fr"\b({ALL_KEYWORDS:s})\b"),
("MESSAGE_STRING", r"[0-9A-Za-z\-\_]{2,}"), #  Identifiers
("ASSIGN", r"="), #  Assignment operator
("MESSAGE_NUMBER", r"[CREIWF]{1}\d*"),
]
TOK_REGEX = "|".join(
- "(?P<{:s}>{:s})".format(token_name, token_rgx)
+ f"(?P<{token_name:s}>{token_rgx:s})"
for token_name, token_rgx in TOKEN_SPECIFICATION
)
diff --git a/pylint/utils/utils.py b/pylint/utils/utils.py
index b81807bc4..0f4e0f518 100644
--- a/pylint/utils/utils.py
+++ b/pylint/utils/utils.py
@@ -52,7 +52,7 @@ def get_module_and_frameid(node):
def get_rst_title(title, character):
"""Permit to get a title formatted as ReStructuredText test (underlined with a chosen character)."""
- return "%s\n%s\n" % (title, character * len(title))
+ return "{}\n{}\n".format(title, character * len(title))
def get_rst_section(section, options, doc=None):
@@ -258,9 +258,7 @@ def register_plugins(linter, directory):
# empty module name (usually emacs auto-save files)
continue
except ImportError as exc:
- print(
- "Problem importing module %s: %s" % (filename, exc), file=sys.stderr
- )
+ print(f"Problem importing module {filename}: {exc}", file=sys.stderr)
else:
if hasattr(module, "register"):
module.register(linter)
@@ -367,7 +365,7 @@ def _format_option_value(optdict, value):
if isinstance(value, (list, tuple)):
value = ",".join(_format_option_value(optdict, item) for item in value)
elif isinstance(value, dict):
- value = ",".join("%s:%s" % (k, v) for k, v in value.items())
+ value = ",".join(f"{k}:{v}" for k, v in value.items())
elif hasattr(value, "match"): # optdict.get('type') == 'regexp'
# compiled regexp
value = value.pattern
@@ -406,7 +404,7 @@ def _ini_format(stream, options):
value = separator.join(x + "," for x in str(value).split(","))
# remove trailing ',' from last element of the list
value = value[:-1]
- print("%s=%s" % (optname, value), file=stream)
+ print(f"{optname}={value}", file=stream)
class IsortDriver:
diff --git a/setup.py b/setup.py
index 94198a01a..1b3a3c07c 100644
--- a/setup.py
+++ b/setup.py
@@ -94,7 +94,7 @@ def get_packages(directory, prefix):
if isdir(absfile):
if exists(join(absfile, "__init__.py")):
if prefix:
- result.append("%s.%s" % (prefix, package))
+ result.append(f"{prefix}.{package}")
else:
result.append(package)
result += get_packages(absfile, result[-1])
@@ -159,7 +159,7 @@ def install(**kwargs):
setup_requires=pytest_runner,
tests_require=["pytest", "pytest-benchmark"],
project_urls=project_urls,
- **kwargs
+ **kwargs,
)
diff --git a/tests/checkers/unittest_python3.py b/tests/checkers/unittest_python3.py
index 70456b756..75d6da7b6 100644
--- a/tests/checkers/unittest_python3.py
+++ b/tests/checkers/unittest_python3.py
@@ -285,7 +285,7 @@ class TestPython3Checker(testutils.CheckerTestCase):
non_iterating_code = ["x = __({}())", "__({}())[0]"]
for method in ("keys", "items", "values"):
- dict_method = "{{}}.{}".format(method)
+ dict_method = f"{{}}.{method}"
for code in iterating_code:
with_value = code.format(dict_method)
diff --git a/tests/test_func.py b/tests/test_func.py
index e10aa4fa7..4670274c6 100644
--- a/tests/test_func.py
+++ b/tests/test_func.py
@@ -38,7 +38,7 @@ INFO_TEST_RGX = re.compile(r"^func_i\d\d\d\d$")
def exception_str(self, ex): # pylint: disable=unused-argument
"""function used to replace default __str__ method of exception instances"""
- return "in %s\n:: %s" % (ex.file, ", ".join(ex.args))
+ return "in {}\n:: {}".format(ex.file, ", ".join(ex.args))
class LintTestUsingModule:
diff --git a/tests/test_self.py b/tests/test_self.py
index 63f3d9fed..6a6552ffc 100644
--- a/tests/test_self.py
+++ b/tests/test_self.py
@@ -124,9 +124,9 @@ class TestRunTC:
output = out.getvalue()
else:
output = None
- msg = "expected output status %s, got %s" % (code, pylint_code)
+ msg = f"expected output status {code}, got {pylint_code}"
if output is not None:
- msg = "%s. Below pylint output: \n%s" % (msg, output)
+ msg = f"{msg}. Below pylint output: \n{output}"
assert pylint_code == code, msg
@staticmethod
diff --git a/tests/unittest_pyreverse_writer.py b/tests/unittest_pyreverse_writer.py
index 90fbcbe55..20f128574 100644
--- a/tests/unittest_pyreverse_writer.py
+++ b/tests/unittest_pyreverse_writer.py
@@ -105,8 +105,8 @@ def test_dot_files(generated_file):
expected = _file_lines(expected_file)
generated = "\n".join(generated)
expected = "\n".join(expected)
- files = "\n *** expected : %s, generated : %s \n" % (expected_file, generated_file)
- assert expected == generated, "%s%s" % (
+ files = f"\n *** expected : {expected_file}, generated : {generated_file} \n"
+ assert expected == generated, "{}{}".format(
files,
"\n".join(
line for line in unified_diff(expected.splitlines(), generated.splitlines())
@@ -130,7 +130,7 @@ def test_dot_files(generated_file):
def test_get_visibility(names, expected):
for name in names:
got = get_visibility(name)
- assert got == expected, "got %s instead of %s for value %s" % (
+ assert got == expected, "got {} instead of {} for value {}".format(
got,
expected,
name,