[Python-projects] pylint: parse error on disable-msg comment in finally clause (retry)
Sylvain Thénault
sylvain.thenault at logilab.fr
Thu Jul 31 08:36:33 CEST 2008
On Wed, Jul 30, 2008 at 05:40:30PM +0200, Maarten ter Huurne wrote:
> Hi,
hey,
> Running pylint on the following code:
> ===
> try:
> pass
> finally:
> # pylint: disable-msg=W0201
> pass
> ===
> produces this error:
> ===
> I: 4: Locally disabling W0201
> Traceback (most recent call last):
[snip]
> File "/usr/lib/python2.5/site-packages/logilab/astng/nodes.py", line 316,
> in elsed_block_range
> if node.else_:
> AttributeError: TryFinally instance has no attribute 'else_'
> ===
>
> The problem is caused by the "disable-msg" comment. The exact ID
> used in the comment doesn't matter, as long as its a number of an
> existing message.
>
> pylint 0.14.0,
> astng 0.17.2, common 0.22.1
> Python 2.5.1 (r251:54863, Mar 7 2008, 03:41:45)
>
> 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.
> The following patch to astng fixes the problem:
> ===
> --- logilab-astng-0.17.2.org/nodes.py 2008-01-14 13:32:55.000000000 +0100
> +++ logilab-astng-0.17.2/nodes.py 2008-07-30 17:13:40.000000000 +0200
> @@ -313,10 +313,11 @@
> """
> if lineno == node.source_line():
> return lineno, lineno
> - if node.else_:
> - if lineno >= node.else_.source_line():
> - return lineno, node.else_.last_source_line()
> - return lineno, node.else_.source_line() - 1
> + block = node.final if isinstance(node, TryFinally) else node.else_
> + if block:
> + if lineno > node.body.last_source_line():
> + return lineno, block.last_source_line()
> + return lineno, block.source_line() - 1
> return lineno, last or node.last_source_line()
>
> TryFinally.block_range = elsed_block_range
> ===
>
> Note that this patch changes two things:
> 1. use "node.final" instead of "node.else_" if node is of type TryFinally
> 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
>
> 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.
great! I've applied the patch in the astng repository. Thank you very
mutch.
Cheers,
--
Sylvain Thénault LOGILAB, Paris (France)
Formations Python, Zope, Plone, Debian: http://www.logilab.fr/formations
Développement logiciel sur mesure: http://www.logilab.fr/services
Python et calcul scientifique: http://www.logilab.fr/science
More information about the Python-Projects
mailing list