Лучшие практики для определения типа метода в Python - PullRequest
2 голосов
/ 13 апреля 2019

В 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]):

Ответы [ 3 ]

3 голосов
/ 13 апреля 2019

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

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

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

2 голосов
/ 13 апреля 2019

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

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

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


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

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

2 голосов
/ 13 апреля 2019

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

Псевдоним типа определяется путем присвоения типа псевдониму. В этом примере Vector и List [float] будут обрабатываться как взаимозаменяемые синонимы:

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] или любой другой тип, который вам нужен

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

Более подробное объяснение:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...