Python 2 dosáhl konce životnosti 1. ledna 2020. Python 3 je k dispozici od roku 2008, ale převod z 2 na 3 byl pomalý kvůli závislostem na knihovnách, které nebyly původně v Pythonu 3 dostupné, dřívější verze pythonu 3 byly pomalejší než python 2 a také proto, že Python 2 fungoval pro mnoho lidí docela dobře. Python 2 End of Life znamená, že již žádná podporovaná vydání a žádné opravy chyb z Pythonu. Některé distribuce Linuxu, jako je Ubuntu a Red Hat, budou nějakou dobu podporovat Python 2, ale lepší řešení je přechod na Python 3.
Myslel jsem, že Python 3 je zpětně kompatibilní s Pythonem 2?
Ne 100%. Změna z Pythonu 2 na Python 3 byla vzata jako příležitost k „opravě“ některých problémů s Pythonem 2. Mezi nimi byla jednotnější podpora Unicode v celém jazyce a vyjasnění některých problémů v syntaxi, jako je tisk, který je spíše příkazem než funkce.
Několik rozdílů mezi Pythonem 2 a Pythonem 3
Několik příkazů, jako je tisk, exec a další, bylo změněno na vestavěné funkce. Příklady:
print 'hello world' # valid python 2 not in python 3
print ('hello world') # valid python 3 and later versions of python 2
Celočíselné dělení bylo také změněno. Příklad:
print (5 / 2) # in python 2 result is 2 in python 3 result is 2.5
// byl přidán do pythonu 3, aby podporoval staré chování
Mnoho funkcí nyní vrací unicode/bajty v pythonu 3 místo řetězců ascii/str v pythonu 2. Příklad:
type (subprocess.checkout_output('cmd')) # returns <class 'bytes'> <class 'bytes'=""> in python 3 vs <type 'str'><type 'str'=""> in python 2
Chcete-li převést python 3
type (subprocess.check_output('ls').decode('ascii')) # will result in a <class 'str'><class 'str'=""> in python 3
Některé knihovny byly reorganizovány.
Např. Knihovna python2 urllib2 byla nahrazena urllib v pythonu 3. Urllib v Pythonu 3 je k dispozici také v modulech jako urllib.request a urllib.error, takže je můžete importovat a získat podobnou funkci jako python 2.
from urllib import urlopen # python 2
from urllib.request import urlopen # python 3
Převod z Pythonu 2 do Pythonu 3 většinou automaticky
I když můžete všechny změny pro převod python skriptu z pythonu 2 na python 3 provést ručně, existuje nástroj, který za vás udělá hodně těžké práce. 2to3 je balíček, který lze nainstalovat z knihovny pip a je také dostupný jako samostatný balíček v mnoha repozitářích distribucí. Instalace přes pip3
% pip3 install 2to3
Instalace na Debian/Ubuntu
% sudo apt install 2to3
Instalace na Fedora/CentOS
% sudo yum install 2to3
Poznámka:Instalací z pipu získáte nejnovější verzi, zatímco distribuční verze mohou být o něco starší, takže instalace pip vám může fungovat lépe.
Běh 2 až 3
$ 2to3 --help # will provide you the help message from the system
Několik zajímavých možností
-l # will provide a list of the fixes available in 2to3. E.g. print, exec, urllib, and others -x # explicitly not run a transformation, use if one of the "fixes" doesn't work for your code base -o # output dir, put transformed files into another location --add-suffix=SUFFIX # put a suffix on converted files --add-suffix='3', will convert .py files to .py3 files -w # overwrite current files with modified files
Za předpokladu, že máte adresář kódu python 2 (scripts) a cílovou složku pro kód python 3 (scripts3), můžete provést následující:Příkaz k provedení převodu je následující
% 2to3 scripts -n -w -o scripts3
Možnosti jsou následující
scripts - source dir -n - no backups -w - write-unchanged files, write file even if no changes are required by 2to3 -o - output directory scripts3 - output directory, where the converted scripts are written
Tímto způsobem se původní kód nezmění a uživatel může zkontrolovat převedený kód ve složce scripts3 a stále se také odvolávat na původní kód.
Modernize je obálka kolem 2 až 3
Má podobné chování jako 2to3 kromě toho, že podporuje příznak --six-unicode, který bude používat šest pomocných funkcí, které pomáhají s podporou Pythonu 3.1 a Pythonu 3.2. Pravděpodobně bych použil 2to3, pokud nebude přidána přesvědčivá funkce pro modernizaci, která vás povzbudí k jejímu použití. Modernize je také k dispozici u některých distribucí, jako je Debian testing a Arch. Chcete-li nainstalovat
# pip3 install modernize
Spustit
# python-modernize --help
Tipy
Dos
Do conversion in small chunks Do use tools like pylint to help you figure out problematic code, before you convert it Do compare the code before and after the conversion Do use the debugger to validate critical code
Ne
Do not overwrite your code with 2to3, recommend a separate directory Do not trust in the tools to do everything correctly
Test, Test, Test
Bez ohledu na to, jak převedete svůj kód z Pythonu 2 do Pythonu 3, měli byste jej důkladně otestovat. Pro kritický pythonový kód bych dokonce doporučil použít python debugger ke spuštění kódu řádek po řádku.
# python3 -m pdb
Poté zadejte n
Závěr
Python 2 je po dlouhém a plodném životě mrtvý. Pokud stále používáte Python 2, měli byste převést na Python 3. Python poskytuje nástroj v 2to3, který pomáhá s převodem z Pythonu 2 na Python 3 a ubírá z toho spoustu práce. 2to3 není dokonalý nástroj, ale může udělat spoustu práce za vás a snížit složitost převodu z Pythonu 2 na 3 o několik řádů.
Odkazy
- Stránka 2to3 v knihovně dokumentace Pythonu https://docs.python.org/3/library/2to3.html
- Modernizace knihovny https://pypi.org/project/modernize/
- Přenesení kódu Python 2 na stránku Python 3 na adrese python.org https://docs.python.org/3/howto/pyporting.html