Skip to content

Commit 659be29

Browse files
authored
Fix false negative for multiple-statements on try... else/finally lines (#9917)
1 parent 073595e commit 659be29

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix false negative for `multiple-statements` when multiple statements are present on `else` and `finally` lines of `try`.
2+
3+
Refs #9759

pylint/checkers/format.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,10 @@ def visit_default(self, node: nodes.NodeNG) -> None:
496496
prev_sibl = node.previous_sibling()
497497
if prev_sibl is not None:
498498
prev_line = prev_sibl.fromlineno
499+
elif isinstance(
500+
node.parent, nodes.Try
501+
) and self._is_first_node_in_else_finally_body(node, node.parent):
502+
prev_line = self._infer_else_finally_line_number(node, node.parent)
499503
elif isinstance(node.parent, nodes.Module):
500504
prev_line = 0
501505
else:
@@ -520,6 +524,28 @@ def visit_default(self, node: nodes.NodeNG) -> None:
520524
except KeyError:
521525
lines.append("")
522526

527+
def _is_first_node_in_else_finally_body(
528+
self, node: nodes.NodeNG, parent: nodes.Try
529+
) -> bool:
530+
if parent.orelse and node == parent.orelse[0]:
531+
return True
532+
if parent.finalbody and node == parent.finalbody[0]:
533+
return True
534+
return False
535+
536+
def _infer_else_finally_line_number(
537+
self, node: nodes.NodeNG, parent: nodes.Try
538+
) -> int:
539+
last_line_of_prev_block = 0
540+
if node in parent.finalbody and parent.orelse:
541+
last_line_of_prev_block = parent.orelse[-1].tolineno
542+
elif parent.handlers and parent.handlers[-1].body:
543+
last_line_of_prev_block = parent.handlers[-1].body[-1].tolineno
544+
elif parent.body:
545+
last_line_of_prev_block = parent.body[-1].tolineno
546+
547+
return last_line_of_prev_block + 1 if last_line_of_prev_block else 0
548+
523549
def _check_multi_statement_line(self, node: nodes.NodeNG, line: int) -> None:
524550
"""Check for lines containing multiple statements."""
525551
if isinstance(node, nodes.With):

tests/functional/m/multiple_statements.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,23 @@ class MyError(Exception): a='a'; b='b' # [multiple-statements]
4343
def concat2(arg1: str) -> str: ...
4444

4545
def concat2(arg1: str) -> str: ...
46+
47+
# Test for multiple statements on finally line
48+
try:
49+
pass
50+
finally: pass # [multiple-statements]
51+
52+
# Test for multiple statements on else line
53+
try:
54+
pass
55+
except:
56+
pass
57+
else: pass # [multiple-statements]
58+
59+
# Test for multiple statements on else and finally lines
60+
try:
61+
pass
62+
except:
63+
pass
64+
else: pass # [multiple-statements]
65+
finally: pass # [multiple-statements]

tests/functional/m/multiple_statements.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ multiple-statements:26:30:26:59:MyException:More than one statement on a single
88
multiple-statements:27:26:27:30:MyError:More than one statement on a single line:HIGH
99
multiple-statements:30:26:30:31:MyError:More than one statement on a single line:HIGH
1010
multiple-statements:32:26:32:31:MyError:More than one statement on a single line:HIGH
11+
multiple-statements:50:9:50:13::More than one statement on a single line:HIGH
12+
multiple-statements:57:6:57:10::More than one statement on a single line:HIGH
13+
multiple-statements:64:6:64:10::More than one statement on a single line:HIGH
14+
multiple-statements:65:9:65:13::More than one statement on a single line:HIGH

0 commit comments

Comments
 (0)