Какво да направите, ако модулът, от който се нуждаете, поддържа само Python 2: ръководство стъпка по стъпка

Ето малка инструкция как да решите доста често срещан проблем: докато работите по проект, се оказва, че един от модулите, от които се нуждаете, не поддържа Python 3. Например, клиентската библиотека за Qualys (инструмент за сигурност) е взета. Ето какво трябва да направите:

0. Уверете се, че проблемът все още е висящ

Преди да започнете, проверете дали някой друг е срещал същия проблем преди, като изследвате GitHub. Разгледайте - може би PyPi има подходящ пакет, който съдържа актуализации за Python 3.

1. Направете вилица

Ако търсенията все още не доведоха до нищо, продължете да променяте избрания модул. Струва си да се отбележи, че PyPi обикновено изброява поддържаните версии на Python. За модули, които работят само с Python 2, тази информация често се пропуска. В този пример тази част от описанието на модула изглежда така:

Така че отворете основния си проект на GitHub. Преди да правите някакви промени, не забравяйте да го разклоните, след това изтеглете или клонирайте хранилището и създайте нов клон. Говорещото име за него ще бъде например "python3".

2. Поправете отчетите за печат

Първото нещо, което трябва да разберете, преди да решите проблеми с импорта, са най-често срещаните изходни изрази. Старите отчети за отпечатване без скоби са едно от най-често срещаните препятствия, които може да срещнете в контекста на мигриране от Python 2 към Python 3. В третата стъпка ще използваме пакета Python-Modernize, за да улесним този преход, но няма засягат README, документацията и някои други файлове. За да намерите абсолютно всички стари отпечатъци в модул, използвайте рекурсивно търсене в поддиректории:

3. Провеждане на тестове

"Най-добрият" начин за тестване на съвместимостта на Python 2 и 3 е чрез пълно тестване и CI услуги като Circle, Snap или Travis. Но лош късмет - няма тестове за модула, който надграждате. И вие имате две възможности:

  • пишете тестове сами;
  • провеждане на статичен анализ на кода.

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

Статичен анализ. Инсталирайте Python-Modernize:

Първо го стартирайте в информационен режим:

Това ще ви даде обща представа за това какви промени ще бъдат направени. Всичко ме устройва? След това стартирайте процеса на промяна със следната команда:

След това направете отделен ангажимент от тях.

Добавяне на тестове. Първа проверка: възможно ли е да импортирате модул, пакет, подмодул? Този тест разкрива много проблеми с пространството от имена в Python 3. Използвайте Tox, за да тествате в различни среди.

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

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

4. Актуализирайте setup.py

Отворете setup.py и вижте какви промени трябва да направите, за да декларирате уверено, че модулът, който преглеждаме, сега поддържа Python 3:

На какво точно си струва да се обърне внимание:

  1. В горния код бяха намерени както лицензът BSD, така и лицензът Apache 2. В същото време кодовите файлове казват Apache 2, а директорията изобщо не съдържа файла LICENSE. Тази ситуация може да възникне поради грешка, свързана с copy-paste, така че в този случай е логично да я поправите в setup.py и след това да добавите съответния LICENSE файл.
  2. Маркировката в PyPi не се показва. Можете да живеете с него, можете да добавите RST файл. Най-важното е, че не забравяйте, че това все още не е вашият проект.
  3. Не е написано коя версия на Python модулът поддържа. Добавете тази информация към setup.py.
  4. Използването на Python-Modernize означава, че този модул зависи от шестте пакета. Проверете това в полето install_requires. И в същото време проверете дали всички пакети, посочени там, от които зависи модифициращият се модул, също поддържат Python 3.

Нека да видим какво се случи:

5. Заредете в основния проект

Да се ​​върнем към началото. Докато работите по проекта си, се натъкнахте на факта, че един от модулите не поддържа Python 3. Отървахте се от проблеми със съвместимостта, сега трябва да посочите актуализираната версия на модула във файла requirements.txt. Уверете се, че първо натиснете промените в GitHub. Това се прави с командата:

Pip ви позволява да инсталирате това, от което се нуждаете, не само от PyPi, но и директно от хранилището на Git. Можете да посочите конкретен клон, като използвате символа @. Параметърът egg = се използва за предаване на името на пакета на Pip.

На този етап можете да продължите да изпълнявате тестовете за интеграция за новата версия.

6. Изпратете заявка за изтегляне

Ето заявка за изтегляне, която се оказа въз основа на разглеждания пример. Изчакайте вашите промени да бъдат включени в проекта, след това изчакайте да се появи актуализация на PyPi. (Или по-скоро се надявам да се появи там.)