Python 2.x to 3.x migratie, hoe doe je dat?

Bij het migreren van Python 2.x applicaties naar 3.x komt vaak heel wat kijken.

Bij het migreren van Python 2.x applicaties naar 3.x komt vaak heel wat kijken.

Natuurlijk hangt de complexiteit van verschillende factoren af, maar vaak blijkt de omvang van het werk een stuk groter te zijn als je er eenmaal aan begint.

Voorbereiding

Om inzicht te krijgen in de uitgangspositie is het goed om de volgende vragen te beantwoorden:

Hoeveel regels code bevat het project?

Het is een zeer elementaire maatstaf, maar het aantal regels code in een project is nog steeds een goede indicator van complexiteit.

Wat is de huidige Python versie compatibiliteit?

Op basis van de hoogste Python-versie waarmee de software momenteel werkt, kan worden bepaald wat voor veranderingen er in de code moeten worden aangebracht.

Wat is de gewenste Python versie compatibiliteit?

In eerste instantie zou u kunnen denken dat de laatste Python-versie de beste keuze is, maar er zijn een aantal factoren die de keuze kunnen beïnvloeden. Zo kan bijvoorbeeld het systeem waarop de toepassing zal draaien, een bepalende factor zijn. Op dit moment is bijvoorbeeld Python 3.9 de meest recente versie, maar Ubuntu 20.04 wordt geleverd met 3.8. Bovendien moet de toepassing wellicht kunnen draaien op een groot aantal systemen met verschillende Python-versies en misschien zelfs Python 2.x. Is dit laatste het geval, dan is de migratie het moeilijkst en wordt de druk op het testen extra hoog.

Wat zijn de afhankelijkheden/gebruikte bibliotheken en hun versies?

Naast de code in de applicatie zelf, zijn de gebruikte bibliotheken een belangrijke bepalende factor voor het uit te voeren werk. Bij het inventariseren van de gebruikte bibliotheken zult u per bibliotheek tot een van de volgende bevindingen komen:

De bibliotheek is al voorwaarts compatibel met de gewenste Python versie, en dus hoeft u niets te doen.

Er is een nieuwe versie van de bibliotheek beschikbaar die compatibel is met de gewenste Python-versie. U kunt dus upgraden naar de nieuwere versie, maar de kans is groot dat de interface zal veranderen. Dan moet u alle code die deze bibliotheek gebruikt, doornemen en aanpassen aan de nieuwe interface.

Er is geen nieuwe versie van de bibliotheek beschikbaar. Dit betekent dat u op zoek zult moeten gaan naar een vervanging die compatibel is met Python 3.x. Als er geen alternatief is, zult u uw eigen implementatie van de vereiste functionaliteit moeten maken.

Welke tests zijn er en wat is de code dekking?

When software is changed, it should always be possible to test whether the new functionality works and whether the old functionality has failed. Aangezien een migratieproject meestal gevolgen heeft voor alle componenten van de software, is dit zeer belangrijk.

Als u de antwoorden op bovenstaande vragen hebt, kunt u een veel betere schatting maken van de hoeveelheid werk en kunt u een duidelijk stappenplan opstellen.

Implementatie

Zodra u een goed inzicht hebt in de complexiteit, de vereisten en een tijdschema, kunt u beginnen te werken aan de implementatie. Maar voordat je aan de code gaat sleutelen, moet je ten minste 2 dingen op orde hebben:

De code moet in een versiebeheersysteem staan, zoals git, bijvoorbeeld. Op die manier kunt u altijd teruggaan naar een eerdere versie als er iets misgaat, en kunt u de veranderingen in de loop van de tijd zien. Dit is enorm waardevol om te begrijpen hoe een defect is ontstaan.

U moet geautomatiseerde tests hebben om snel te kunnen nagaan of uw wijzigingen in de code geen negatieve gevolgen hebben.

Naast geautomatiseerde tests wilt u zoveel mogelijk gebruik maken van andere geautomatiseerde hulpmiddelen. Een van de belangrijkste is het standaard migratiehulpmiddel “2to3” (https://docs.python.org/3.9/library/2to3.html), dat met Python wordt meegeleverd. Dit hulpmiddel biedt een reeks zogenaamde “fixers” om een groot deel van de code automatisch om te zetten in geldige Python 3-code. Merk op dat deze code dan niet meer achterwaarts compatibel is met, laten we zeggen, Python 2.7. Als uw toepassing deze achterwaartse compatibiliteit nodig heeft, dan kan ‘zes’ (https://pypi.org/project/six/) helpen. Het is vergelijkbaar met ‘2to3’ maar zorgt ervoor dat de code compatibel is met zowel Python 2.7 als Python 3.3+.

Met al deze hulpmiddelen kunnen risico’s zoveel mogelijk worden beperkt en kan het werk zo snel mogelijk worden gedaan, maar uiteindelijk zullen er echt altijd codeconstructies overblijven die met de hand moeten worden aangepast. Dit is waar expertise in zowel Python 2.x als Python 3.x om de hoek komt kijken.

Bij Hendrikx-ITC hebben we meer dan 15 jaar ervaring met Python en migraties van Python 2.x naar Python 3.x. Als u hulp nodig hebt bij uw migratieproject, kunt u altijd een beroep doen op onze expertise.