[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