Как я могу сказать PyCharm, какого типа должен быть параметр? - PullRequest
167 голосов
/ 12 июня 2011

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

Но когда дело доходит до параметров,ничего не знаетВ раскрывающихся списках завершения кода ничего не отображается, потому что они не знают, какого типа будет параметр.Анализ кода не может искать предупреждения.

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»? Я бы с этим согласился.)


РЕДАКТИРОВАТЬ: CrazyCoder'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.

Соответствующей частью является строка @type peasant: Person строки документации.

Если вы также зайдете в File>Настройки> Интегрированные инструменты Python и установите «Формат Docstring» на «Epytext», затем PyCharm View> Quick Documentation Lookup будет просто печатать информацию о параметре, а не просто печатать все строки @ как есть.

Ответы [ 5 ]

82 голосов
/ 12 июня 2011

Да, вы можете использовать специальный формат документации для методов и их параметров, чтобы PyCharm мог знать тип. Последняя версия PyCharm поддерживает большинство распространенных форматов документов .

Например, PyCharm извлекает типы из @ комментариев в стиле param .

См. Также reStructuredText и условные обозначения строк (PEP 257).

Другой вариант - аннотации Python 3.

Пожалуйста, обратитесь к разделу документации PyCharm для получения более подробной информации и примеров.

46 голосов
/ 22 июля 2012

Если вы используете 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 голосов
/ 28 мая 2016

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 или оригинального спрашивающего, непременно дайте им свои очки.Я просто подумал, что простой ответ должен быть в ячейке «ответа».

1 голос
/ 20 ноября 2017

Вы также можете утверждать для типа, и Pycharm выведет его:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
1 голос
/ 14 декабря 2016

Я использую 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

...