Тип подсказки в Eclipse с PyDev
Я изучаю Python, после много опыта работы с PHP, и было бы удобно иметь тип-намек в Python. Похоже, Eclipse с PyDev этого не поддерживает. Какие-либо предложения?
Например, я хочу, чтобы моя IDE отображала функции docstrings и типы, когда я их использую, например:
def f(x: int) -> int:
r"""Adds 3 to x"""
return x + 3
f(# and now IDE shows everything about types
Ответы
Ответ 1
Python - динамически типизированный язык, где переменные типы не должны быть объявлены. Вы можете добавить информацию о ожидаемых типах, которые должны быть переданы функции в docstrings, хотя, например.
def f(x):
"""
@x: int
Adds 3 to x
returns an int
"""
return x + 3
Но в этом случае функция настолько проста, что мне не нужна какая-либо информация о типе, и просто документирование того, что она делает, часто предпочитается в python для документирования строгих типов.
pydev поддерживает докструмент (но не типы) и догоняет многие ошибки, пока вы открываете файлы python как часть проекта и не открываете их отдельно, перетаскивая их в Eclipse.
Вам нужно добавить папки, содержащие файлы python, щелкнув правой кнопкой мыши по корню проекта, выбрав пункт меню Properties
и выбрав PyDev - PYTHONPATH
в списке слева и нажав Add source folder
для всех папок с помощью python файлы. Обратите внимание, что pydev обычно может находить модули в любых подкаталогах, если в них есть __init__.py
, поэтому вам часто нужно добавлять корневую исходную папку python.
После этого вы получаете доступ к подсказкам, введя ctrl+space
, прежде чем вводить (
и автоматически заполнять предложенные аргументы функции, набрав ctrl+space
после ввода (
.
См. также руководство pydev на http://pydev.org/manual_101_root.html
Ответ 2
Присутствует Python 2/3
Для локальных переменных области и функциональных параметров PyDev имеет следующее:
assert isinstance(obj, MyClass)
obj. # here hint will work
Хотя я предполагаю, что это не задокументированная функция. Здесь PyDev официальная страница для подсказок типа и пара выдержек, которые иллюстрируют синтаксис Sphinx.
class Example:
def param(self, a):
''':type a: MyClass'''
def var(self, iterable):
for a in iterable: #: :type a: AnotherClass
pass
К сожалению, ни один из них не работает для членов класса.
Так как PyDev 4 также может быть похож на PEP-484 (см. ниже).
class LatestExample:
def listcase(self, param):
''':type param: list[str]'''
def dictcase(self, param):
':type param: dict[str, MyClass]'
Будущий Python 3
Взгляните на ответ @slushy. Без сомнения, это будущее. Но пока PyDev не поддерживает аннотации функций, PEP-3107, а также новый PEP-484, который демонстрирует @slushy. PEP-484 входит в Python 3.5 в некоторой ограниченной форме и в 3.6 в финале. Здесь BDFL презентация PyCon 2015 для типов подсказок и PEP-484.
Ответ 3
По состоянию на август 2014 года существует предложение от Guido Van Rossum для использования mypy синтаксис аннотирует тип в определениях функций, заявляя, что новый синтаксис действительно действителен. Python 3. Пример из его предложения (еще не PEP по состоянию на сентябрь 2014 г.)
from typing import List, Dict
def word_count(input: List[str]) -> Dict[str, int]:
result = {} #type: Dict[str, int]
for line in input:
for word in line.split():
result[word] = result.get(word, 0) + 1
return result
Ответ 4
Я не знаю о каких-либо способах ввода типов в Python.
Стандартная практика Питонов такова:
>>> def adds_three(number):
... '''Returns number + 3'''
... return number + 3
...
Примечание. Я сделал следующее:
- Имя функции ясно для ее поведения
- Имя аргумента ясно, что это должно быть
- В docstring подробно описано, что делает функция
- Python - динамически типизированный язык. Зачем ограничивать пользователя целым? Плавающие точки также поддерживают оператор
+
. Пусть они используют его.
Одна хорошая вещь в динамической типизации заключается в том, что все методы наследуются перегруженными. Конечно, вы всегда можете выполнять проверку типов в функции, чтобы предотвратить фатальные ошибки.
Ответ 5
reStructuredText, epytext и python3 аннотации могут определять ожидаемые типы в коде Python и поддерживаются различными интегрированными средами разработки, такими как pycharm. Это особенно удобно для определения имен классов, поскольку это позволяет автозаполнять элементы.
Простой пример в epytext:
def x_intercept(m, b):
"""
Return the x intercept of the line M{y=m*x+b}. The X{x intercept}
of a line is the point at which it crosses the x axis (M{y=0}).
@type m: float
@param m: The slope of the line.
@type b: number
@param b: The y intercept of the line. The X{y intercept} of a
line is the point at which it crosses the y axis (M{x=0}).
@rtype: number
@return: the x intercept of the line M{y=m*x+b}.
"""
return -b/m