wake-up-neo.com

Wie kann ich PyCharm mitteilen, welchen Typ ein Parameter haben soll?

Wenn es um Konstruktoren, Zuweisungen und Methodenaufrufe geht, ist der PyCharm IDE) ziemlich gut darin, meinen Quellcode zu analysieren und herauszufinden, welcher Typ jede Variable haben sollte. Ich mag es, wenn es richtig ist. weil es mir eine gute Code-Vervollständigung und Parameter-Informationen gibt, und es mir Warnungen gibt, wenn ich versuche, auf ein Attribut zuzugreifen, das nicht existiert.

Aber wenn es um Parameter geht, weiß es nichts. Die Dropdown-Listen für die Code-Vervollständigung können nichts anzeigen, da sie nicht wissen, welcher Typ der Parameter sein wird. Die Code-Analyse kann nicht nach Warnungen suchen.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

peasant = Person("Dennis", 37)
# PyCharm knows that the "peasant" variable is of type Person
peasant.Dig_filth()   # shows warning -- Person doesn't have a Dig_filth method

class King:
    def repress(self, peasant):
        # PyCharm has no idea what type the "peasant" parameter should be
        peasant.knock_over()   # no warning even though knock_over doesn't exist

King().repress(peasant)
# Even if I call the method once with a Person instance, PyCharm doesn't
# consider that to mean that the "peasant" parameter should always be a Person

Das macht einen gewissen Sinn. Andere Call-Sites könnten für diesen Parameter alles übergeben. Aber wenn meine Methode erwartet, dass ein Parameter vom Typ ist, sagen wir pygame.Surface, Ich möchte PyCharm das irgendwie anzeigen können, damit es mir alle Attribute von Surface in der Dropdown-Liste für die Codevervollständigung anzeigt und Warnungen hervorhebt, wenn ich die falsche Methode aufrufe, und so weiter auf.

Gibt es eine Möglichkeit, PyCharm einen Hinweis zu geben und "psst, dieser Parameter soll vom Typ X sein" zu sagen? (Oder vielleicht, im Geiste dynamischer Sprachen, "soll dieser Parameter wie ein X quaken"? Damit wäre ich einverstanden.)


EDIT: CrazyCoders Antwort unten macht den Trick. Für alle Neulinge wie mich, die eine kurze Zusammenfassung wünschen, hier ist es:

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

Der relevante Teil ist das @type peasant: Person Zeile des Dokstrings.

Wenn Sie auch zu "Datei"> "Einstellungen"> "Python= Integrated Tools" wechseln und "Docstring-Format" auf "Epytext" setzen, werden die Parameterinformationen in PyCharm unter "Ansicht"> "Schnelle Dokumentationssuche" hübsch gedruckt, anstatt nur gedruckt zu werden alle @ -Linien wie sie sind.

168
Joe White

Ja, Sie können ein spezielles Dokumentationsformat für Methoden und deren Parameter verwenden, damit PyCharm den Typ kennt. Aktuelle PyCharm-Version nterstützt die gängigsten Dokumentformate .

PyCharm extrahiert beispielsweise Typen aus @ param-Stilkommentare .

Siehe auch reStructuredText und Docstring-Konventionen (PEP 257).

Eine andere Option ist Python 3 Annotationen.

Bitte siehe Abschnitt PyCharm-Dokumentation für weitere Details und Beispiele.

83
CrazyCoder

Wenn Sie Python 3.0 oder höher verwenden, können Sie auch Anmerkungen zu Funktionen und Parametern verwenden. PyCharm interpretiert diese als den Typ, den die Argumente oder Rückgabewerte haben sollen:

class King:
    def repress(self, peasant: Person) -> bool:
        peasant.knock_over() # Shows a warning. And there was much rejoicing.

        return peasant.badly_hurt() # Lets say, its not known from here that this method will always return a bool

Dies ist manchmal nützlich für nicht öffentliche Methoden, die keine Dokumentzeichenfolge benötigen. Ein zusätzlicher Vorteil ist, dass auf diese Anmerkungen per Code zugegriffen werden kann:

>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}

Update : Ab PEP 484 , das für Python 3.5, it akzeptiert wurde ist auch die offizielle Konvention zur Angabe von Argument- und Rückgabetypen mithilfe von Anmerkungen.

46
Feuermurmel

PyCharm extrahiert Typen aus einem @type pydoc-String. Siehe PyCharm-Dokumente hier und hier und Epydoc-Dokumente . Es befindet sich in der 'Legacy'-Sektion von PyCharm, vielleicht fehlt ihm etwas Funktionalität.

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

Der relevante Teil ist das @type peasant: Person Zeile des Dokstrings.

Ich habe nicht die Absicht, CrazyCoder oder dem ursprünglichen Fragesteller Punkte abzunehmen, sondern ihnen unbedingt ihre Punkte zu geben. Ich dachte nur, die einfache Antwort sollte in einem "Antwort" -Slot sein.

4
dfrankow

Sie können auch einen Typ angeben und Pycharm wird daraus schließen:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass

Ich benutze PyCharm Professional 2016.1, um py2.6-2.7-Code zu schreiben, und ich habe festgestellt, dass ich mit reStructuredText Typen auf eine prägnantere Art und Weise ausdrücken kann:

class Replicant(object):
    pass


class Hunter(object):
    def retire(self, replicant):
        """ Retire the rogue or non-functional replicant.
        :param Replicant replicant: the replicant to retire.
        """
        replicant.knock_over()  # Shows a warning.

Siehe: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy

1
pongi