From b971f2775500b4154619dc5d71ba77fc7e4efdf6 Mon Sep 17 00:00:00 2001 From: ervandew Date: Mon, 14 Feb 2011 17:46:09 -0800 Subject: [PATCH 1/3] re-apply 0c808db: Don't warn about duplicate functions for property decorators @prop.setter and @prop.deleter. --- pyflakes/checker.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pyflakes/checker.py b/pyflakes/checker.py index 7c348b8..9a8cf44 100644 --- a/pyflakes/checker.py +++ b/pyflakes/checker.py @@ -98,7 +98,7 @@ class Assignment(Binding): class FunctionDefinition(Binding): - pass + _property_decorator = False @@ -353,8 +353,9 @@ def addBinding(self, loc, value, reportRedef=True): ''' if (isinstance(self.scope.get(value.name), FunctionDefinition) and isinstance(value, FunctionDefinition)): - self.report(messages.RedefinedFunction, - loc, value.name, self.scope[value.name].source) + if not value._property_decorator: + self.report(messages.RedefinedFunction, + loc, value.name, self.scope[value.name].source) if not isinstance(self.scope, ClassScope): for scope in self.scopeStack[::-1]: @@ -517,7 +518,14 @@ def FUNCTIONDEF(self, node): else: for deco in node.decorator_list: self.handleNode(deco, node) - self.addBinding(node, FunctionDefinition(node.name, node)) + + # Check for property decorator + func_def = FunctionDefinition(node.name, node) + for decorator in node.decorator_list: + if getattr(decorator, 'attr', None) in ('setter', 'deleter'): + func_def._property_decorator = True + + self.addBinding(node, func_def) self.LAMBDA(node) def LAMBDA(self, node): From 0c9d7a4000c3935abd3d1c8d87256f5b6e4abd88 Mon Sep 17 00:00:00 2001 From: ervandew Date: Mon, 14 Feb 2011 17:54:30 -0800 Subject: [PATCH 2/3] retain python 2.5 compatibility --- pyflakes/checker.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pyflakes/checker.py b/pyflakes/checker.py index 9a8cf44..f6f6013 100644 --- a/pyflakes/checker.py +++ b/pyflakes/checker.py @@ -513,15 +513,16 @@ def NAME(self, node): def FUNCTIONDEF(self, node): # the decorators attribute is called decorator_list as of Python 2.6 if hasattr(node, 'decorators'): - for deco in node.decorators: - self.handleNode(deco, node) + decorators = node.decorators else: - for deco in node.decorator_list: - self.handleNode(deco, node) + decorators = node.decorator_list + + for deco in node.decorator_list: + self.handleNode(deco, node) # Check for property decorator func_def = FunctionDefinition(node.name, node) - for decorator in node.decorator_list: + for decorator in decorators: if getattr(decorator, 'attr', None) in ('setter', 'deleter'): func_def._property_decorator = True From e537f49510f8e8b9ff9762d92edb4a2fd92307b1 Mon Sep 17 00:00:00 2001 From: ervandew Date: Wed, 16 Mar 2011 17:14:54 -0700 Subject: [PATCH 3/3] fix typo on retaining python 2.5 compatibility spotted by xaka --- pyflakes/checker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyflakes/checker.py b/pyflakes/checker.py index f6f6013..52361fe 100644 --- a/pyflakes/checker.py +++ b/pyflakes/checker.py @@ -517,7 +517,7 @@ def FUNCTIONDEF(self, node): else: decorators = node.decorator_list - for deco in node.decorator_list: + for deco in decorators: self.handleNode(deco, node) # Check for property decorator