Рубрики

Постепенное печатание на Python

Постепенная типизация — это система типов, разработанная Джереми Секом и Валидом Таха в 2006 году, которая позволяет динамически печатать части программы и статически печатать другие части. Это означает, что программист может выбрать, какую часть программы он хочет проверить.

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

Зачем нам статическая проверка типов?

  • Чтобы быстрее находить ошибки в статически типизированной части программы
  • Чем больше проект, тем сложнее отлаживать ошибку типа времени выполнения
  • Это помогает понять программу для нового инженера в команде, так как в Python трудно следить за потоком объектов

Исходная информация:
В 2014 году Гвидо ван Россум вместе с Юккой Лехтосало и Лукашем Ланга сделали предложение PEP 484 для Типовых подсказок. Цель состояла в том, чтобы предоставить стандартный синтаксис для аннотаций типов, открывая код Python для упрощения статического анализа. В 2006 году в PEP 3107 уже был введен синтаксис для аннотаций функций, но семантика была намеренно оставлена неопределенной, поскольку не было ясного представления о том, как сторонний инструмент будет использовать ее.

План предложения:

  • Разработчик выбирает, использовать или нет отдельную программу под названием Static type Checker
  • Функциональные аннотации являются предварительными, используются только Статическими контролерами типов
  • Сторонние библиотеки, Стандартные библиотеки, C-расширения, Код, где владелец решает не аннотировать, для PY2-совместимости требуется время для аннотирования, в тех случаях, когда невозможно использовать аннотацию типов, разработчики могут делать фиктивные объявления классов и функции в отдельном файле, называемом Stub-файлом, который виден только Static Type Checker
  • Вдохновленный Mypy , статическим средством проверки типов, разработанным Юккой Лехтосало

Зачем нам нужны подсказки типа?

  • Чтобы помочь Type Checkers
  • Служить дополнительной документацией
  • Чтобы помочь IDE улучшить предложения и проверки кода

Несколько основных примеров для аннотаций функций:

Пример 1:

# Программа Python для демонстрации
# аннотации функций

  
# Установка типа аргументов и
# тип возврата в int

def sum(num1: int, num2: int) -> int:

    return num1 + num2

      
# не выдаст ошибку

print(sum(2, 3))

  
# вызовет ошибку TypeError

print(sum(1, 'Geeks'))

Выход:

5
Traceback (most recent call last):
  File "/home/1c75a5171763b2dd0ca35c567f855c61.py", line 13, in 
    print(sum(1, 'Geeks'))
  File "/home/1c75a5171763b2dd0ca35c567f855c61.py", line 7, in sum
    return num1 + num2
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Пример 1 — простая функция, аргумент и тип возвращаемой которой объявлены в аннотациях. Это утверждает , что ожидаемый тип аргументов num1 и num2 является int и ожидаемый тип возвращаемого значения является int . Выражения, тип которых является подтипом определенного типа аргумента, также принимаются для этого аргумента.

Пример 2:

# Программа Python для демонстрации
# аннотации функций

   
# Установка типа аргументов и
# тип возврата в str

def say_hello(name: str) -> str:

    return 'Hello ' + name

      
# не выдаст ошибку

print(say_hello("Geeks"))

  
# вызовет ошибку TypeError

print(say_hello(1))

Выход:

Hello Geeks
Traceback (most recent call last):
  File "/home/1ff73389e9ad8a9adb854b65716e6ab6.py", line 13, in 
    print(say_hello(1))
  File "/home/1ff73389e9ad8a9adb854b65716e6ab6.py", line 7, in say_hello
    return 'Hello ' + name
TypeError: Can't convert 'int' object to str implicitly

В примере 2 ожидаемый тип аргумента namestr . Аналогично, ожидаемый тип возвращаемого значения — str .

Несколько основных примеров для переменных аннотаций:
В PEP 484 введены подсказки типа, или аннотации типа. Хотя основное внимание было уделено аннотациям функций, оно также вводило понятие комментариев к комментариям для переменных:

Пример 1:

# Программа Python для демонстрации
# переменные аннотации

  
# объявление списка как
# типа int

  

l = []  # type: List [int]

  
# объявление переменной в
# be str type

  

name = None # тип: ул

Типы переменных выводятся инициализатором, хотя существуют неоднозначные случаи. Например, в примере 1, если мы не аннотируем переменную l которая является пустым списком, средство проверки статического типа выдаст ошибку. Аналогично, для неинициализированного name переменной необходимо присвоить его типу none вместе с аннотацией типа, в противном случае средство проверки статического типа выдаст ошибку.

В PEP 526 введен стандартный синтаксис для аннотирования типов переменных (включая переменные класса и переменные экземпляра) вместо их выражения в комментариях:
Пример 2:

# Программа Python для демонстрации
# переменные аннотации

  

l: List[int] = []

  

name: str

Пример 2 аналогичен примеру 1, но со стандартным синтаксисом, введенным в PEP 526, вместо стиля комментария типа аннотации для переменных. Обратите внимание, что в этом синтаксисе нет необходимости присваивать name переменной типу none.

Пример проверки статического типа:

Mypy — это средство проверки статического типа для Python 3 и Python 2.7. Используя синтаксис аннотации функции Python 3 (используя нотацию PEP 484) или синтаксис аннотации на основе комментариев для кода Python 2, вы сможете эффективно аннотировать свой код и использовать mypy для проверки кода на наличие распространенных ошибок.

Mypy требует Python 3.5 или более поздней версии для запуска. После установки Python 3 установите mypy с помощью pip:

$ python3 -m pip install mypy

После установки mypy запустите его с помощью инструмента mypy:

$ mypy program.py

Эта команда заставляет mypy type проверить ваш файл program.py и распечатать все найденные ошибки. Mypy будет типично проверять ваш код статически: это означает, что он будет проверять ошибки, даже не запуская ваш код, как линтер.

Хотя вы должны установить Python 3 для запуска mypy, mypy также полностью способна проверять тип кода Python 2: просто передайте флаг –py2.

$ mypy --py2 program.py

Примеры ошибок типов, генерируемых Mypy:

# Программа Python для демонстрации
# mypy

  

  

def sum(a: int, b: int) -> int:

    return a + b

  

sum( 1, '2') # Аргумент 2 для "sum" имеет несовместимый тип "str"; ожидаемое "int"

sum(1, b '2') # Аргумент 2 для "sum" имеет несовместимый тип "bytes"; ожидаемое "int"

Постепенное печатание в производственных приложениях:
Лукаш Ланга выступил с докладом о постепенном наборе текста в производственных приложениях на PyCascade-2018. Он дал предложения рабочего процесса, как показано ниже:

  • Предложение рабочего процесса № 1: найдите наиболее важные функции и начните вводить их первыми. Например, сначала вводите широко используемые функции и широко импортируемые модули, поскольку это позволяет более эффективно проверять код, использующий эти модули и функции.
  • Предложение рабочего процесса № 2: Включите раннюю проверку типа линтера на уровне файлов. Например, flake8-mypy представляет только ошибки типа, связанные с текущим файлом и стандартной библиотекой.
  • Предложение рабочего процесса № 3: Включите полную проверку типов программ при непрерывной интеграции для борьбы с регрессами. Например, выполните полную проверку кодовой базы с помощью mypy в рамках непрерывной интеграции, чтобы предотвратить ошибки типов в существующем коде из-за нового кода.
  • Предложение рабочего процесса № 4: Измерьте охват функции и количество исключений TypeError / AttributeErrorexceptions в рабочей среде. Это дает четкое представление о том, как приступить к постепенной типизации для оставшейся кодовой базы.

Вывод:

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

Рекомендуемые посты:

Постепенное печатание на Python

0.00 (0%) 0 votes