Лучшая практика для определения типа метода в python

В python типы параметров метода указывать не нужно. Python динамически интерпретирует их.

Но в некоторых фрагментах кода я вижу определяемый тип.

def method(p1: int, p2: int) -> None

1) Зачем это сделано 2) для других структур данных мне нужно определить только структуру данных, а не тип параметров, которые она принимает

def multiply(num1: list, num2: list):

Почему цель такой конструкции.

и почему мне не разрешено определять тип списка

def multiply(num1: list[int], num2: list[int]):

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

roganjosh 13.04.2019 12:52

возможный дубликат: stackoverflow.com/questions/32557920/…

hiro protagonist 13.04.2019 12:54

В последней части вашего вопроса вы должны использовать List[int] из модуля ввода, чтобы указать тип элементов в различных коллекциях.

Tomáš Zahradníček 13.04.2019 12:55

@TomášZahradníček Я получаю обратно ошибку определения умножения (num1: List[int], num2: list): NameError: имя «Список» не определено

Sree 13.04.2019 12:56

@Сри from typing import List

gmds 13.04.2019 12:57

@gmds в чем разница между использованием list и List?.

Sree 13.04.2019 13:02

@Sree Ну, главное, что нельзя делать list[int] как подсказку типа; это синтаксическая ошибка. Поэтому существует специальный тип typing.List, который вы импортируете только для подсказки типа.

gmds 13.04.2019 13:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
1 064
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Из Документация:

A type alias is defined by assigning the type to the alias. In this example, Vector and List[float] will be treated as interchangeable synonyms:

from typing import List
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])

Итак, дело в том, что вы должны from typing import List, а затем вы можете использовать List[int] или любой другой тип, который вы хотите

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

Дополнительные пояснения:

Подсказка типа предназначена исключительно для того, чтобы сделать код более читабельным и понятным для человеческого глаза. Насколько я знаю, List или любой другой тип, определенный в typing, возможно, даже не реализовал какую-либо логику или структуру данных.

насколько отличается список от списка.

Sree 13.04.2019 16:30
list — это встроенный тип. List — это тип, определенный в typing, который распознается typing для целей подсказки типа. Они не имеют ничего общего друг с другом, за исключением того, что у них одинаковое имя, поэтому, когда вы видите List[int], вы понимаете, что он ожидает list из ints.
Amir 13.04.2019 16:59

Подсказка типа очень полезна, чтобы убедиться, что полученный параметр соответствует вашим ожиданиям. это похоже на контракт или политику, описывающую, как ваша функция хочет работать с параметрами ... и, как правило, в большинстве случаев это связано с ООП.

Представьте, что ваша функция зависит от другого объекта и знает, что этот объект содержит метод с именем foo.

 class MyObject:
     def foo():
       print("called")


 def my_method(obj: MyObject):
     obj.foo()

мы вызываем метод foo с уверенностью, потому что мы принимаем только объект, созданный из класса MyObject, который, как мы точно знаем, содержит метод foo

Для выполнения скрипта аннотации типов не имеют значения (они отбрасываются интерпретатором).

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

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

Другие вопросы по теме