2010-10-20 2 views
4

J'ai remarqué pylint ne gère pas bien le cas:bug pylint - E1101 & E0102 lors de l'utilisation de @property + @ foo.setter

@property 
def foo(self): 
    return self._bar.foo 

@foo.setter 
def foo(self, foo_val): 
    self._bar.foo = foo_val 

Bien que ce soit une syntaxe de cas parfaitement valable depuis python2.6

Il est dit que j'ai défini foo deux fois, et ne comprend pas la syntaxe ".setter" (Donne E1101 & E0102).

Y at-il une solution de contournement pour cela sans avoir à changer le code? Je ne veux pas désactiver les erreurs car elles sont importantes pour d'autres endroits.

Y at-il un autre outil que je peux utiliser qui le gère mieux? J'ai déjà vérifié les pyflakes et il se comporte de la même manière. L'analyse de code de PyDev semble mieux gérer ce cas spécifique, mais elle ne vérifie pas les conventions, le refactoring et autres fonctionnalités intéressantes que fait pylint, et je ne peux pas l'exécuter à partir d'un script externe (ou puis-je ??)

Merci!

Répondre

1

Huh. Ennuyeux. Et tous les principaux outils que j'ai pu trouver (pyflakes, pylint, pychecker) montrent ce problème. Il semble que le problème commence dans le code d'octet, mais je ne peux pas obtenir dis pour me donner un code d'octet pour les propriétés de l'objet.

Il semble que vous seriez mieux si vous avez utilisé cette syntaxe:

# Changed to longer member names to reduce pylint grousing 
class HughClass(object): 
    def __init__(self, init_value): 
     self._hugh = init_value 
    def hugh_setter(self): 
     return self._hugh * 2 
    def hugh_getter(self, value): 
     self._hugh = value/2 
    hugh = property(hugh_getter, hugh_setter) 

est ici un nice blog article sur elle. LOL-citation:

Les getters et les setters appartiennent au monde triste de Java et de C++.

+1

:(c'est ce dont j'avais peur - je préférerais ne pas avoir à changer de code existant Mais je suis d'accord que cela semble mieux de toute façon – yonix

+0

Eh bien, alors vous pouvez ajouter des commentaires '# pylint', comme le suggère @jchl, désactive sélectivement les plaintes – hughdbrown

4

Si vous ne souhaitez pas désactiver les erreurs au niveau mondial, vous pouvez les désactiver pour ces lignes spécifiques, par exemple:

def foo(self, foo_val): # pylint: disable-msg=E0102 
+0

Wow, merci! Je ne savais pas que vous pouvez le faire :) –

0

Il s'agissait de reported as a bug in pyflakes et il semble être réparé dans le réseau actuel. Donc je suppose que la réponse (maintenant) est: pyflakes!

+0

il a été fixé dans pylint ainsi en fait ... – yonix