Skip to content

Commit f5f9e26

Browse files
[implicit_booleaness_checker] Add the confidence to related messages (#7721)
First step prior doing #6870 in order to make it more reviewable.
1 parent 60a2db2 commit f5f9e26

File tree

8 files changed

+105
-91
lines changed

8 files changed

+105
-91
lines changed

.pyenchant_pylint_custom_dict.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ bla
3131
bom
3232
bool
3333
boolean
34+
booleaness
3435
boolop
3536
boundmethod
3637
builtins
@@ -106,6 +107,7 @@ epytext
106107
erroring
107108
etree
108109
expr
110+
falsey
109111
favour
110112
filepath
111113
filestream
@@ -326,6 +328,7 @@ toplevel
326328
towncrier
327329
tp
328330
truthness
331+
truthey
329332
tryexcept
330333
txt
331334
typecheck

pylint/checkers/refactoring/implicit_booleaness_checker.py

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from pylint import checkers
1111
from pylint.checkers import utils
12+
from pylint.interfaces import HIGH, INFERENCE
1213

1314

1415
class ImplicitBooleanessChecker(checkers.BaseChecker):
@@ -99,7 +100,11 @@ def visit_call(self, node: nodes.Call) -> None:
99100
)
100101
if isinstance(len_arg, generator_or_comprehension):
101102
# The node is a generator or comprehension as in len([x for x in ...])
102-
self.add_message("use-implicit-booleaness-not-len", node=node)
103+
self.add_message(
104+
"use-implicit-booleaness-not-len",
105+
node=node,
106+
confidence=HIGH,
107+
)
103108
return
104109
try:
105110
instance = next(len_arg.infer())
@@ -113,7 +118,11 @@ def visit_call(self, node: nodes.Call) -> None:
113118
if "range" in mother_classes or (
114119
affected_by_pep8 and not self.instance_has_bool(instance)
115120
):
116-
self.add_message("use-implicit-booleaness-not-len", node=node)
121+
self.add_message(
122+
"use-implicit-booleaness-not-len",
123+
node=node,
124+
confidence=INFERENCE,
125+
)
117126

118127
@staticmethod
119128
def instance_has_bool(class_def: nodes.ClassDef) -> bool:
@@ -134,7 +143,9 @@ def visit_unaryop(self, node: nodes.UnaryOp) -> None:
134143
and node.op == "not"
135144
and utils.is_call_of_name(node.operand, "len")
136145
):
137-
self.add_message("use-implicit-booleaness-not-len", node=node)
146+
self.add_message(
147+
"use-implicit-booleaness-not-len", node=node, confidence=HIGH
148+
)
138149

139150
@utils.only_required_for_messages("use-implicit-booleaness-not-comparison")
140151
def visit_compare(self, node: nodes.Compare) -> None:
@@ -177,35 +188,33 @@ def _check_use_implicit_booleaness_not_comparison(
177188

178189
# No need to check for operator when visiting compare node
179190
if operator in {"==", "!=", ">=", ">", "<=", "<"}:
180-
collection_literal = "{}"
181-
if isinstance(literal_node, nodes.List):
182-
collection_literal = "[]"
183-
if isinstance(literal_node, nodes.Tuple):
184-
collection_literal = "()"
185-
186-
instance_name = "x"
187-
if isinstance(target_node, nodes.Call) and target_node.func:
188-
instance_name = f"{target_node.func.as_string()}(...)"
189-
elif isinstance(target_node, (nodes.Attribute, nodes.Name)):
190-
instance_name = target_node.as_string()
191-
192-
original_comparison = (
193-
f"{instance_name} {operator} {collection_literal}"
194-
)
195-
suggestion = (
196-
f"{instance_name}"
197-
if operator == "!="
198-
else f"not {instance_name}"
199-
)
200191
self.add_message(
201192
"use-implicit-booleaness-not-comparison",
202-
args=(
203-
original_comparison,
204-
suggestion,
193+
args=self._implicit_booleaness_message_args(
194+
literal_node, operator, target_node
205195
),
206196
node=node,
197+
confidence=HIGH,
207198
)
208199

200+
def _implicit_booleaness_message_args(
201+
self, literal_node: nodes.NodeNG, operator: str, target_node: nodes.NodeNG
202+
) -> tuple[str, str]:
203+
"""Helper to get the right message for "use-implicit-booleaness-not-comparison"."""
204+
collection_literal = "{}"
205+
if isinstance(literal_node, nodes.List):
206+
collection_literal = "[]"
207+
if isinstance(literal_node, nodes.Tuple):
208+
collection_literal = "()"
209+
instance_name = "x"
210+
if isinstance(target_node, nodes.Call) and target_node.func:
211+
instance_name = f"{target_node.func.as_string()}(...)"
212+
elif isinstance(target_node, (nodes.Attribute, nodes.Name)):
213+
instance_name = target_node.as_string()
214+
original_comparison = f"{instance_name} {operator} {collection_literal}"
215+
suggestion = f"{instance_name}" if operator == "!=" else f"not {instance_name}"
216+
return original_comparison, suggestion
217+
209218
@staticmethod
210219
def base_names_of_instance(node: bases.Uninferable | bases.Instance) -> list[str]:
211220
"""Return all names inherited by a class instance or those returned by a

pylint/extensions/comparetozero.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from pylint import checkers
1616
from pylint.checkers import utils
17+
from pylint.interfaces import HIGH
1718

1819
if TYPE_CHECKING:
1920
from pylint.lint import PyLinter
@@ -70,7 +71,7 @@ def visit_compare(self, node: nodes.Compare) -> None:
7071
error_detected = True
7172

7273
if error_detected:
73-
self.add_message("compare-to-zero", node=node)
74+
self.add_message("compare-to-zero", node=node, confidence=HIGH)
7475

7576

7677
def register(linter: PyLinter) -> None:

pylint/extensions/emptystring.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from pylint import checkers
1515
from pylint.checkers import utils
16+
from pylint.interfaces import HIGH
1617

1718
if TYPE_CHECKING:
1819
from pylint.lint import PyLinter
@@ -64,7 +65,7 @@ def visit_compare(self, node: nodes.Compare) -> None:
6465
error_detected = True
6566

6667
if error_detected:
67-
self.add_message("compare-to-empty-string", node=node)
68+
self.add_message("compare-to-empty-string", node=node, confidence=HIGH)
6869

6970

7071
def register(linter: PyLinter) -> None:
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
compare-to-zero:6:3:6:9::Avoid comparisons to zero:UNDEFINED
2-
compare-to-zero:9:3:9:13::Avoid comparisons to zero:UNDEFINED
3-
compare-to-zero:12:3:12:9::Avoid comparisons to zero:UNDEFINED
4-
compare-to-zero:15:3:15:9::Avoid comparisons to zero:UNDEFINED
1+
compare-to-zero:6:3:6:9::Avoid comparisons to zero:HIGH
2+
compare-to-zero:9:3:9:13::Avoid comparisons to zero:HIGH
3+
compare-to-zero:12:3:12:9::Avoid comparisons to zero:HIGH
4+
compare-to-zero:15:3:15:9::Avoid comparisons to zero:HIGH
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
compare-to-empty-string:6:3:6:10::Avoid comparisons to empty string:UNDEFINED
2-
compare-to-empty-string:9:3:9:14::Avoid comparisons to empty string:UNDEFINED
3-
compare-to-empty-string:12:3:12:10::Avoid comparisons to empty string:UNDEFINED
4-
compare-to-empty-string:15:3:15:10::Avoid comparisons to empty string:UNDEFINED
1+
compare-to-empty-string:6:3:6:10::Avoid comparisons to empty string:HIGH
2+
compare-to-empty-string:9:3:9:14::Avoid comparisons to empty string:HIGH
3+
compare-to-empty-string:12:3:12:10::Avoid comparisons to empty string:HIGH
4+
compare-to-empty-string:15:3:15:10::Avoid comparisons to empty string:HIGH
Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
use-implicit-booleaness-not-comparison:14:7:14:21:github_issue_4774:'bad_list == []' can be simplified to 'not bad_list' as an empty sequence is falsey:UNDEFINED
2-
use-implicit-booleaness-not-comparison:22:3:22:20::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:UNDEFINED
3-
use-implicit-booleaness-not-comparison:25:3:25:19::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:UNDEFINED
4-
use-implicit-booleaness-not-comparison:28:3:28:19::'empty_dict == {}' can be simplified to 'not empty_dict' as an empty sequence is falsey:UNDEFINED
5-
use-implicit-booleaness-not-comparison:31:3:31:20::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:UNDEFINED
6-
use-implicit-booleaness-not-comparison:34:3:34:19::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:UNDEFINED
7-
use-implicit-booleaness-not-comparison:37:3:37:19::'empty_dict == {}' can be simplified to 'not empty_dict' as an empty sequence is falsey:UNDEFINED
8-
use-implicit-booleaness-not-comparison:42:11:42:18:bad_tuple_return:'t == ()' can be simplified to 'not t' as an empty sequence is falsey:UNDEFINED
9-
use-implicit-booleaness-not-comparison:46:11:46:18:bad_list_return:'b == []' can be simplified to 'not b' as an empty sequence is falsey:UNDEFINED
10-
use-implicit-booleaness-not-comparison:50:11:50:18:bad_dict_return:'c == {}' can be simplified to 'not c' as an empty sequence is falsey:UNDEFINED
11-
use-implicit-booleaness-not-comparison:52:7:52:24::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:UNDEFINED
12-
use-implicit-booleaness-not-comparison:53:7:53:23::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:UNDEFINED
13-
use-implicit-booleaness-not-comparison:54:7:54:23::'empty_dict != {}' can be simplified to 'empty_dict' as an empty sequence is falsey:UNDEFINED
14-
use-implicit-booleaness-not-comparison:55:7:55:23::'empty_tuple < ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:UNDEFINED
15-
use-implicit-booleaness-not-comparison:56:7:56:23::'empty_list <= []' can be simplified to 'not empty_list' as an empty sequence is falsey:UNDEFINED
16-
use-implicit-booleaness-not-comparison:57:7:57:23::'empty_tuple > ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:UNDEFINED
17-
use-implicit-booleaness-not-comparison:58:7:58:23::'empty_list >= []' can be simplified to 'not empty_list' as an empty sequence is falsey:UNDEFINED
18-
use-implicit-booleaness-not-comparison:83:3:83:10::'a == []' can be simplified to 'not a' as an empty sequence is falsey:UNDEFINED
19-
use-implicit-booleaness-not-comparison:95:3:95:10::'e == []' can be simplified to 'not e' as an empty sequence is falsey:UNDEFINED
20-
use-implicit-booleaness-not-comparison:95:15:95:22::'f == {}' can be simplified to 'not f' as an empty sequence is falsey:UNDEFINED
21-
use-implicit-booleaness-not-comparison:133:3:133:14::'A.lst == []' can be simplified to 'not A.lst' as an empty sequence is falsey:UNDEFINED
22-
use-implicit-booleaness-not-comparison:137:3:137:14::'A.lst == []' can be simplified to 'not A.lst' as an empty sequence is falsey:UNDEFINED
23-
use-implicit-booleaness-not-comparison:141:3:141:20::'A.test(...) == []' can be simplified to 'not A.test(...)' as an empty sequence is falsey:UNDEFINED
24-
use-implicit-booleaness-not-comparison:149:3:149:24::'test_function(...) == []' can be simplified to 'not test_function(...)' as an empty sequence is falsey:UNDEFINED
25-
use-implicit-booleaness-not-comparison:156:3:156:20::'numpy_array == []' can be simplified to 'not numpy_array' as an empty sequence is falsey:UNDEFINED
26-
use-implicit-booleaness-not-comparison:158:3:158:20::'numpy_array != []' can be simplified to 'numpy_array' as an empty sequence is falsey:UNDEFINED
27-
use-implicit-booleaness-not-comparison:160:3:160:20::'numpy_array >= ()' can be simplified to 'not numpy_array' as an empty sequence is falsey:UNDEFINED
28-
use-implicit-booleaness-not-comparison:185:3:185:13::'data == {}' can be simplified to 'not data' as an empty sequence is falsey:UNDEFINED
29-
use-implicit-booleaness-not-comparison:187:3:187:13::'data != {}' can be simplified to 'data' as an empty sequence is falsey:UNDEFINED
30-
use-implicit-booleaness-not-comparison:195:3:195:26::'long_test == {}' can be simplified to 'not long_test' as an empty sequence is falsey:UNDEFINED
31-
use-implicit-booleaness-not-comparison:233:11:233:41:test_func:'my_class.parent_function == {}' can be simplified to 'not my_class.parent_function' as an empty sequence is falsey:UNDEFINED
32-
use-implicit-booleaness-not-comparison:234:11:234:37:test_func:'my_class.my_property == {}' can be simplified to 'not my_class.my_property' as an empty sequence is falsey:UNDEFINED
1+
use-implicit-booleaness-not-comparison:14:7:14:21:github_issue_4774:'bad_list == []' can be simplified to 'not bad_list' as an empty sequence is falsey:HIGH
2+
use-implicit-booleaness-not-comparison:22:3:22:20::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:HIGH
3+
use-implicit-booleaness-not-comparison:25:3:25:19::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:HIGH
4+
use-implicit-booleaness-not-comparison:28:3:28:19::'empty_dict == {}' can be simplified to 'not empty_dict' as an empty sequence is falsey:HIGH
5+
use-implicit-booleaness-not-comparison:31:3:31:20::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:HIGH
6+
use-implicit-booleaness-not-comparison:34:3:34:19::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:HIGH
7+
use-implicit-booleaness-not-comparison:37:3:37:19::'empty_dict == {}' can be simplified to 'not empty_dict' as an empty sequence is falsey:HIGH
8+
use-implicit-booleaness-not-comparison:42:11:42:18:bad_tuple_return:'t == ()' can be simplified to 'not t' as an empty sequence is falsey:HIGH
9+
use-implicit-booleaness-not-comparison:46:11:46:18:bad_list_return:'b == []' can be simplified to 'not b' as an empty sequence is falsey:HIGH
10+
use-implicit-booleaness-not-comparison:50:11:50:18:bad_dict_return:'c == {}' can be simplified to 'not c' as an empty sequence is falsey:HIGH
11+
use-implicit-booleaness-not-comparison:52:7:52:24::'empty_tuple == ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:HIGH
12+
use-implicit-booleaness-not-comparison:53:7:53:23::'empty_list == []' can be simplified to 'not empty_list' as an empty sequence is falsey:HIGH
13+
use-implicit-booleaness-not-comparison:54:7:54:23::'empty_dict != {}' can be simplified to 'empty_dict' as an empty sequence is falsey:HIGH
14+
use-implicit-booleaness-not-comparison:55:7:55:23::'empty_tuple < ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:HIGH
15+
use-implicit-booleaness-not-comparison:56:7:56:23::'empty_list <= []' can be simplified to 'not empty_list' as an empty sequence is falsey:HIGH
16+
use-implicit-booleaness-not-comparison:57:7:57:23::'empty_tuple > ()' can be simplified to 'not empty_tuple' as an empty sequence is falsey:HIGH
17+
use-implicit-booleaness-not-comparison:58:7:58:23::'empty_list >= []' can be simplified to 'not empty_list' as an empty sequence is falsey:HIGH
18+
use-implicit-booleaness-not-comparison:83:3:83:10::'a == []' can be simplified to 'not a' as an empty sequence is falsey:HIGH
19+
use-implicit-booleaness-not-comparison:95:3:95:10::'e == []' can be simplified to 'not e' as an empty sequence is falsey:HIGH
20+
use-implicit-booleaness-not-comparison:95:15:95:22::'f == {}' can be simplified to 'not f' as an empty sequence is falsey:HIGH
21+
use-implicit-booleaness-not-comparison:133:3:133:14::'A.lst == []' can be simplified to 'not A.lst' as an empty sequence is falsey:HIGH
22+
use-implicit-booleaness-not-comparison:137:3:137:14::'A.lst == []' can be simplified to 'not A.lst' as an empty sequence is falsey:HIGH
23+
use-implicit-booleaness-not-comparison:141:3:141:20::'A.test(...) == []' can be simplified to 'not A.test(...)' as an empty sequence is falsey:HIGH
24+
use-implicit-booleaness-not-comparison:149:3:149:24::'test_function(...) == []' can be simplified to 'not test_function(...)' as an empty sequence is falsey:HIGH
25+
use-implicit-booleaness-not-comparison:156:3:156:20::'numpy_array == []' can be simplified to 'not numpy_array' as an empty sequence is falsey:HIGH
26+
use-implicit-booleaness-not-comparison:158:3:158:20::'numpy_array != []' can be simplified to 'numpy_array' as an empty sequence is falsey:HIGH
27+
use-implicit-booleaness-not-comparison:160:3:160:20::'numpy_array >= ()' can be simplified to 'not numpy_array' as an empty sequence is falsey:HIGH
28+
use-implicit-booleaness-not-comparison:185:3:185:13::'data == {}' can be simplified to 'not data' as an empty sequence is falsey:HIGH
29+
use-implicit-booleaness-not-comparison:187:3:187:13::'data != {}' can be simplified to 'data' as an empty sequence is falsey:HIGH
30+
use-implicit-booleaness-not-comparison:195:3:195:26::'long_test == {}' can be simplified to 'not long_test' as an empty sequence is falsey:HIGH
31+
use-implicit-booleaness-not-comparison:233:11:233:41:test_func:'my_class.parent_function == {}' can be simplified to 'not my_class.parent_function' as an empty sequence is falsey:HIGH
32+
use-implicit-booleaness-not-comparison:234:11:234:37:test_func:'my_class.my_property == {}' can be simplified to 'not my_class.my_property' as an empty sequence is falsey:HIGH

0 commit comments

Comments
 (0)