4 проверки от тип Python, за да поддържате кода си чист

В началото Python нямаше типови декорации. Това се вписва в общата цел да направи езика бърз и лесен за работа, с гъвкави типове обекти, които приспособяват обратите на писането на код и помагат на разработчиците да поддържат кода си кратък.

През последните няколко години обаче Python добави поддръжка за анотации на типове, вдъхновявайки цяла култура от софтуер, посветен на проверка на типа Python по време на разработката. Python не проверява типовете по време на изпълнение - поне още не. Но като се възползвате от добра проверка на типа, карайки пушка с вас в избраната от вас IDE, можете да използвате анотациите на типа на Python, за да разкриете много често срещани грешки, преди те да попаднат в производството.

В тази статия ще разгледаме четири от основните добавки за проверка на типа за Python. Всички следват приблизително един и същ модел, сканирайки Python кода с типови анотации и предоставяйки обратна връзка. Но всеки предлага свои собствени полезни допълнения към основната концепция.

Mypy

Mypy е може би първата система за проверка на статичен тип за Python, тъй като работата по нея започва през 2012 г. и все още е в процес на активно развитие. По същество това е прототипът за това как библиотеките за проверка на тип на трети страни работят в Python, дори ако много други са се появили оттогава и са разширили своите функции.

Mypy може да работи самостоятелно или от командния ред, или може да работи като част от интеграцията на редактор или интеграция на IDE. Много редактори и IDE интегрират Mypy; Разширението на Python на Visual Studio Code може да работи директно с него. Когато се изпълнява, Mypy генерира отчети за последователността на вашия код въз основа на информацията за типа, която предоставя.

Ако вашият код не включва анотации на типа, Mypy няма да извърши по-голямата част от своите проверки на кода. Можете обаче да използвате Mypy, за да маркирате неанотиран код. Това може да се направи с различна степен на строгост в зависимост от нечии нужди.

Ако започвате от нулата с кодова база и искате превантивно агресивна стратегия за свързване, можете да използвате --strictопцията, за да предотвратите нетипизиран код. От друга страна, ако работите с наследена кодова база, която няма много дефиниции на типове, можете да използвате по-спокойни опции, като например да предотвратите само нетипизирани дефиниции на функции, като  --disallow-untyped-defs същевременно разрешите други нетипизирани кодове. И винаги можете да използвате вградени коментари, като например # type: ignoreда предотвратите маркирането на отделни редове.

Mypy може да използва PEP 484 stub файлове, когато искате да използвате подсказки за тип за публичните интерфейси на модула. На всичкото отгоре Mypy предлага stubgenинструмент, който автоматично генерира stub файлове от съществуващ код. За нетипизиран код, заглушените файлове използват общи типове, които след това можете да маркирате при необходимост.

Питип

Pytype, създаден от Google, се различава от подобен на Mypy по използването на извод вместо дескриптори само на типа. С други думи, Pytype се опитва да определя типове, като анализира потока на кода, вместо да разчита стриктно на анотации на типове.

Pytype греши от страна на снизходителността, когато има смисъл да го прави. Ако имате операция, която работи по време на изпълнение и не противоречи на никакви анотации, Pytype няма да се заяжда за това. Това обаче означава, че някои проблеми, които трябва да бъдат маркирани (напр. Деклариране на променлива с тип в един момент и след това предефиниране в същия контекст), минават необявени. В документацията се посочва, че такива неща ще бъдат забранени в даден момент в бъдеще.

Ако решите да добавите анотации на типа към вашия код, тогава функцията на Pytype е  reveal_typeособено полезна. Ако вмъкнете израз в кода си, който чете reveal_type(expr), Pytype оценява exprи издава предупреждение, което описва неговия тип. 

Имайте предвид, че определени поведения на Pytype се контролират чрез добавяне на атрибути към самия код. Например, ако искате да спрете Pytype да се оплаква от липсващи атрибути или членове на модули, които са зададени динамично, трябва да добавите атрибута _HAS_DYNAMIC_ATTRIBUTES = Trueкъм въпросния клас или модул, вместо да зададете някакъв вид метаданни за конфигурация на Pytype.

Pyright / Pylance

Pyright е проверката на типа Python на Microsoft, включена като част от разширението Pylance за Visual Studio Code. Ако вече сте потребител на VS Code, разширението Pylance е най-удобният начин за работа с Pyright; просто го инсталирайте и тръгнете. Pyright осигурява добро всичко-в-едно проверка на типа и свързване на код, с много от същите удобства и аванси като предишните инструменти за анализ на Python.

Подобно на Pytype, Pyright може да работи с кодови бази, които нямат информация за типа. В тези случаи Pyright ще направи всичко възможно да направи заключение какви типове са в игра. По този начин все още можете да получавате добри резултати с Pytype на по-стари кодови бази без декларации за тип. Но с времето ще получавате по-добри резултати, докато постепенно добавяте анотации на типа към кода си.

Pyright е изключително гъвкав по начини, които допълват дизайна на реални проекти на Python. Както при другите типове проверки, Pyright може да бъде конфигуриран за всеки проект с форматиран в JSON конфигурационен файл в директорията на проекта. Отделните пътища могат да бъдат изключени (никога не проверявани) или игнорирани (грешките и предупрежденията са потиснати) в конфигурационния файл, а опциите са много подробни.

Във VS Code работните пространства с множество корени могат да имат своя собствена конфигурация на Pyright, в случай че различните части на проекта се нуждаят от различни конфигурации на свързване. В една и съща посока можете да дефинирате множество „изпълнителни среди“ в рамките на даден проект, всяка със собствени пътища на venv или импортиране.

Pyre 

Създаден от разработчици във Facebook и Instagram, Pyre всъщност е два инструмента в едно: проверка на типа (Pyre) и инструмент за статичен анализ на код (Pysa). Двамата са проектирани да работят ръка за ръка, за да осигурят по-високо ниво на проверка и анализ в сравнение с други инструменти, въпреки че потребителят трябва да направи малко тежко повдигане, за да се възползва напълно от тях.

Pyre използва подход, подобен на Pytype и Mypy. Нетипизираният код се обработва по-снизходително от въведения код, така че можете да започнете с нетипизирана кодова база на Python и да добавяте функция за анотации по функция и модул по модул. Включете „строг режим“ в модул и Pyre ще маркира всички липсващи пояснения. Или можете да зададете строг режим по подразбиране и да се откажете на ниво модул. Pyre също ще работи с мънички файлове в .pyi формат.

Pyre има мощна функция за мигриране на кодови бази към типизиран формат. Опцията за inferкоманден ред поглъща файл или директория, прави предположения за използваните типове и прилага поясненията към файловете. Първо ще искате да направите резервни копия на вашия код! (Ако искате да получите информация за типа от работеща програма на Python, можете да го направите с друг проект на Facebook / Instagram, MonkeyType.)

Докато характеристиките на Pyre отразяват тези на другите пакети, описани тук, Pysa е уникална. Pysa извършва „анализ на замърсяването“ на кода, за да идентифицира потенциални проблеми със сигурността, разчитайки на библиотека от анализи на потоци за определени софтуерни компоненти и код за маркиране, който изглежда уязвим. Всичко, докоснато от този код, също ще бъде маркирано като замърсено, въпреки че можете да посочите компоненти, които дезинфекцират данните и да премахнете тези данни от графата на замърсяванията.

Един недостатък е, че библиотеката на анализаторите на компоненти на трети страни на Pysa все още е малка, така че може да се наложи да създадете свой собствен модел. Но много от анализа на нечистотиите са за широко използван софтуер, като уеб рамката Django, SQL Alchemy ORM и библиотеката за наука за данни Pandas, да не говорим за анализи за често срещани проблеми с файловата система.

Как да направите повече с Python

  • Как да работите с типа данни на списъка на Python
  • Как да пакетирате приложения на Python с куфарче BeeWare
  • Как да стартирате Anaconda рамо до рамо с други Pythons
  • Как да използвам класовете данни на Python
  • Започнете с async в Python
  • Как да използвам asyncio в Python
  • 3 стъпки към основен ремонт на Python async
  • Как да използвам PyInstaller за създаване на изпълними файлове на Python
  • Урок за Cython: Как да ускорим Python
  • Как да инсталирате Python по интелигентен начин
  • Как да управлявате проекти на Python с поезия
  • Как да управлявате проекти на Python с Pipenv
  • Virtualenv и venv: Обяснени са виртуалните среди на Python
  • Python virtualenv и venv правят и не
  • Обяснение на нишките на Python и подпроцесите
  • Как да използвам Python дебъгер
  • Как да използвам timeit за профилиране на Python код
  • Как да използвам cProfile за профилиране на Python код
  • Как да конвертирате Python в JavaScript (и обратно)