Nacházíte se zde: Domů ‣ Ponořme se do Pythonu 3 ‣
❝ Isn’t this where we came in? ❞
— Pink Floyd, The Wall
Už jste v jazyce Python programovali? Četli jste původní publikaci „Dive Into Python“? Koupili jste si ji v knižní podobě? (Pokud ano, díky!) Jste připraveni ponořit se do jazyka Python 3?... Pokud tomu tak je, čtěte dál. (Pokud nic z toho neplatí, měli byste raději začít od začátku.)
Python 3 se dodává se skriptem nazvaným 2to3
. Naučte se jej. Milujte jej. Používejte jej. Přepis kódu do Pythonu 3 s využitím 2to3
je referenční příručkou ke všem věcem, které skript 2to3
umí opravit automaticky. A protože řada těchto věcí souvisí se změnami syntaxe, je tato příručka dobrým výchozím bodem ke studiu syntaktických změn, které Python 3 přináší. (Z příkazu print
se stala funkce, obrat `x`
přestal fungovat atd.)
Případová studie: Přepis chardet
pro Python 3 popisuje mé (nakonec úspěšné) úsilí o přepis netriviální knihovny z Pythonu 2 do Pythonu 3. Možná vám tato studie pomůže, možná ne. Učící křivka je zde poměrně strmá, protože nejdříve musíte porozumět knihovně samotné. Teprve potom můžete rozumět tomu, proč přestala fungovat a jakým způsobem jsem ji opravil. Řada problémů se váže na řetězce. Když už o nich mluvíme…
Řetězce. Uffff. Kde mám začít? Python 2 používal „řetězce“ a „řetězce v Unicode“. Python 3 rozlišuje „bajty“ a „řetězce“. Všechny řetězce se nyní stávají řetězci v Unicode. Pokud s obsahem chceme zacházet jako s bajty, musíme použít nový datový typ nazvaný bytes
. Python 3 nikdy skrytě nepřevádí řetězce na bajty a naopak. Takže pokud si v každém momentě nejste jistí, zda používáte ten či onen typ, kód vašeho programu téměř jistě přestane fungovat. Další podrobnosti naleznete v kapitole Řetězce.
Problém bajty versus řetězce se v textu této knihy vynořuje znovu a znovu.
encoding
). Některé metody textových souborů počítají znaky, ale jiné metody zase počítají bajty. Pokud ve svém zdrojovém kódu předpokládáte, že se jeden znak rovná jednomu bajtu, pak to při přechodu na vícebajtové znaky přestane fungovat.
httplib2
hlavičky a data prostřednictvím protokolu HTTP. Hlavičky se vracejí v podobě řetězců, ale těla se vracejí jako bajty.
pickle
pro Python 3 definuje nový datový formát, který je zpětně nekompatibilní s verzí pro Python 2. (Nápověda: Důvodem jsou bajty a řetězce.) Python 3 podporuje také serializaci objektů do a z JSON, který dokonce nepracuje s typem bytes
. Ukážeme si, jak se to dá obejít.
chardet
pro Python 3 se setkáte se zatraceným zmatkem mezi bajty a řetězci úplně všude.
Dokonce i kdyby vás Unicode nechával úplně chladné (ale ne, nenechá), budete si určitě chtít něco přečíst o formátování řetězců v jazyce Python 3. Zcela se liší od předpisu formátování řetězců v jazyce Python 2.
S iterátory se v Pythonu 3 setkáte všude. A teď už jim rozumím mnohem víc, než tomu bylo před pěti lety, kdy jsem napsal „Dive Into Python“. Snažte se jim porozumět také, protože mnoho funkcí, které v jazyce Python 2 vracely seznamy, vrací v Pythonu 3 právě iterátory. Přinejmenším byste si měli přečíst druhou polovinu kapitoly Iterátory a druhou polovinu kapitoly Iterátory pro pokročilé.
Na přání čtenářů jsem přidal přílohu Jména speciálních metod, která se podobá kapitole Data Model (Datový model) uvedené v dokumentaci jazyka Python.
V době, kdy jsem psal „Dive Into Python“, měly všechny dostupné knihovny pro práci s XML mizernou kvalitu. Pak ale Fredrik Lundh napsal modul ElementTree, který není ale vůbec mizerný. Pythonovští bohové moudře začlenili ElementTree do standardní knihovny, a tak se tento modul stal základem mé nové kapitoly o XML. Starší způsoby zpracování XML jsou stále podporované, ale měli byste se jim vyhnout, protože jsou zkrátka mizerné!
V Pythonu je nové také to — ne v jazyce, ale v komunitě uživatelů —, že se objevila úložiště kódu, jako je Python Package Index (PyPI). Python se dodává s utilitami k zabalení vašeho kódu do standardního formátu a tyto balíčky pak mohou být zveřejněny na PyPI. O podrobnostech se dočtete v kapitole Balení pythonovských knihoven.
© 2001–11 Mark Pilgrim