<html><body>
<p><tt>I hope the indentation is preserved now. Lotus Notes is not Python friendly :(</tt><br>
<br>
<tt>Hi,</tt><br>
<tt><br>
Running pylint on the following code:</tt><br>
<tt>===</tt><br>
<tt>try:</tt><br>
<tt> pass</tt><br>
<tt>finally:</tt><br>
<tt> # pylint: disable-msg=W0201</tt><br>
<tt> pass</tt><br>
<tt>===</tt><br>
<tt>produces this error:</tt><br>
<tt>===</tt><br>
<tt>I: 4: Locally disabling W0201</tt><br>
<tt>Traceback (most recent call last):</tt><br>
<tt> File "/usr/bin/pylint", line 4, in <module></tt><br>
<tt> lint.Run(sys.argv[1:])</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 901, in __init__</tt><br>
<tt> linter.check(args)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 492, in check</tt><br>
<tt> self.check_astng_module(astng, checkers)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 594, in check_astng_module</tt><br>
<tt> self.collect_block_lines(astng, orig_state)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 428, in collect_block_lines</tt><br>
<tt> self.collect_block_lines(child, msg_state)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 428, in collect_block_lines</tt><br>
<tt> self.collect_block_lines(child, msg_state)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/pylint/lint.py", line 437, in collect_block_lines</tt><br>
<tt> first, last = node.block_range(lineno)</tt><br>
<tt> File "/usr/lib/python2.5/site-packages/logilab/astng/nodes.py", line 316, in elsed_block_range</tt><br>
<tt> if node.else_:</tt><br>
<tt>AttributeError: TryFinally instance has no attribute 'else_'</tt><br>
<tt>===</tt><br>
<tt><br>
The problem is caused by the "disable-msg" comment. The exact ID <br>
used in the comment doesn't matter, as long as its a number of an <br>
existing message.</tt><br>
<tt><br>
pylint 0.14.0,</tt><br>
<tt>astng 0.17.2, common 0.22.1</tt><br>
<tt>Python 2.5.1 (r251:54863, Mar 7 2008, 03:41:45)</tt><br>
<tt><br>
The problem is that the "finally" clause is expected in an attribute named "else_" of the "TryFinally" node, but the attribute is named "final" instead.</tt><br>
<tt>The following patch to astng fixes the problem:</tt><br>
<tt>===</tt><br>
<tt>--- logilab-astng-0.17.2.org/nodes.py 2008-01-14 13:32:55.000000000 +0100</tt><br>
<tt>+++ logilab-astng-0.17.2/nodes.py 2008-07-30 17:13:40.000000000 +0200</tt><br>
<tt>@@ -313,10 +313,11 @@</tt><br>
<tt> """</tt><br>
<tt> if lineno == node.source_line():</tt><br>
<tt> return lineno, lineno</tt><br>
<tt>- if node.else_:</tt><br>
<tt>- if lineno >= node.else_.source_line():</tt><br>
<tt>- return lineno, node.else_.last_source_line()</tt><br>
<tt>- return lineno, node.else_.source_line() - 1</tt><br>
<tt>+ block = node.final if isinstance(node, TryFinally) else node.else_</tt><br>
<tt>+ if block:</tt><br>
<tt>+ if lineno > node.body.last_source_line():</tt><br>
<tt>+ return lineno, block.last_source_line()</tt><br>
<tt>+ return lineno, block.source_line() - 1</tt><br>
<tt> return lineno, last or node.last_source_line()</tt><br>
<tt><br>
TryFinally.block_range = elsed_block_range</tt><br>
<tt>===</tt><br>
<tt><br>
Note that this patch changes two things:</tt><br>
<tt>1. use "node.final" instead of "node.else_" if node is of type TryFinally</tt><br>
<tt>2. the check whether the given line is in the body or in the else/finally clause is done versus the last line of the body instead of the first line of else/finally clause</tt><br>
<tt><br>
The reason for 2 is that the number given for the first line of the else/finally clause is the number of the first line with a statement on it, while the "lineno" argument is the number of the line with the "# pylint: disable-msg" comment on it, which can be located before the first statement in the block.</tt><br>
<tt><br>
I just realized I used the Python 2.5 style "if" here; if astng supports older Python versions as well, please replace it with a traditional "if".</tt><br>
<tt><br>
Bye,</tt><br>
<tt>                Maarten</tt><br>
</body></html>