2015-04-29 5 views
5

Als minimalen Fall habe ich eine Klasse Example, die wie in der abstrakten Kapazität für eine Reihe anderer Klassen funktioniert.Erzähle PyCharm Code generierte Felder der Klasse

class Example(object): 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
      setattr(self, key, value)    

class Test(Example): 
    def __init__(self, foo='bar'): 
     super(Test, self).__init__(foo=foo) 

Im realen Fall, tut Example mehr Dinge.

Gibt es eine Möglichkeit PyCharm zu auf Test informieren, dass Test ein Feld Test.foo haben und noch besser, lassen Sie es wissen, dass foo erwartet wird, eine Zeichenfolge zu sein?

Um dies klarzustellen, sollten Sie in Betracht ziehen, die Einstellung von Feldern von Example auf Test nicht zu delegieren.

Der nächstgelegene ich bekommen habe, ist die @ivar von Epydoc, aber ich kann es nicht

+1

AFAIK, können Sie nicht. Wenn Sie die Mitglieder eines Objekts dynamisch definieren, müssen Sie Hinweise vergessen. Sie könnten Klassenattribute für "Test" definieren, die von Instanzattributen "beschattet" werden, aber es ist den Preis nicht wert. Lebe einfach damit. – bgusach

+0

* Seufz *, naja, aber danke für die Antwort. – deinonychusaur

+0

Ja schade, aber Pycharm müsste sehr schlau sein, um den Code zu verstehen und Ihnen Hinweise zu geben. In vielen Fällen vermeide ich "dynamischen" Code zugunsten von "manuell eingegebenem" Code, nur um ein wenig mehr Sicherheit zu haben und die Anmerkungen auch zu genießen. Am Ende ist es ein generelles Problem von dynamisch typisierten Sprachen ... IDEs können nicht zu viel tun. – bgusach

Antwort

3

Ich hatte genau gleiche Problem, das Sie mit Blick auf die Arbeit. Ich habe keinen Code Vorschlag mag ich wollte nur PyCharm warnt mich über undefined Attribute stoppen (foo is not attribute of class Test)

ich nicht den Code Hinting Problem beheben könnte aber wand ich die Warnung durch die Implementierung Example Klassen wie die

5

Wie andere erwähnt haben, können Sie nicht. Sie können jedoch PyCharm sagen fehlende Attribute zu akzeptieren mit @DynamicAttrs:

class Example(object): 
    """ 
    @DynamicAttrs 
    """ 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
     setattr(self, key, value) 

Update: Wenn Python3.5 eine Option, siehe this question über Typen Hinweise für dynamische Attribute verwenden.

Verwandte Themen