Тип подсказки в Eclipse с PyDev - PullRequest
19 голосов
/ 24 апреля 2010

Я изучаю Python после большого опыта работы с PHP, и было бы удобно иметь подсказку типа в Python. Похоже, Eclipse с PyDev не поддерживает это. Какие-либо предложения?

Например, я хочу, чтобы в моей среде IDE отображались функции строки документов и типы , когда я их использую, например:

def f(x: int) -> int:
    r"""Adds 3 to x"""
    return x + 3

f(# and now IDE shows everything about types 

Ответы [ 5 ]

13 голосов
/ 24 апреля 2010

Python - это язык с динамической типизацией, где типы переменных не нужно объявлять. Вы можете добавить информацию о ожидаемых типах, предназначенных для передачи функции в строки документации, например, например,

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

12 голосов
/ 29 июля 2011

Настоящий Питон 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]'

Будущий Питон 3

Посмотрите на ответ @slushy. Без сомнения, это будущее. Но на данный момент PyDev не поддерживает ни аннотации функций, ни PEP-3107 , ни новые PEP-484 stuff @slushy. PEP-484 выйдет в Python 3.5 в некоторой ограниченной форме и в 3.6 в финале. Вот презентация BDFL PyCon 2015 для подсказок типа и PEP-484.

9 голосов
/ 29 сентября 2014

По состоянию на август 2014 года Гвидо Ван Россум предлагает использовать mypy синтаксический аннотированный тип в определениях функций, заявив, что новый синтаксис действительно допустим Python 3. Пример из его предложения (еще не ОПТОСОЗ по состоянию на сентябрь 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
1 голос
/ 24 апреля 2010

Мне неизвестно о каких-либо способах подсказки типов в Python.

Стандартная практика Pythonic это:

>>> def adds_three(number):
...     '''Returns number + 3'''
...     return number + 3
...     

Обратите внимание, я сделал следующее:

  • Имя функции понятно из-за ее поведения
  • Имя аргумента понятно относительно того, каким оно должно быть
  • Строка документации подробно описывает, что делает функция
  • Python - это динамически типизированный язык. Зачем ограничивать пользователя вводить целое число? Плавающие точки также поддерживают оператор +. Позвольте им использовать это.

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

0 голосов
/ 22 июля 2014

reStructuredText , epytext и python3 могут определять ожидаемые типы в коде Python и поддерживаются различными интегрированными средами разработки, такими как pycharm . Это особенно удобно для определения имен классов, поскольку позволяет автозаполнение членов.

Простой пример в эпитексте:

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
...