Как узнать тип возвращаемого значения функции и типы аргументов?

90

Хотя мне известно о концепции Python «утиная типизация», я иногда борюсь с типом аргументов функций или типом возвращаемого значения функции.

Теперь, если я сам написал функцию, я ДЕЙСТВИТЕЛЬНО знаю типы. Но что, если кто-то захочет использовать и вызвать мои функции, как он / она должен знать типы? Я обычно помещаю информацию о типе в строку документации функции (например: "...the id argument should be an integer..."и "... the function will return a (string, [integer]) tuple.")

Но действительно ли поиск информации в строке документации (и размещение ее там, как кодировщик) так, как предполагается?

Изменить: в то время как большинство ответов, похоже, направлены на «да, документ!» Я считаю, что «сложным» типам это не всегда легко.
Например: как кратко описать в строке документации, что функция возвращает список кортежей с каждым кортежем формы (node_id, node_name, uptime_minutes) и что элементы являются соответственно строкой, строкой и целым числом?
Документация Docstring PEP не дает никаких указаний по этому поводу.
Думаю, контраргументом будет то, что в этом случае следует использовать классы, но я считаю python очень гибким, поскольку он позволяет передавать эти вещи с помощью списков и кортежей, то есть без классов.

Рабарберски
источник
2
Краткий ответ - да". Длинный ответ - «да, конечно». Я не знаю, много ли вы смотрели код Python, но вам, вероятно, следует обновить вопрос, чтобы указать, какие пакеты вы действительно используете, чтобы мы могли направить вас к коду, который вы можете прочитать, чтобы увидеть, как что-то делается в коде библиотеки, который вы Использую прямо сейчас.
S.Lott
@ S.Lott: В настоящее время я борюсь с пакетом Mechanize, но я думаю, что он (к сожалению) плохо документирован.
Rabarberski
6
Python крутой, потому что вы можете быстро писать много кода, и вам не нужно беспокоиться о таких повседневных вещах, как типы возвращаемых значений, типы аргументов, производительность во время выполнения, людей, которые должны использовать и поддерживать ваш спагетти-код в течение следующих 10 лет и т. Д. .
jarmod

Ответы:

128

Что ж, с 2011 года все немного изменилось! Теперь в Python 3.5 есть подсказки типов, которые вы можете использовать для аннотирования аргументов и возврата типа вашей функции. Например это:

def greeting(name):
  return 'Hello, {}'.format(name)

теперь можно записать так:

def greeting(name: str) -> str:
  return 'Hello, {}'.format(name)

Как вы теперь можете видеть типы, есть своего рода дополнительная статическая проверка типов, которая поможет вам и вашей программе проверки типов исследовать ваш код.

для получения дополнительных объяснений я предлагаю взглянуть на сообщение в блоге о подсказках типов в блоге PyCharm .

Rsh
источник
Обратите внимание, что синтаксис подсказки типов также был предложен для Python 2.7 здесь, в том же PEP-0484. И это работает в PyCharm, по крайней мере, с версии 2017.3.
viddik13
1
Если функция приветствия с точно таким же определением возвращает объект типа int, ошибки не возникает. Итак, каково использование такого типа проверки, если вы явно указываете возвращаемый тип, но не подчиняетесь правилу и возвращаете другой тип объекта?
Arashsyh
3
@Arashsyh: Да, вы правы, подсказка типов не превращает Python в статически типизированный язык, вам решать, использовать правильные типы правильным образом. И эти подсказки по типу помогут вам быстрее разрабатывать, самостоятельно документировать код или получать предупреждения, когда вы что-то испортили. Особенно, когда вы используете PyCharm (или аналогичную IDE), он предупредит вас, если вы используете другой тип, и поможет в некоторых других вещах. Я рекомендую прочитать сообщение в блоге, предложенное в ответе выше.
Nerxis
Это быстрее в вычислительном отношении?
Брайс Уэйн
18

Так работают динамические языки. Это не всегда хорошо, особенно если документация плохая - кто-нибудь пробовал использовать плохо документированный фреймворк Python? Иногда приходится возвращаться к чтению первоисточника.

Вот несколько стратегий, которые помогут избежать проблем с набором текста:

  • создайте язык для своей проблемной области
  • это поможет вам правильно называть вещи
  • использовать типы для представления концепций на языке вашей предметной области
  • параметры функции имени с использованием словаря языка домена

Также один из самых важных моментов:

  • сохраняйте данные как можно более локальными!

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

Связанный (а также связанный с строками документации) в python есть метод, называемый doctests. Используйте это, чтобы задокументировать, как предполагается использовать ваши методы - и в то же время получить хорошее покрытие модульным тестом!

Дарен Томас
источник
1
Документация Numpy - хороший репрезентативный пример философии, изложенной в ответе выше.
Джерри Аджай
7

Я ходил на курс Coursera, там был урок, нас учили рецепту дизайна.

Приведенный ниже формат строки документации я нашел полезным.

область определения (база, высота):
    '' '(число, число) -> число # ** TypeContract **
    Возвращает площадь кольца с указанием размера базы # ** Описание **
    и высота

    >>> area (10,5) # ** Пример **
    25,0
    >> площадь (2.5,3)
    3,75
    '' '
    возврат (основание * высота) / 2 

Я думаю, что если строки документации будут написаны таким образом, это может очень помочь разработчикам.

Ссылка на видео [Смотрите видео] : https://www.youtube.com/watch?v=QAPg6Vb_LgI

Сумит Мурари
источник
5

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

Подробнее: http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring

Некоторые редакторы позволяют видеть строки документации во время набора текста, что действительно упрощает работу.

Мацей Зярко
источник
+1: задокументируйте это, это единственный разумный способ, и то же самое относится и к языкам со статической типизацией. Типы возвращаемых данных - это незначительная часть всей картины.
Detly
Мне нравятся мои типы, большое спасибо. Документация + типы = небо
masm64
2

Да, именно так.

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

Точно так же параметры не всегда должны быть одного типа.

thomson_matt
источник
1

Например: как кратко описать в строке документации, что функция возвращает список кортежей с каждым кортежем формы (node_id, node_name, uptime_minutes) и что элементы являются соответственно строкой, строкой и целым числом?

Гм ... "Краткого" описания этого нет. Это сложно. Вы сделали его сложным. И для этого требуется сложная документация в строке документации.

Извините, но сложность ... ну ... сложная.

С.Лотт
источник
3
ХОРОШО. Не по теме (вроде): но что тогда будет более чистым дизайном? Классы?
Rabarberski
@Rabarberski: Не обязательно. Сложность здесь кажется неизбежной. Лаконичность не всегда достижима или даже желательна.
S.Lott
1
Очевидный способ задокументировать такие вещи - использовать что-то похожее на универсальные Java-шаблоны, например: list <tuple <int, str, int >>. Но это не тот путь Python, к лучшему или к худшему.
Skyler 05
0

Да, поскольку это язык с динамическим типом;)

Прочтите это для справки: PEP 257

Алоис Кочар
источник
0

Строки документации (и документация в целом). Python 3 вводит (необязательные) аннотации функций, как описано в PEP 3107 (но не оставляйте строки документации)

Стивен
источник