web-dev-qa-db-fra.com

Comment puis-je dire à PyCharm quel type de paramètre est censé être?

En ce qui concerne les constructeurs, les affectations et les appels de méthodes, PyCharm IDE est très utile pour analyser mon code source et déterminer le type de chaque variable. Je l'aime bien quand c'est correct, parce que cela me donne une bonne complétion de code et des informations sur les paramètres, ainsi que des avertissements si j'essaie d'accéder à un attribut qui n'existe pas.

Mais quand il s'agit de paramètres, il ne sait rien. Les menus déroulants de complétion de code ne peuvent rien afficher car ils ne savent pas quel type sera le paramètre. L'analyse de code ne peut pas rechercher des avertissements.

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

Cela a un certain sens. Les autres sites d’appel peuvent transmettre n'importe quoi pour ce paramètre. Mais si ma méthode s'attend à ce qu'un paramètre soit de type, disons, pygame.Surface, J'aimerais pouvoir indiquer cela à PyCharm d'une manière ou d'une autre, afin qu'il puisse me montrer tous les attributs de Surface dans sa liste déroulante de complétion de code, et mettre en surbrillance les avertissements si j'appelle la mauvaise méthode, et ainsi de suite. sur.

Existe-t-il un moyen de donner un indice à PyCharm et de lui dire "psst, ce paramètre est supposé être de type X"? (Ou peut-être, dans l'esprit des langages dynamiques, "ce paramètre est censé charmer comme un X"? Je serais d'accord avec ça.)


EDIT: La réponse de CrazyCoder, ci-dessous, fait l'affaire. Pour tous les nouveaux arrivants comme moi qui veulent le résumé rapide, le voici:

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.

La partie pertinente est le @type peasant: Person ligne de la docstring.

Si vous accédez également à Fichier> Paramètres> Python Outils intégrés et définissez le "format Docstring" sur "Epytext", l'option Affichage> Consultation rapide de la documentation de PyCharm imprimera plutôt les informations de paramètre plutôt que de simplement les imprimer. toutes les lignes @ telles quelles.

168
Joe White

Oui, vous pouvez utiliser un format de documentation spécial pour les méthodes et leurs paramètres afin que PyCharm puisse en connaître le type. Version récente de PyCharm supporte les formats de doc les plus courants .

Par exemple, PyCharm extrait les types de @ commentaires de style param .

Voir aussi reStructuredText et conventions de docstring (PEP 257).

Une autre option est Python 3 annotations.

Veuillez reportez-vous à la section documentation de PyCharm pour plus de détails et d’échantillons.

83
CrazyCoder

Si vous utilisez Python 3.0 ou version ultérieure, vous pouvez également utiliser des annotations sur des fonctions et des paramètres. PyCharm les interprétera comme le type que les arguments ou les valeurs de retour devraient avoir:

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

Parfois, cela est utile pour les méthodes non publiques, qui n'ont pas besoin de docstring. De plus, ces annotations sont accessibles par code:

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

Update : à partir de PEP 484 , qui a été accepté pour Python 3.5, il est également la convention officielle pour spécifier les types d'argument et de retour à l'aide d'annotations.

46
Feuermurmel

PyCharm extrait les types d'une chaîne @type pydoc. Voir la documentation PyCharm ici et ici , et documents Epydoc . C’est dans la section "héritage" de PyCharm, il manque peut-être certaines fonctionnalités.

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.

La partie pertinente est le @type peasant: Person ligne de la docstring.

Mon intention n'est pas de voler des points à CrazyCoder ou à celui qui a posé la question initiale, mais surtout leur donner leurs points. Je pensais juste que la réponse simple devrait être dans une case "réponse".

4
dfrankow

Vous pouvez également affirmer un type et Pycharm l'inférera:

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

J'utilise PyCharm Professional 2016.1 en écrivant du code py2.6-2.7 et j'ai constaté qu'en utilisant reStructuredText, je peux exprimer les types de manière plus succincte:

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.

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

1
pongi