Как узнать тип возвращаемого значения функции и тип аргумента?
Пока я понимаю концепцию Python, я иногда борюсь с типом аргументов функций или типом возвращаемого значения функции.
Теперь, если я сам написал функцию, я знаю типы. Но что, если кто-то захочет использовать и назвать мои функции, как он/она должен знать типы?
Я обычно помещаю информацию типа в функцию docstring (например: "...the id argument should be an integer..."
и "... the function will return a (string, [integer]) tuple."
)
Но ищет информацию в докштрине (и ставит ее там, как кодер) действительно так, как это должно быть сделано?
Изменить: Пока большинство ответов, похоже, направлено на "да, документ!". Я считаю, что это не всегда очень легко для "сложных" типов.
Например: как кратко описать в docstring, что функция возвращает список кортежей, с каждым кортежем формы (node_id, node_name, uptime_minutes) и что элементы являются соответственно строкой, строкой и целым числом?
Документация PEP документации docstring не дает никаких рекомендаций по этому вопросу.
Я думаю, что контраргумент будет заключаться в том, что в этом случае классы должны использоваться, но я нахожу python очень гибким, потому что он позволяет обходить эти вещи с помощью списков и кортежей, т.е. Без классов.
Ответы
Ответ 1
Ну, с 2011 года все немного изменилось! Теперь в Python 3.5 есть подсказки типа, которые вы можете использовать для аннотирования аргументов и возврата типа вашей функции. Например это:
def greeting(name):
return 'Hello, {}'.format(name)
теперь можно записать так:
def greeting(name: str) -> str:
return 'Hello, {}'.format(name)
Как вы теперь можете видеть типы, есть некоторая дополнительная статическая проверка типов, которая поможет вам и вашему контролеру типов исследовать ваш код.
для более подробного объяснения я предлагаю взглянуть на сообщение в блоге о подсказках типов в блоге PyCharm.
Ответ 2
Так работают динамические языки. Однако это не всегда хорошо, особенно если документация оставляет желать лучшего - кто-то пытался использовать плохо документированную структуру python? Иногда вам нужно вернуться к чтению источника.
Вот некоторые стратегии, чтобы избежать проблем с утиным типом:
- создать язык для проблемной области
- это поможет вам правильно назвать материал.
- использовать типы для представления понятий на вашем языке домена
- параметры функции имени с использованием лексики языка домена
Кроме того, одна из наиболее важных точек:
- сохранить данные как можно более локальными!
Должно существовать только несколько хорошо определенных и документированных типов. Все остальное должно быть очевидным, если посмотреть на код: не имеют странных типов параметров, издаваемых издалека, которые вы не можете понять, глядя в окрестности кода...
Связанный (а также связанный с docstrings), есть метод в python под названием doctests
. Используйте это, чтобы документировать, как будут использоваться ваши методы - и иметь приятный охват unit test в одно и то же время!
Ответ 3
Да, вы должны использовать docstrings, чтобы ваши классы и функции были более дружественными для других программистов:
Подробнее: http://www.python.org/dev/peps/pep-0257/#what-is-a-docstring
Некоторые редакторы позволяют вам видеть docstrings при наборе текста, поэтому это действительно облегчает работу.
Ответ 4
Я посетил курс курсеры, был урок, в котором нас учили дизайнерскому рецепту.
Ниже формата docstring я нашел полезные советы.
def area(base, height):
'''(number, number ) -> number #**TypeContract**
Return the area of a tring with dimensions base #**Description**
and height
>>>area(10,5) #**Example **
25.0
>>area(2.5,3)
3.75
'''
return (base * height) /2
Я думаю, что если docstrings написаны таким образом, это может сильно помочь разработчикам.
Ссылка на видео [смотреть видео]: https://www.youtube.com/watch?v=QAPg6Vb_LgI
Ответ 5
Да, это так.
В Python функция не всегда должна возвращать переменную того же типа (хотя ваш код будет более читабельным, если ваши функции всегда возвращают один и тот же тип). Это означает, что вы не можете указать один тип возврата для функции.
Таким же образом параметры не всегда должны быть одного и того же типа.
Ответ 6
Да, поскольку он динамически набирает язык;)
Прочтите это для справки: PEP 257
Ответ 7
Например: как кратко описать в docstring, что функция возвращает список кортежей, с каждым кортежем формы (node_id, node_name, uptime_minutes) и что элементы являются соответственно строкой, строкой и целым?
Ум... Нет такого "краткого" описания этого. Это сложно. Вы разработали его, чтобы быть сложным. И это требует сложной документации в docstring.
Извините, но сложность - хорошо - сложная.
Ответ 8
Докстры (и документация в целом). Python 3 вводит (необязательно) аннотации функций, как описано в PEP 3107 (но не оставляйте докстроны)
Ответ 9
Я много работал на Python, так что это не просто поверхностный ответ; Пожалуйста, используйте статически типизированный язык, такой как Go или TypeScript для производственного использования. Это ужас кодирования, пытающийся выяснить типы в любых немного сложных приложениях с динамически типизированными языками.