Как я могу сказать PyCharm, какой тип параметра ожидается?
когда дело доходит до конструкторов, назначений и вызовов методов, 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атрибуты в раскрывающемся списке завершения кода и выделяют предупреждения, если я вызываю неправильный метод, и так далее.
есть ли способ I может дать 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 и установите "формат Docstring" в "Epytext", затем представление PyCharm > быстрый поиск документации будет довольно-печатать информацию о параметрах вместо того, чтобы просто печатать все @-строки как есть.
5 ответов:
Да, вы можете использовать специальный формат документации для методов и их параметров, чтобы PyCharm мог знать тип. Недавняя версия PyCharm поддерживает наиболее распространенные форматы doc.
например, PyCharm извлекает типы из @param style comments.
см. также reStructuredText и docstring conventions (PEP 257).
другой вариант-аннотации Python 3.
пожалуйста см. раздел документации PyCharm для более подробной информации и образцов.
Если вы используете 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иногда это полезно для непубличных методов, которые не нуждаются в docstring. В качестве дополнительного преимущества, эти заметки могут быть доступны с помощью кода:
>>> King.repress.__annotations__ {'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}обновление по состоянию на PEP 484, который был принят для Python 3.5, это также официальное соглашение для указания аргументов и возвращаемых типов с помощью аннотаций.
PyCharm извлекает типы из строки @ type pydoc. см. PyCharm docs здесь и здесь и Epydoc docs. Он находится в разделе "наследие" 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 или оригинального вопрошающего, во что бы то ни стало дать им свои очки. Я просто подумал, что простой ответ должен быть в слоте "ответ".
Я использую 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
вы также можете утверждать для типа, и Pycharm выведет его:
def my_function(an_int): assert isinstance(an_int, int) # Pycharm now knows that an_int is of type int pass
Comments