PyLint results?

Discussion in 'Python' started by Michael Yanowitz, Apr 21, 2006.

  1. Hello:

    I ran the new pylint and my code and I had a few questions on why those
    are warnings or what I can do to fix them:

    1) W: 0: Too many lines in module (1587)
    Why is 1587 considered too many lines? Would there be necessarily be an
    advantage to split it up into 2 or 3 files? Can I up the limit?

    2) C: 0: Missing required attribute "__revision__"
    What is this? Is that for CVS? I don't use CVS (we use SVN). I have not
    seen any sample code which includes this tag yet. But if I include
    __revision 1.0 somewhere in the code it will remove that warning?

    3) W:230:readDiscreteData: Using the global statement
    What is wrong with using the global statement? I know the use of Globals
    should be discouraged, but often they can't be avoided.
    Suppose I have a constant. In C or C++, I could just use a #define and
    it would be known throughout the whole file. In Python, there isn't a
    similar construct, so rather than creating a large parameter list, of
    constants, I like to use globals.

    4) W:261:getDiscreteData: Catch "Exception"
    What is wrong with that?

    5) R:547:readDiscreteData: Too many branches (28/12)
    Python doesn't have the switch/case statements that C/C++ have. So I
    could have a large block if/elif/else statements.
    Is there any way to avoid that?

    6) R:722:waitDiscretes: Too many local variables (38/15)
    That's new to me. What is wrong with too many local variables?
    Can anything be done to improve that besides having too many globals?

    7) W:933:sendStringToSocket: Redefining name 'nPortNumber' from outer scope
    (line
    What is wrong with using the same variable name in a function that is
    used by its caller?

    8) W:995:sendStringToSocket: Used builtin function 'map'
    Is that a problem?

    Plus many other warnings about my naming convention or unused variables
    which I will ignore
    at this time.

    I did find it to be a very useful too any how in cleaning up my code.
    I raised my code rate from about -8 to about +7.

    Thanks:
    Michael Yanowitz
     
    Michael Yanowitz, Apr 21, 2006
    #1
    1. Advertising

  2. Michael Yanowitz

    Alexis Roda Guest

    Michael Yanowitz escribió:
    > Hello:
    >
    > I ran the new pylint and my code and I had a few questions on why those
    > are warnings or what I can do to fix them:
    >


    > 2) C: 0: Missing required attribute "__revision__"
    > What is this? Is that for CVS? I don't use CVS (we use SVN). I have not
    > seen any sample code which includes this tag yet. But if I include
    > __revision 1.0 somewhere in the code it will remove that warning?


    try it and see what happens

    > 3) W:230:readDiscreteData: Using the global statement
    > What is wrong with using the global statement? I know the use of Globals
    > should be discouraged, but often they can't be avoided.
    > Suppose I have a constant. In C or C++, I could just use a #define and
    > it would be known throughout the whole file. In Python, there isn't a
    > similar construct, so rather than creating a large parameter list, of
    > constants, I like to use globals.


    * define all your constants in a separate module constants.py, then:

    from constants import *

    * add the constants to __builtins__

    __builtins__.constant_name = value

    this approach is a bit tricky


    > 4) W:261:getDiscreteData: Catch "Exception"
    > What is wrong with that?


    cause you're masquerading *all* exceptions, this could be potentially
    dangerous

    > 6) R:722:waitDiscretes: Too many local variables (38/15)
    > That's new to me. What is wrong with too many local variables?
    > Can anything be done to improve that besides having too many globals?


    too many local variables probably means "too complex function, split it
    in smaller functions"
     
    Alexis Roda, Apr 21, 2006
    #2
    1. Advertising

  3. * Michael Yanowitz wrote:

    > I ran the new pylint and my code and I had a few questions on why those
    > are warnings or what I can do to fix them:
    >
    > 1) W: 0: Too many lines in module (1587)
    > Why is 1587 considered too many lines? Would there be necessarily be
    > an
    > advantage to split it up into 2 or 3 files? Can I up the limit?


    not necessarily. It might be considered bad style to put too much stuff into
    one module. This depends on the content. You can now raise the limit (which
    is 1000 lines by default) with the --max-module-lines command line option
    or using a config file (generate one with pylint --generate-rcfile, use it
    with pylint --rcfile=<filename>).

    Alternatively you can disable the message for this module by putting
    # pylint: disable-msg = W<id>
    on the top (after the # -*- coding -*- line, if any).
    The new pylint allows for local disabling also such comments within the
    code.

    The id can you get if you enable them in the output via cmdline or config
    file.

    > 2) C: 0: Missing required attribute "__revision__"
    > What is this? Is that for CVS? I don't use CVS (we use SVN). I have not
    > seen any sample code which includes this tag yet. But if I include
    > __revision 1.0 somewhere in the code it will remove that warning?


    yeah. But you can list these attributes in the config... ;-)

    > 3) W:230:readDiscreteData: Using the global statement
    > What is wrong with using the global statement? I know the use of
    > Globals should be discouraged, but often they can't be avoided.
    > Suppose I have a constant. In C or C++, I could just use a #define and
    > it would be known throughout the whole file. In Python, there isn't a
    > similar construct, so rather than creating a large parameter list, of
    > constants, I like to use globals.


    Consider *writing* globals from inside a function as bad style.

    > 4) W:261:getDiscreteData: Catch "Exception"
    > What is wrong with that?


    Typically you do want be more specific, because Exception catches too much.

    > 5) R:547:readDiscreteData: Too many branches (28/12)
    > Python doesn't have the switch/case statements that C/C++ have. So I
    > could have a large block if/elif/else statements.
    > Is there any way to avoid that?


    Not always. But usually you can restructure your code better (Use more
    functions/methods, structure them semantically).

    > 6) R:722:waitDiscretes: Too many local variables (38/15)
    > That's new to me. What is wrong with too many local variables?
    > Can anything be done to improve that besides having too many globals?


    One could loose the overview, I guess. 38 local variables are really a lot.
    Structure your code :)

    > 7) W:933:sendStringToSocket: Redefining name 'nPortNumber' from outer
    > scope (line
    > What is wrong with using the same variable name in a function that is
    > used by its caller?


    It might confuse someone else or you in half a year when reading the code
    again.

    > 8) W:995:sendStringToSocket: Used builtin function 'map'
    > Is that a problem?


    Not really. You might consider using list comprehensions, though.

    > Plus many other warnings about my naming convention or unused variables
    > which I will ignore
    > at this time.
    >
    > I did find it to be a very useful too any how in cleaning up my code.
    > I raised my code rate from about -8 to about +7.


    I personally find the code rate nonsense, YMMV ;-)

    Note that all messages from pylint should be taken as hints, not a final
    verdict. Think about them (you did, as you asked here ;-). Either correct
    or ignore them (typically done by locally or even globally disabling them).

    Do some fine-tuning using a config matching your own requirements. The
    defaults are, well, just defaults.

    nd
    --
    die (eval q-qq[Just Another Perl Hacker
    ]
    ;-)
    # André Malo, <http://pub.perlig.de/> #
     
    =?UTF-8?B?QW5kcsOp?= Malo, Apr 21, 2006
    #3
  4. In <>, Michael
    Yanowitz wrote:

    > 2) C: 0: Missing required attribute "__revision__"
    > What is this? Is that for CVS? I don't use CVS (we use SVN). I have not
    > seen any sample code which includes this tag yet. But if I include
    > __revision 1.0 somewhere in the code it will remove that warning?


    AFAIK that's a requirement at Logilab. They use the tool themselves. :)

    > 3) W:230:readDiscreteData: Using the global statement
    > What is wrong with using the global statement? I know the use of Globals
    > should be discouraged, but often they can't be avoided.


    I guess more often than you think.

    > Suppose I have a constant. In C or C++, I could just use a #define and
    > it would be known throughout the whole file. In Python, there isn't a
    > similar construct, so rather than creating a large parameter list, of
    > constants, I like to use globals.


    If they are constants then you don't rebind them from within functions or
    methods, right? Then you don't need ``global``. This works without
    problems::

    ANSWER = 42

    def spam():
    print ANSWER


    > 4) W:261:getDiscreteData: Catch "Exception"
    > What is wrong with that?


    It catches *any* exception. For example `KeyboardInterrupt` which can
    lead to programs that can't be stopped with CTRL+C or `ZeroDivisionError`
    or `NameError` so programming errors are silenced.

    > 5) R:547:readDiscreteData: Too many branches (28/12)
    > Python doesn't have the switch/case statements that C/C++ have. So I
    > could have a large block if/elif/else statements.
    > Is there any way to avoid that?


    One idiom is to create a dictionary with the values to "switch on" mapped
    to callables to handle the case.

    > 6) R:722:waitDiscretes: Too many local variables (38/15)
    > That's new to me. What is wrong with too many local variables?


    Well, they are just to many. :)

    > 7) W:933:sendStringToSocket: Redefining name 'nPortNumber' from outer scope
    > (line
    > What is wrong with using the same variable name in a function that is
    > used by its caller?


    It's not used by the caller but in the outer scope. It may confuse the
    reader seeing `ham` in the outer scope and then `ham` in the function
    without noticing that this is actually another `ham`.

    > 8) W:995:sendStringToSocket: Used builtin function 'map'
    > Is that a problem?


    `map` is "deprecated" in favor of list comprehensions. A matter of taste…

    Ciao,
    Marc 'BlackJack' Rintsch
     
    Marc 'BlackJack' Rintsch, Apr 21, 2006
    #4
  5. On Fri, 21 Apr 2006 13:49:31 -0400, "Michael Yanowitz"
    <> declaimed the following in comp.lang.python:


    > Suppose I have a constant. In C or C++, I could just use a #define and


    A "constant" wouldn't require the global statement, since by
    definition it won't be part of the LHS of an assignment -- and RHS
    non-locals are automagically retrieved.
    > 8) W:995:sendStringToSocket: Used builtin function 'map'
    > Is that a problem?
    >

    I think every example I've seen posted that used map could be
    replaced with a list comprehension -- that might be what the default
    warnings set in PyLint prefer...
    --
    > ============================================================== <
    > | Wulfraed Dennis Lee Bieber KD6MOG <
    > | Bestiaria Support Staff <
    > ============================================================== <
    > Home Page: <http://www.dm.net/~wulfraed/> <
    > Overflow Page: <http://wlfraed.home.netcom.com/> <
     
    Dennis Lee Bieber, Apr 22, 2006
    #5
  6. Others have answered most of your questions, I won't repeat the answers
    here, but only join the choir to stress that pylint needs tuning to
    your coding style. An obvious case is camelCaseMethodNames versus
    underscored_method_names, but there are also a lot of issues. The
    default pylint settings match Logilab's coding standards. The coding
    metrics were heavily inspired by Steve McConnell's Code Complete book,
    but the figures provided therein have been heavily downscaled to match
    for Python's expressivity (Code Complete deals mostly with C/C++/Java
    code).

    Le 21-04-2006, Michael <> nous disait:

    > 2) C: 0: Missing required attribute "__revision__"
    > What is this? Is that for CVS? I don't use CVS (we use SVN). I have not
    > seen any sample code which includes this tag yet. But if I include
    > __revision 1.0 somewhere in the code it will remove that warning?



    We generally have a
    __revision__ = '$Id$'

    statement at module top level, which gets replaced a check in time by
    CVS, which makes it easy to know who checked in the HEAD revision of the
    module. This behaviour can be emulated with subversion properties.



    > 5) R:547:readDiscreteData: Too many branches (28/12)
    > Python doesn't have the switch/case statements that C/C++ have. So I
    > could have a large block if/elif/else statements.
    > Is there any way to avoid that?
    >
    > 6) R:722:waitDiscretes: Too many local variables (38/15)
    > That's new to me. What is wrong with too many local variables?
    > Can anything be done to improve that besides having too many globals?


    For these two, I strongly recommend giving a look at Martin Fowler's
    Refactoring book (published by Addison Wesley). These are typical so
    called "code smells" which can be solved using for instance the "Extract
    Method" refactoring.

    Of course, it all depends on the kind of program you are working, and
    sometimes using intermediate variables helps understanding the code (by
    providing useful names, for instance). What pylint tells you is "there
    could be an issue here, you should check."


    --
    Alexandre Fayolle LOGILAB, Paris (France).
    http://www.logilab.com http://www.logilab.fr http://www.logilab.org
     
    Alexandre Fayolle, Apr 25, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Monique Y. Mudama
    Replies:
    1
    Views:
    457
    Monique Y. Mudama
    Jun 28, 2005
  2. Re: [ANN] pylint-0.1.2

    , Jun 25, 2003, in forum: Python
    Replies:
    2
    Views:
    833
  3. lovecreatesbeauty
    Replies:
    8
    Views:
    1,665
    Old Wolf
    Sep 12, 2005
  4. Ken Fine
    Replies:
    3
    Views:
    540
    Steven Cheng [MSFT]
    Jul 23, 2008
  5. Giacomo Boffi
    Replies:
    4
    Views:
    1,676
    Jean-Michel Pichavant
    Apr 19, 2010
Loading...

Share This Page