[Python-projects] when using defining-attr-method, method order matters

skip at pobox.com skip at pobox.com
Mon Apr 13 14:32:33 CEST 2009

Consider this simple class:

    class C:
        def __init__(self):
            self.x = 0

        def set_y(self, y):
            self.y = y

        def set_x(self, x):
            self.x = x

        def reset(self):
            self.x = 0
            self.y = 0

If you run pylint over it like so:

    pylint --defining-attr-methods=__init__,reset resetwhen.py

it complains:

    resetwhen.py:9: [W, C.set_y] Attribute 'y' defined outside __init__

If, however, you reorganize it slightly so that reset() occurs before set_y,
pylint is happy.  I can understand why this error is emitted.  Pylint sees
the definition of self.y in set_y before it encounters reset and thus emits
the error message.

It seems to me that giving a bunch of attributes initial values is generally
of secondary importance to a class's functionality.  It should be ok to push
such methods to the end of the file.  I think pylint should collect the
location of attribute initialization as it runs and only report on
attributes which are not ever assigned in the methods specified by
defining-attr-methods, ignoring when they are encountered.

Skip Montanaro - skip at pobox.com - http://www.smontanaro.net/
        "XML sucks, dictionaries rock" - Dave Beazley

More information about the Python-Projects mailing list