From 400f8d7fdf3ec4c58342564d60adb1b48cb06e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Mon, 13 Sep 2021 21:46:36 +0200 Subject: [PATCH 1/8] Make ``consider-iterating-dictionary`` consider memb. check This closes #4069 --- ChangeLog | 4 +++ doc/whatsnew/2.11.rst | 4 +++ .../refactoring/recommendation_checker.py | 13 +++++--- .../consider/consider_iterating_dictionary.py | 20 +++++++++++- .../consider_iterating_dictionary.txt | 32 ++++++++++--------- 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6134fca00f..76042ca902 100644 --- a/ChangeLog +++ b/ChangeLog @@ -93,6 +93,10 @@ Release date: TBA Closes #4616 +* The ``consider-iterating-dictionary`` checker now also considers membership checks + + Closes #4069 + What's New in Pylint 2.10.3? ============================ diff --git a/doc/whatsnew/2.11.rst b/doc/whatsnew/2.11.rst index 6ace2f633d..0a239025f3 100644 --- a/doc/whatsnew/2.11.rst +++ b/doc/whatsnew/2.11.rst @@ -85,3 +85,7 @@ Other Changes Closes #1375 Closes #330 + +* The ``consider-iterating-dictionary`` checker now also considers membership checks + + Closes #4069 diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index 5982a0ec65..97d1704fa1 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -26,7 +26,7 @@ class RecommendationChecker(checkers.BaseChecker): "consider-iterating-dictionary", "Emitted when the keys of a dictionary are iterated through the .keys() " "method. It is enough to just iterate through the dictionary itself, as " - 'in "for key in dictionary".', + 'in "for key in dictionary" or "if key in dictionary".', ), "C0206": ( "Consider iterating with .items()", @@ -75,7 +75,13 @@ def _check_consider_iterating_dictionary(self, node: nodes.Call) -> None: return if node.func.attrname != "keys": return - if not isinstance(node.parent, (nodes.For, nodes.Comprehension)): + if not ( + isinstance(node.parent, (nodes.For, nodes.Comprehension)) + or ( + isinstance(node.parent, nodes.Compare) + and isinstance(node.parent.parent, nodes.If) + ) + ): return inferred = utils.safe_infer(node.func) @@ -84,8 +90,7 @@ def _check_consider_iterating_dictionary(self, node: nodes.Call) -> None: ): return - if isinstance(node.parent, (nodes.For, nodes.Comprehension)): - self.add_message("consider-iterating-dictionary", node=node) + self.add_message("consider-iterating-dictionary", node=node) def _check_use_maxsplit_arg(self, node: nodes.Call) -> None: """Add message when accessing first or last elements of a str.split() or str.rsplit().""" diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index 1198de1cb5..a4eab92b29 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -1,4 +1,4 @@ -# pylint: disable=missing-docstring, expression-not-assigned, too-few-public-methods, no-member, import-error, no-self-use, line-too-long, useless-object-inheritance, unnecessary-comprehension +# pylint: disable=missing-docstring, expression-not-assigned, too-few-public-methods, no-member, import-error, no-self-use, line-too-long, useless-object-inheritance, unnecessary-comprehension, use-dict-literal from unknown import Unknown @@ -36,3 +36,21 @@ def keys(self): COMP1 = [k * 2 for k in DICT.keys()] + [k * 3 for k in DICT.keys()] # [consider-iterating-dictionary,consider-iterating-dictionary] COMP2, COMP3 = [k * 2 for k in DICT.keys()], [k * 3 for k in DICT.keys()] # [consider-iterating-dictionary,consider-iterating-dictionary] SOME_TUPLE = ([k * 2 for k in DICT.keys()], [k * 3 for k in DICT.keys()]) # [consider-iterating-dictionary,consider-iterating-dictionary] + +# Checks for membership checks +if 1 in dict().keys(): # [consider-iterating-dictionary] + pass +if 1 in {}.keys(): # [consider-iterating-dictionary] + pass +if 1 in Unknown().keys(): + pass +if 1 in Unknown.keys(): + pass +if 1 in CustomClass().keys(): + pass +if 1 in dict(): + pass +if 1 in dict().values(): + pass +if (1, 1) in dict().items(): + pass diff --git a/tests/functional/c/consider/consider_iterating_dictionary.txt b/tests/functional/c/consider/consider_iterating_dictionary.txt index c1b12f976c..4332dd2a28 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.txt +++ b/tests/functional/c/consider/consider_iterating_dictionary.txt @@ -1,15 +1,17 @@ -consider-iterating-dictionary:23:16::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:24:16::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:25:16::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:26:21::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:27:24::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:28:24::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:29:24::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:30:29::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:31:11::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:36:24::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:36:55::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:37:31::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:37:61::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:38:30::Consider iterating the dictionary directly instead of calling .keys() -consider-iterating-dictionary:38:60::Consider iterating the dictionary directly instead of calling .keys() +consider-iterating-dictionary:23:16::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:24:16::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:25:16::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:26:21::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:27:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:28:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:29:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:30:29::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:31:11::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:36:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:36:55::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:37:31::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:37:61::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:38:30::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:38:60::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:41:8::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:43:8::Consider iterating the dictionary directly instead of calling .keys():HIGH From 82cd6dcf4a4e2ef44c31c853822bc27431d8b50c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 09:05:18 +0200 Subject: [PATCH 2/8] Add additional tests and use-cases --- .../refactoring/recommendation_checker.py | 28 +++++++++---------- .../consider/consider_iterating_dictionary.py | 9 ++++++ .../consider_iterating_dictionary.txt | 2 ++ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index 97d1704fa1..d21d1647b4 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -25,8 +25,10 @@ class RecommendationChecker(checkers.BaseChecker): "Consider iterating the dictionary directly instead of calling .keys()", "consider-iterating-dictionary", "Emitted when the keys of a dictionary are iterated through the .keys() " - "method. It is enough to just iterate through the dictionary itself, as " - 'in "for key in dictionary" or "if key in dictionary".', + "method or when .keys() is used for a membership check. " + "It is enough to just iterate through the dictionary itself, as " + 'in "for key in dictionary". For membership checks ' + '("if key in dictionary") this is actually faster.', ), "C0206": ( "Consider iterating with .items()", @@ -75,22 +77,18 @@ def _check_consider_iterating_dictionary(self, node: nodes.Call) -> None: return if node.func.attrname != "keys": return - if not ( + if ( isinstance(node.parent, (nodes.For, nodes.Comprehension)) - or ( - isinstance(node.parent, nodes.Compare) - and isinstance(node.parent.parent, nodes.If) - ) - ): - return - - inferred = utils.safe_infer(node.func) - if not isinstance(inferred, astroid.BoundMethod) or not isinstance( - inferred.bound, nodes.Dict + or isinstance(node.parent, nodes.Compare) + and any(op for op, _ in node.parent.ops if op in {"in", "==", "is"}) ): - return + inferred = utils.safe_infer(node.func) + if not isinstance(inferred, astroid.BoundMethod) or not isinstance( + inferred.bound, nodes.Dict + ): + return - self.add_message("consider-iterating-dictionary", node=node) + self.add_message("consider-iterating-dictionary", node=node) def _check_use_maxsplit_arg(self, node: nodes.Call) -> None: """Add message when accessing first or last elements of a str.split() or str.rsplit().""" diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index a4eab92b29..6f33eda93a 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -54,3 +54,12 @@ def keys(self): pass if (1, 1) in dict().items(): pass +if [1] == {}.keys(): # [consider-iterating-dictionary] + pass +if [1] == {}: + pass +if [1] == dict(): + pass +var = 1 in {}.keys() # [consider-iterating-dictionary] +var = 1 in {} +var = 1 in dict() diff --git a/tests/functional/c/consider/consider_iterating_dictionary.txt b/tests/functional/c/consider/consider_iterating_dictionary.txt index 4332dd2a28..ddbbc353c9 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.txt +++ b/tests/functional/c/consider/consider_iterating_dictionary.txt @@ -15,3 +15,5 @@ consider-iterating-dictionary:38:30::Consider iterating the dictionary directly consider-iterating-dictionary:38:60::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:41:8::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:43:8::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:57:10::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:63:11::Consider iterating the dictionary directly instead of calling .keys():HIGH From 0b40b493a5bd669e3ec1253017db492e9f8e3217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 09:15:20 +0200 Subject: [PATCH 3/8] Split pylint disable's --- .../consider/consider_iterating_dictionary.py | 4 ++- .../consider_iterating_dictionary.txt | 32 +++++++++---------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index 6f33eda93a..d5baaccc47 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -1,4 +1,6 @@ -# pylint: disable=missing-docstring, expression-not-assigned, too-few-public-methods, no-member, import-error, no-self-use, line-too-long, useless-object-inheritance, unnecessary-comprehension, use-dict-literal +# pylint: disable=missing-docstring, expression-not-assigned, too-few-public-methods +# pylint: disable=no-member, import-error, no-self-use, line-too-long, useless-object-inheritance +# pylint: disable=unnecessary-comprehension, use-dict-literal from unknown import Unknown diff --git a/tests/functional/c/consider/consider_iterating_dictionary.txt b/tests/functional/c/consider/consider_iterating_dictionary.txt index ddbbc353c9..846e705c3e 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.txt +++ b/tests/functional/c/consider/consider_iterating_dictionary.txt @@ -1,19 +1,19 @@ -consider-iterating-dictionary:23:16::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:24:16::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:25:16::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:26:21::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:27:24::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:28:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:26:16::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:27:16::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:28:21::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:29:24::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:30:29::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:31:11::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:36:24::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:36:55::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:37:31::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:37:61::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:38:30::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:38:60::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:41:8::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:30:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:31:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:32:29::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:33:11::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:38:24::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:38:55::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:39:31::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:39:61::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:40:30::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:40:60::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:43:8::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:57:10::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:63:11::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:45:8::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:59:10::Consider iterating the dictionary directly instead of calling .keys():HIGH +consider-iterating-dictionary:65:11::Consider iterating the dictionary directly instead of calling .keys():HIGH From 556d6276525186c26584112204a112d15c9deaef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 14:10:53 +0200 Subject: [PATCH 4/8] Code review --- pylint/checkers/refactoring/recommendation_checker.py | 2 +- tests/functional/c/consider/consider_iterating_dictionary.py | 2 +- tests/functional/c/consider/consider_iterating_dictionary.txt | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index d21d1647b4..23d0d9e9a0 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -80,7 +80,7 @@ def _check_consider_iterating_dictionary(self, node: nodes.Call) -> None: if ( isinstance(node.parent, (nodes.For, nodes.Comprehension)) or isinstance(node.parent, nodes.Compare) - and any(op for op, _ in node.parent.ops if op in {"in", "==", "is"}) + and any(op for op, _ in node.parent.ops if op == "in") ): inferred = utils.safe_infer(node.func) if not isinstance(inferred, astroid.BoundMethod) or not isinstance( diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index d5baaccc47..c23f73c8dd 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -56,7 +56,7 @@ def keys(self): pass if (1, 1) in dict().items(): pass -if [1] == {}.keys(): # [consider-iterating-dictionary] +if [1] == {}.keys(): pass if [1] == {}: pass diff --git a/tests/functional/c/consider/consider_iterating_dictionary.txt b/tests/functional/c/consider/consider_iterating_dictionary.txt index 846e705c3e..a3ebbac2a7 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.txt +++ b/tests/functional/c/consider/consider_iterating_dictionary.txt @@ -15,5 +15,4 @@ consider-iterating-dictionary:40:30::Consider iterating the dictionary directly consider-iterating-dictionary:40:60::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:43:8::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:45:8::Consider iterating the dictionary directly instead of calling .keys():HIGH -consider-iterating-dictionary:59:10::Consider iterating the dictionary directly instead of calling .keys():HIGH consider-iterating-dictionary:65:11::Consider iterating the dictionary directly instead of calling .keys():HIGH From 46ade44d203b0e57e027408b36bff6eafb58885f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 14:51:30 +0200 Subject: [PATCH 5/8] Change var name to uppercase --- .../functional/c/consider/consider_iterating_dictionary.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index c23f73c8dd..4751cdd825 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -62,6 +62,6 @@ def keys(self): pass if [1] == dict(): pass -var = 1 in {}.keys() # [consider-iterating-dictionary] -var = 1 in {} -var = 1 in dict() +VAR = 1 in {}.keys() # [consider-iterating-dictionary] +VAR = 1 in {} +VAR = 1 in dict() From 6a77424f2ed04aa5a924ef5e2c2a588412f71314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:33:57 +0200 Subject: [PATCH 6/8] Add additional check and test --- pylint/checkers/refactoring/recommendation_checker.py | 6 +++++- .../functional/c/consider/consider_iterating_dictionary.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index 23d0d9e9a0..b08aaaef98 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -80,7 +80,11 @@ def _check_consider_iterating_dictionary(self, node: nodes.Call) -> None: if ( isinstance(node.parent, (nodes.For, nodes.Comprehension)) or isinstance(node.parent, nodes.Compare) - and any(op for op, _ in node.parent.ops if op == "in") + and any( + op + for op, comparator in node.parent.ops + if op == "in" and comparator is node + ) ): inferred = utils.safe_infer(node.func) if not isinstance(inferred, astroid.BoundMethod) or not isinstance( diff --git a/tests/functional/c/consider/consider_iterating_dictionary.py b/tests/functional/c/consider/consider_iterating_dictionary.py index 4751cdd825..996fa54291 100644 --- a/tests/functional/c/consider/consider_iterating_dictionary.py +++ b/tests/functional/c/consider/consider_iterating_dictionary.py @@ -65,3 +65,4 @@ def keys(self): VAR = 1 in {}.keys() # [consider-iterating-dictionary] VAR = 1 in {} VAR = 1 in dict() +VAR = [1, 2] == {}.keys() in {False} From aae8afcb4d3dc084352cf8c461a3bbb15a77b112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:34:33 +0200 Subject: [PATCH 7/8] Update pylint/checkers/refactoring/recommendation_checker.py Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com> --- pylint/checkers/refactoring/recommendation_checker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index b08aaaef98..4ce7b0ae8b 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -27,8 +27,8 @@ class RecommendationChecker(checkers.BaseChecker): "Emitted when the keys of a dictionary are iterated through the .keys() " "method or when .keys() is used for a membership check. " "It is enough to just iterate through the dictionary itself, as " - 'in "for key in dictionary". For membership checks ' - '("if key in dictionary") this is actually faster.', + "in ``for key in dictionary``. For membership checks, " + "``if key in dictionary``, is faster.", ), "C0206": ( "Consider iterating with .items()", From d8bf54c02ff958737e6ec132c43bdfea01091647 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:42:29 +0200 Subject: [PATCH 8/8] Doc cleanup --- pylint/checkers/refactoring/recommendation_checker.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index 4ce7b0ae8b..a765eca013 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -24,11 +24,11 @@ class RecommendationChecker(checkers.BaseChecker): "C0201": ( "Consider iterating the dictionary directly instead of calling .keys()", "consider-iterating-dictionary", - "Emitted when the keys of a dictionary are iterated through the .keys() " - "method or when .keys() is used for a membership check. " - "It is enough to just iterate through the dictionary itself, as " - "in ``for key in dictionary``. For membership checks, " - "``if key in dictionary``, is faster.", + "Emitted when the keys of a dictionary are iterated through the ``.keys()`` " + "method or when ``.keys()`` is used for a membership check. " + "It is enough to iterate through the dictionary itself, " + "``for key in dictionary``. For membership checks, " + "``if key in dictionary`` is faster.", ), "C0206": ( "Consider iterating with .items()",