Рубрики
Без рубрики

Как быстро найти проблемы типа в вашем Python Code с Pytype

Автор оригинала: Ehud Tamir.

TL; DR – Если вы работаете над большим проектом Python или просто хотите, чтобы ваша кодовая база аккуратно и аккуратно, Pytype это инструмент для вас.

Python – это отличный язык программирования для прототипов и сценариев. Краткий синтаксис, гибкий тип типа и интерпретированной природы позволяет быстро попробовать идею, настраивать его и повторить попытку.

Когда Python Projects расти , Гибкость, которая когда-то была на скорости, становится нагрузкой на скорость развития. Поскольку дополнительные разработчики присоединяются к проекту, и написано больше кода, отсутствие информации о типе затрудняет чтение и понять код. Без системы проверки типа ошибки легко сделать и трудно поймать.

Pytype на помощь! Pytype – это инструмент с открытым исходным кодом для проверки типа и типа вывода в Python. И это работает вне коробки – просто установите и беги!

Pytype будет …

  1. Статически выводят данные о типе и проверьте ваш код для ошибок типа.
  2. Проверьте аннотации типа PEP 484 в вашем коде для согласованности.
  3. Объединить Информацию о выведенном введите данные в свой код, Если вы хотите Отказ

Если вы проданы, продолжайте и посетите Pytype Для инструкций по установке и использованию. Ниже приведен несколько прохладных примеров использования!

Пример № 1: Введите вывод и проверку

Это самый распространенный сценарий. Вы написали какой-то код и хотите, чтобы устроиться, что вы не ошиблились. Рассмотрим эту функцию:

import re

def GetUsername(email_address):
  match = re.match(r'([^@]+)@example\.com', email_address)
  return match.group(1)

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

Посмотрим, что произойдет, когда мы используем Pytype Чтобы проверить это:

% pytype get_username.py
Analyzing 1 sources with 0 dependencies
File "/.../get_username.py", 
line 5, in GetUsername: No attribute 'group' on None [attribute-error]
  In Optional[Match[str]]

Pytype говорит нам, что Группа не допустимая функция вызова на Матч Отказ Ой! Re.match () Возвращает Нет когда совпадение не найдено. Действительно, в этих случаях Match.group (1) бросит исключение.

Давайте исправим ошибку, имея функцию возврата None для неверного адреса электронной почты:

import re
def GetUsername(email_address):
  match = re.match(r'([^@]+)@example\.com', email_address)
  
if match is None:
    return None
  return match.group(1)  # <-- Here, match can't be None

Теперь, когда мы повторно запускаем Pytype ошибка исчезла. Pytype Mapers, что если код после Если Выполняется, матч гарантируется не Нет Отказ

Пример № 2: Проверка аннотаций типа

В Python 3 вы можете набрать аннотировать ( PEP 484 ) Ваш код, чтобы помочь типовым инструментом и другие разработчики понять ваше намерение. Pytype может предупредить, когда ваши аннотации вашего типа имеют ошибки:

import re
from typing import Match

def GetEmailMatch(email) -> Match:
  return re.match(r'([^@]+)@example\.com', email)

Давайте использовать Pytype Чтобы проверить этот фрагмент кода:

% pytype example.py
Analyzing 1 sources with 0 dependencies
File "/.../example.py", line 5, in GetEmailMatch: 
bad option in return type [bad-return-type]
  Expected: Match
  Actually returned: None

Pytype говорит нам, что Getemailmatch может вернуться Нет , но мы аннотировали его возвращаемый тип как Матч Отказ Чтобы исправить это, мы можем использовать Необязательно Тип аннотации из модуля печати:

import re
from typing import Match, Optional

def GetEmailMatch(email) -> Optional[Match]:
  return re.match(r'([^@]+)@example\.com', email)

Необязательно означает, что возвращаемое значение может быть Матч объект или Нет Отказ

Пример № 3: Объединение Информации о выведенном типе.

Чтобы помочь вам принять аннотации типа, Pytype может добавить их в код для вас. Давайте посмотрим на этот фрагмент кода:

import re
  
def GetEmailMatch(email):
  return re.match(r'([^@]+)@example\.com', email)

def GetUsername(email_address):
  match = GetEmailMatch(email_address)
  if match is None:
    return None
  return match.group(1)

Чтобы добавить аннотации типа в этот код, мы сначала запускаем Pytype в файл. Pytype Сохраняет информацию о выведенном типе в .пью файл. Тогда мы можем запустить Merge-pyi объединить аннотации типа обратно в код:

% pytype email.py
% merge-pyi -i email.py pytype_output/email.pyi

И VUILà!

import re
from typing import Match
from typing import Optional

def GetEmailMatch(email) -> Optional[Match[str]]:
  return re.match(r'([^@]+)@example\.com', email)

def GetUsername(email_address) -> Optional[str]:
  match = GetEmailMatch(email_address)
  if match is None:
    return None
  return match.group(1)

Аннотации типа, в том числе Импорт Заявления, теперь в исходном файле.

Для получения дополнительных примеров и инструкций по установке, пожалуйста, посетите Pytype на Github Отказ

Спасибо за прочтение!