TL; DR – Если вы работаете над большим проектом Python или просто хотите, чтобы ваша кодовая база аккуратно и аккуратно, Pytype это инструмент для вас.
Python – это отличный язык программирования для прототипов и сценариев. Краткий синтаксис, гибкий тип типа и интерпретированной природы позволяет быстро попробовать идею, настраивать его и повторить попытку.
Когда Python Projects расти , Гибкость, которая когда-то была на скорости, становится нагрузкой на скорость развития. Поскольку дополнительные разработчики присоединяются к проекту, и написано больше кода, отсутствие информации о типе затрудняет чтение и понять код. Без системы проверки типа ошибки легко сделать и трудно поймать.
Pytype на помощь! Pytype – это инструмент с открытым исходным кодом для проверки типа и типа вывода в Python. И это работает вне коробки – просто установите и беги!
Pytype будет …
- Статически выводят данные о типе и проверьте ваш код для ошибок типа.
- Проверьте аннотации типа PEP 484 в вашем коде для согласованности.
- Объединить Информацию о выведенном введите данные в свой код, Если вы хотите Отказ
Если вы проданы, продолжайте и посетите 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 Отказ
Спасибо за прочтение!