diff options
author | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-02-21 13:27:11 +0100 |
---|---|---|
committer | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-02-21 15:36:16 +0100 |
commit | 5bed07eba999130b6551acc7c43192d6a8eada43 (patch) | |
tree | 09e3a11503bd074363556e8a5fd33fc0e8db7fc4 | |
parent | a1e553d3bb07c56ca99c31279f9af104bede0a32 (diff) | |
download | pylint-git-5bed07eba999130b6551acc7c43192d6a8eada43.tar.gz |
Move from % string formatting syntax to f-string or .format()
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: @@ -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, |