=============================================================== Guido van Rossum: Python in New York Part II -- State of the Python Universe, 2006 =============================================================== Google New York's Technical Speaker Series. Guido van Rossum giving his Python presentation at the New York Google office on Wednesday, February 22nd 2006. http://video.google.com/videoplay?docid=60331183357868340 ===============================================================
Část II -- Stav pythonovského vesmíru, 2006
Guido van Rossum přednáší v prostorách firmy Google ve středu 22. února 2006.
Jde o část přednášky, která bude v plném znění přednesena na PyCon 2006.
Python 2.5
alfa verze v květnu, release v září
- alfa 1: 6. května 2006
- alfa 2: 3. června 2006
- alfa 3: 1. července 2006
- beta 1: 29. července 2006
- beta 2: 26. srpna 2006
- rc 1: 16. září 2006
- finální verze: 30. září 2006
Může se to dokonce ještě urychlit.
větev 2.4 taky není zatím mrtvá
- 2.4.3 bude uvolněna před 2.5a1
- 2.4.4 zhruba jako finální 2.5
Co tam bude nového
- Jazyk
- absolutní/relativní import (PEP 328)
- podmíněné výrazy (PEP 308)
- try/except/finally znovu spojenci (PEP 341)
- výrazy s yield a vylepšení generátorů (PEP 342)
- příkaz with (PEP 343)
- revidované výjimky (PEP 352)
- __index__ (PEP 357)
- Implementace
- AST překladač [Abstract Syntax Tree]
- velikost objektů bude vyjádřena typem ssize_t místo int (PEP 353)
- vylepšení volby -m (PEP 338)
- Knihovna
- any()/all()
- ElementTree
- a další
Absolutní/relativní import
Někdy nastanou situace, kdy jméno interního modulu (uvnitř balíčku, tedy podadresáře) koliduje s jménem standardního modulu. Podle pravidel se nejdříve hledá interní modul, což ale brání možnosti použití standardního modulu.
Řešení spočívá v oddělení syntaxe pro absolutní a relativní import. Nová syntaxe vede k zpětné nekompatibilitě, takže se bude povolovat explicitně přes __future__. Příklady:
import foo # hledá se JEN v sys.path from . import foo # hledá se JEN v aktuálním balíku from .. import foo # hledá se v rodičovském balíku from .bar import foo # hledá se v balíku bar from ..bar import foo # hledá se v sourozenci balíku bar
atd. Povolen je libovolný počet úvodních teček.
Podmíněné výrazy
- Debatovalo se o tom před pár lety. Problematika znovu otevřena. Používání obratu "PODMÍNKA and VÝRAZ1 or VÝRAZ2" vede k chybám při VÝRAZ1 vyhodnocený jako False.
- GvR navrhuje "VÝRAZ1 if PODMÍNKA else VÝRAZ2"
- Odmítnuta celá řada alternativ. (C styl je považován za příliš kryptický, přidávání dalších klíčových slov se také nezvažuje.)
- Doporučuje se používat zřídka. Používání klasické konstrukce if/else je často lepší.
try/except/finally znovu spojenci
Momentálně nelze používat finally a except dohromady. GvR měl kdysi potíže s implementací a současné použití se mu jevilo v některých případech nejednoznačné. Java ukázala, že tam žádná nejednoznačnost není.
Kdysi dříve Python konstrukci:
try: BLOK1 except: BLOK2 finally: BLOK3
... umožňoval, ale tato možnost byla u novějších verzí odstraněna. Po revizi bude tento syntaktický zápis znovu povolen.
Vylepšení generátorů
Inspirace případy použití generátorů pro vstup/výstupní operace. Inspirace jazykem Ruby.
- yield může být použit jako výraz
- yield bez argumentu je totéž jako "yield None"
- g.send(hodnota) zašle generátoru hodnotu
- g.throw(výjimka) vyvolá výjimku [v kontextu použití yield]
- g.close() vyvolá GeneratorExit (a odchytí si ji)
- když se generátor dostane do pařátů garbage collectoru, provede se close()
- yield [zatím] nelze použít uvnitř try/finally
with
Netriviální záležitost, trocha magie; with jako blok, správce kontextu (@contextmanager), zpracování výjimek.
Mutex jako inspirace i jako první kandidát pro využití with.
Revidované výjimky
- Standardní výjimky se stanou třídami nového typu.
- Nová kořenová třída: BaseException
- Stane se bázovou třídou pro KeyboardInterrupt a SystemExit. (Existují dobré důvody, proč tyto dvě výjimky nemají mít bázovou třídu Exception, ale právě BaseException.)
- Stane se bázovou třídou také pro Exception a vše pod touto třídou.
- Ve verzích po 2.5
- budou zakázány výjimky používající řetězce
- všechny výjimky musí dědit z BaseException
- Možná bude odstraněna holá forma příkazu "except:"
- Cíle bude možné dosáhnout až během několika meziverzí.
__index__
Nový protokol: "Pokud objekt reprezentuje index v nestandardní reprezentaci, pak __index__() převádí tuto nestandardní reprezentaci na standardní integer". Motivace pochází s oblasti numerických výpočtů.
Překladač založený na abstraktních syntaktických stromech
Týká se vlastností implementace, nikoliv vlastností jazyka.
Téměř se ho podařilo vypustit už v souvislosti s 2.4, ale nebyl doladěný a blížil se naplánovaný termín vypuštění verze.
- Co to je?
- zcela nový překladač bajtkódu
- používá ABSTRAKTNÍ syntaktické stromy místo KONKRÉTNÍCH
- Proč?
- nový překladač se snadněji upravuje (užitečnost se již prokázala při úpravách try/except/finally)
- ke strukturám AST lze přistupovat i s pythonovského kódu To znamená, že lze přímo prostřednicvím pythonovského kódu experimentovat z modifikacemi bajtkódu, pokusně vytvářet nové varianty jazyka a podobně.
ssize_t
Opět záležitost implementace. ssize_t odpovídá celočíselnému znaménkovému typu, který zabírá stejný počet bajtů jako ukazatel v jazyce C. To znamená, že například u 64bitového kódu reprezentuje větší čísla, než typ long v jazyce C.
-m <package>.<module>
Přímé spuštění modulu v balíku. Využije se například při spouštění regresních testů Pythonu, které jsou součástí jeho zdrojových textů.
Novinky v knihovně 2.5
- Nové zabudované funkce: any(), all()
- if any(x > 0 for x in S): ...
- if all(P(x) for x in S): ...
- Umožňují používat generátorové výrazy
- ale pracují s libovolnými iterátory a iterable
- Sémantika zkrácených výrazů (jako u and/or operátorů)
- Zastaví při prvním nevyhovujícím případu,
- ale nevyhovující případ není zpřístupněn, [protože]
- vedlo by to k mnoha podivnostem...
- all() by muselo vracet True nebo případ, který vede k false.
- Nové moduly:
- funkcional: partial()
- hashlib: MD-5, SHA-1, -224, -256, -384, -512
- cProfile: lepší profiler, rychlejší, menší režie
- [c]ElementTree: lepší XML API
- Fredrik Lundh, třetí strana
- ElementTree implementován v Pythonu
- cElementTree je rychlejší
- from xmlcore.etree import ElementTree
- Doufejme, že také:
- ctypes: volání libovolného C kódu z DLL nebo sdílené knihovny (sharelib)
- wstiref [?]: infrastruktura pro standardní web framework
- setuptools: snadná správa balíků
- bdist_msi, bdist_deb?, bdist_egg???: pro distutils
(konec)