diff options
author | Sylvain Th?nault <sylvain.thenault@logilab.fr> | 2012-03-15 13:45:52 +0100 |
---|---|---|
committer | Sylvain Th?nault <sylvain.thenault@logilab.fr> | 2012-03-15 13:45:52 +0100 |
commit | 6b55d80bd9ba59e77e80cf3244f8b9018f8f969c (patch) | |
tree | b9517772cd0273e77bc245811828970f069d9134 | |
parent | 8747675c91618553a5688bd90ae13955ba1b3600 (diff) | |
download | pylint-6b55d80bd9ba59e77e80cf3244f8b9018f8f969c.tar.gz |
don't emit E0202 (attribute hiding a method) on @property methods. Closes #89092
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | checkers/classes.py | 12 | ||||
-rw-r--r-- | test/input/func_noerror_property_affectation_py26.py | 24 |
3 files changed, 36 insertions, 1 deletions
@@ -5,6 +5,7 @@ ChangeLog for PyLint * #87192 fix crash when decorators are accessed through more than one dot (for instance @a.b is fine, @a.b.c crash) + * #89092: don't emit E0202 (attribute hiding a method) on @property methods * fix potential crashes with utils.safe_infer raising InferenceError 2011-12-08 -- 0.25.1 diff --git a/checkers/classes.py b/checkers/classes.py index 60d20b6..847646e 100644 --- a/checkers/classes.py +++ b/checkers/classes.py @@ -254,7 +254,17 @@ a class method.'} continue self._check_signature(node, meth_node, 'overridden') break - # check if the method overload an attribute + if node.decorators: + for decorator in node.decorators.nodes: + if isinstance(decorator, astng.Getattr) and \ + decorator.attrname in ('getter', 'setter', 'deleter'): + # attribute affectation will call this method, not hiding it + return + if isinstance(decorator, astng.Name) and decorator.name == 'property': + # attribute affectation will either call a setter or raise + # an attribute error, anyway not hiding the function + return + # check if the method is hidden by an attribute try: overridden = klass.instance_attr(node.name)[0] # XXX args = (overridden.root().name, overridden.fromlineno) diff --git a/test/input/func_noerror_property_affectation_py26.py b/test/input/func_noerror_property_affectation_py26.py new file mode 100644 index 0000000..d91f455 --- /dev/null +++ b/test/input/func_noerror_property_affectation_py26.py @@ -0,0 +1,24 @@ +# pylint: disable=R0903 +""" +Simple test case for an annoying behavior in pylint. +""" + +__revision__ = 'pouet' + +class Test(object): + """Smallest test case for reported issue.""" + + def __init__(self): + self._thing = None + + @property + def myattr(self): + """Getter for myattr""" + return self._thing + + @myattr.setter + def myattr(self, value): + """Setter for myattr.""" + self._thing = value + +Test().myattr = 'grou' |