Як я можу сказати PyCharm, якого типу параметр очікується?


173

Що стосується конструкторів, призначення та викликів методів, то IDE PyCharm досить добре аналізує мій вихідний код та з'ясовує, яким типом має бути кожна змінна. Мені подобається, коли це правильно, тому що він дає мені гарну інформацію про доповнення коду та параметрів, і дає мені попередження, якщо я намагаюся отримати доступ до атрибута, який не існує.

Але коли мова йде про параметри, то вона нічого не знає. У спадному списку заповнення коду нічого не може бути показано, оскільки вони не знають, яким буде тип параметра. Аналіз коду не може шукати попереджень.

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

Це має певний сенс. Інші сайти викликів можуть передавати що-небудь для цього параметра. Але якщо мій метод очікує, що параметр має тип, скажімо, pygame.Surfaceя хотів би мати змогу якось вказати це на PyCharm, щоб він міг показати мені всі Surfaceатрибути в його спадному коді, і виділити попередження, якщо Я називаю неправильним методом тощо.

Чи є спосіб я надати підказку PyCharm і сказати "psst, цей параметр повинен бути типу X"? (Або, можливо, в дусі динамічних мов "цей параметр повинен хитатися, як X"? Я б з цим добре.)


EDIT: Відповідь CrazyCoder, наведена нижче, робить трюк. Для будь-яких новачків, таких як я, які хочуть швидкого резюме, ось це:

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.

Відповідна частина - @type peasant: Personлінія докстрингу.

Якщо ви також перейдете у меню Файл> Налаштування> Інтегровані інструменти Python і встановіть для "Формат докстрингу" значення "Епітекст", тоді перегляд PyCharm> Швидкий пошук документації дозволить надрукувати інформацію про параметри замість того, щоб просто надрукувати всі @ -lines як є.


7
Слід зазначити, що в коментарі reStructuredText використовуються одні і ті ж теги, написані по-різному: @param xx: yyyстає :param xx: yyy. Дивіться jetbrains.com/pycharm/webhelp/…
Wernight

1
Чому ми можемо піти, не вказавши повністю кваліфіковану назву класу?
Джесвін Хосе

Відповіді:


85

Так, ви можете використовувати спеціальний формат документації для методів та їх параметрів, щоб PyCharm міг знати тип. Останні версії PyCharm підтримують найпоширеніші формати doc .

Наприклад, PyCharm витягує типи з коментарів до стилю @param .

Дивіться також ReStructuredText і рядок документації конвенції (PEP 257).

Інший варіант - примітки Python 3.

Будь ласка , зверніться до розділу PyCharm документації для отримання більш детальної інформації та зразків.


2
Я думаю, PyCharm трохи змінив формат doc (див. Jetbrains.com/help/pycharm/… ), але дякую! Відсутність інтелігентності параметрів зводило мене з розуму.
заглушки

46

Якщо ви використовуєте Python 3.0 або пізнішої версії, ви також можете використовувати примітки щодо функцій та параметрів. PyCharm інтерпретуватиме їх як тип аргументів або повернених значень:

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

Іноді це корисно для непублічних методів, яким не потрібна докстринг. Як додаткову перевагу, до цих приміток можна отримати доступ за кодом:

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

Оновлення : Станом на PEP 484 , прийнятого для Python 3.5, офіційним умовою є також визначення аргументів та типів повернення за допомогою приміток.


4
... і є декілька пакунків, які використовують такі антонації для перевірки типу виконання. Це і зручніше у використанні, і легше для читання, ніж те, що робити те саме за твердженнями, і може бути вибірково використане так само. typecheck-decoratorє одним з таких пакетів і містить підсумок інших у своїй документації. (Гнучка теж: ви навіть можете перевірити набір качок, перевірених типом!)
Lutz Prechelt

5

PyCharm витягує типи з рядка pydoc @type. Дивіться документи PyCharm тут і тут , і документи Epydoc . Він знаходиться у розділі "спадщина" PyCharm, можливо, йому не вистачає певної функціональності.

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.

Відповідна частина - @type peasant: Personлінія докстрингу.

Мій намір не красти очки у CrazyCoder або оригінального запитувача, явно не давати їм своїх балів. Я просто думав, що проста відповідь має бути в слоті "відповідь".


2

Я використовую PyCharm Professional 2016.1, пишучи код py2.6-2.7, і я виявив, що за допомогою reStructuredText я можу виражати типи більш вдалим способом:

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.

Дивіться: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.