From 29b37059e7ccce9e410da466090070d002c1fdab Mon Sep 17 00:00:00 2001 From: Pang Yu Shao Date: Wed, 12 May 2021 16:13:03 +0800 Subject: [PATCH] Improved help text for ``consider-using-str-partition`` --- .../refactoring/recommendation_checker.py | 29 ++++++++++--- .../consider/consider_using_str_partition.txt | 42 +++++++++---------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/pylint/checkers/refactoring/recommendation_checker.py b/pylint/checkers/refactoring/recommendation_checker.py index 5540986f2dd..af7993dc4ea 100644 --- a/pylint/checkers/refactoring/recommendation_checker.py +++ b/pylint/checkers/refactoring/recommendation_checker.py @@ -1,5 +1,6 @@ # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/master/LICENSE +import re from typing import cast import astroid @@ -36,7 +37,7 @@ class RecommendationChecker(checkers.BaseChecker): "method of the dictionary instead.", ), "C0207": ( - "Consider using str.partition()", + "Consider using %s[%d] instead", "consider-using-str-partition", "Emitted when accessing only the first or last element of a str.split(sep). " "The first and last element can be accessed by using str.partition(sep)[0] " @@ -258,9 +259,21 @@ def visit_subscript(self, node: astroid.Subscript) -> None: if isinstance(value, (astroid.UnaryOp, astroid.Const)): const = utils.safe_infer(value) const = cast(astroid.Const, const) - if const.value in [-1, 0]: - self.add_message("consider-using-str-partition", node=node) - + p = re.compile(r"r*split") + if const.value == -1: + help_text = p.sub("rpartition", subscripted_object.as_string()) + self.add_message( + "consider-using-str-partition", + node=node, + args=(help_text, -1), + ) + elif const.value == 0: + help_text = p.sub("partition", subscripted_object.as_string()) + self.add_message( + "consider-using-str-partition", + node=node, + args=(help_text, 0), + ) # Check if subscript is len(split) - 1 if ( isinstance(value, astroid.BinOp) @@ -281,4 +294,10 @@ def visit_subscript(self, node: astroid.Subscript) -> None: # Further check for argument within len(), and compare that to object being split arg_within_len = value.left.args[0].name if arg_within_len == node.value.name: - self.add_message("consider-using-str-partition", node=node) + p = re.compile(r"r*split") + help_text = p.sub("rpartition", subscripted_object.as_string()) + self.add_message( + "consider-using-str-partition", + node=node, + args=(help_text, -1), + ) diff --git a/tests/functional/c/consider/consider_using_str_partition.txt b/tests/functional/c/consider/consider_using_str_partition.txt index ebc34c9f356..a6e3f4e39a7 100644 --- a/tests/functional/c/consider/consider_using_str_partition.txt +++ b/tests/functional/c/consider/consider_using_str_partition.txt @@ -1,21 +1,21 @@ -consider-using-str-partition:7:12::Consider using str.partition() -consider-using-str-partition:8:11::Consider using str.partition() -consider-using-str-partition:9:12::Consider using str.partition() -consider-using-str-partition:10:11::Consider using str.partition() -consider-using-str-partition:17:12::Consider using str.partition() -consider-using-str-partition:18:11::Consider using str.partition() -consider-using-str-partition:19:11::Consider using str.partition() -consider-using-str-partition:22:12::Consider using str.partition() -consider-using-str-partition:23:11::Consider using str.partition() -consider-using-str-partition:24:11::Consider using str.partition() -consider-using-str-partition:26:6::Consider using str.partition() -consider-using-str-partition:26:17::Consider using str.partition() -consider-using-str-partition:43:12::Consider using str.partition() -consider-using-str-partition:44:11::Consider using str.partition() -consider-using-str-partition:45:12::Consider using str.partition() -consider-using-str-partition:46:11::Consider using str.partition() -consider-using-str-partition:52:12::Consider using str.partition() -consider-using-str-partition:53:11::Consider using str.partition() -consider-using-str-partition:54:11::Consider using str.partition() -consider-using-str-partition:58:12::Consider using str.partition() -consider-using-str-partition:59:11::Consider using str.partition() +consider-using-str-partition:7:12::Consider using SEQ.partition(',')[0] instead +consider-using-str-partition:8:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:9:12::Consider using SEQ.partition(',')[0] instead +consider-using-str-partition:10:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:17:12::Consider using SEQ.partition(',')[0] instead +consider-using-str-partition:18:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:19:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:22:12::Consider using SEQ.partition(',')[0] instead +consider-using-str-partition:23:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:24:11::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:26:6::Consider using SEQ.partition(',')[0] instead +consider-using-str-partition:26:17::Consider using SEQ.rpartition(',')[-1] instead +consider-using-str-partition:43:12::Consider using Foo.class_str.partition(',')[0] instead +consider-using-str-partition:44:11::Consider using Foo.class_str.rpartition(',')[-1] instead +consider-using-str-partition:45:12::Consider using Foo.class_str.partition(',')[0] instead +consider-using-str-partition:46:11::Consider using Foo.class_str.rpartition(',')[-1] instead +consider-using-str-partition:52:12::Consider using Foo.class_str.partition(',')[0] instead +consider-using-str-partition:53:11::Consider using Foo.class_str.rpartition(',')[-1] instead +consider-using-str-partition:54:11::Consider using Foo.class_str.rpartition(',')[-1] instead +consider-using-str-partition:58:12::Consider using bar.get_string().partition(',')[0] instead +consider-using-str-partition:59:11::Consider using bar.get_string().rpartition(',')[-1] instead