Подтвердить что ты не робот

Тип подсказки в 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 
4b9b3361

Ответ 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