Portál AbcLinuxu, 19. května 2024 14:39

Novinky v Python 2.5 - 3

29. 12. 2006 | Michal Vyskočil
Články - Novinky v Python 2.5 - 3  

Před nějakým časem vyšla nová verze Pythonu. Pokud vás tento jazyk zajímá, pojďte si přečíst seznam změn, jako je nová hierarchie výjimek nebo třeba modul umožňující přímé volání knihovních funkcí z Pythonu.

Výjimky v novém stylu

Třídy výjimek mohou od nynějška být nového stylu (new-stylled, zavedeno v Pythonu 2.2) a ne klasické třídy, jako tomu bylo doposud. Současně s tím se všechny zabudované výjimky změnily na new-stylled. Rovněž došlo k přeskupení dědičností:

    BaseException       # Novinka v Pythonu 2.5
    |- KeyboardInterrupt
    |- SystemExit
    |- Exception
        |- (all other current built-in exceptions)
    

To nyní lidem dovolí jednoduše zachytávat všechny výjimky, které ukazují na chybu v programu. Takové KeyboardInterrupt, nebo SystemExit nejsou chyby, přičemž je nutné je znovu vyvolat (jinak aplikace nepůjde shodit pomocí Ctlr+C, za což jistě dostaneme mnoho děkovných dopisů od spokojených uživatelů). Takže se muselo udělat něco jako:

    try:
        ...
    except (KeyboardInterrupt, SystemExit):
        raise
    except: 
        # Zalogování chyby ...  
        # Program pokračuje v běhu...
    

Od nynějška stačí k dosažení stejného výsledku napsat except Exception. Python 3.0 by pak měl vyžadovat, aby byly všechny výjimky zděděny od BaseException nebo některého z jeho potomků. S tím souvisí i to, že řetězcové výjimky, které jsou dlouho označené jako deprecated, budou od nynějška generovat varování. Cílem je v některé z následujících verzí jejich podporu úplně odstranit.

PEP 352, Required Superclass for Exceptions
PEP sepsal Brett Cannon a Guido van Rossum; implementoval Brett Cannon.

Nová speciální metoda __index__

Vývojáři NumPy měli problém, který se dal vyřešit pouze přidáním další speciální metody __index__. Pokud používáme konstrukci [start:stop:step], hodnoty pro start, stop a step mohou být pouze celá nebo dlouhá celá čísla. NumPy definuje celou řadu specializovaných celočíselných typů, jako znaménkové a neznaménkové, 8, 16, 32 a 64 bitové, ale neexistoval způsob, jak je používat ve slice konstrukci.

Není možné použít existující metodu __int__, protože ta byla použíta k převodu na typ int. Také by použití této metody mělo za následek skutečnost, že čísla s řádovou čárkou by se stala povolenými indexy, což je pochopitelně nežádoucí chování. Takže byla přidána nová speciální metoda __index__, která nemá žádné parametry a vrací celé číslo, které představuje index.

    class C:
        def __index__ (self):
            return self.value
    

Podmínkou je, že návratová hodnota musí být integer nebo long integer. Pokud ne, dojde k výjimce TypeError.

PEP 357, Allowing Any Object to be Used for Slicing
PEP sepsal a implementoval Travis Oliphant

Stručně o dalších změnách v jazyce

Nová metoda slovníku __missing__

Slovník dostal nový háček pro to, aby umožnil podtřídám vrátit nějakou výchozí hodnotu, pokud nebyl daný klíč nalezen. Pokud nebyl nalezen, je zavolána metoda __missing__(key). Tento háček implementuje nová třída dict v modulu collections. Následující příklad ukazuje definici slovníku, vracející nulu pro každou nenalezenou hodnotu:

class zerodict (dict):
    def __missing__ (self, key):
        return 0

>>> d = zerodict({1:1, 2:2})
>>> print d[1], d[2]
1 2
>>> print d[3], d[4]
0 0
    

Metody řetězců partition() a rpartition()

Jak 8bitové, tak Unicode řetězce mají dvě nové metody partition(sep) a rpartition(sep), které usnadňují některé často používané konstrukce. Metoda find(S) totiž často hledá index, který je použit pro vlastní rozdělení řetězce a získání částí před a za oddělovačem. Volání metody partition(sep) potom sloučí tyto dva kroky do jediného volání a vrací trojici (část před, oddělovač, část za). Pokud není oddělovač nalezen, celý řetězec je na prvním místě, zbylé dva jsou prázdné. Metoda rpartition(sep) také vrací trojici, ale prohledává řetězec od konce.

    >>> ('http://www.python.org').partition('://')
    ('http', '://', 'www.python.org')
    >>> ('file:/usr/share/doc/index.html').partition('://')
    ('file:/usr/share/doc/index.html', '', '')
    >>> (u'Subject: a quick question').partition(':')
    (u'Subject', u':', u' a quick question')
    >>> 'www.python.org'.rpartition('.')
    ('www.python', '.', 'org')
    >>> 'www.python.org'.rpartition(':')
    ('', '', 'www.python.org')
    >>> 'www.python.org'.partition('.')
    ('www', '.', 'python.org')
    >>> 'www.python.org'.rpartition('.')
    ('www.python', '.', 'org')
    

(Implementoval Fredrik Lundh podle návrhů Raymonda Hettingera.)

Vylepšení startswith() a endswith()

Metody řetězců startswith() a endswith() mohou jako parametr mít i ntici

    def is_image_file (filename):
        return filename.endswith(('.gif', '.jpg', '.tiff'))
    

(Implementoval Georg Brandl podle návrhů Toma Lynna.)

Nový parametr funkcí min() a max()

Zabudované funkce min() a max() mohou mít parametr key podobně jako řadící metoda sort(). Tím je funkce s jedním parametrem, která je volána pro každou hodnotu v seznamu. Funkce min()/max() vrací prvek s nejmenší/největší návratovou hodnotou této funkce.

>>> L = ['medium', 'longest', 'short']
>>> print max(L, key=len)
longest
>>> print max(L)
short
# Řetězec 'short' má lexikograficky největší hodnotu

(Vložil Steven Bethard a Raymond Hettinger.)

Nové zabudované funkce any() a all()

Nové zabudované funkce any() a all(), vyhodnotí, zda iterátor obsahuje nějakou pravdivou nebo nepravdivou hodnotu. Funkce any() vrací True, pokud je nějaká hodnota vrácená iterátorem True. Funkce all() potom vrací True jen v případě, že všechny iterátory vrací True.

(Navrhl Guido van Rossum, a implementoval Raymond Hettinger.)

Hashe mohou být i dlouhé integery

Výsledkem speciální metody __hash__() může být jak regulární integer, tak i jeho dlouhá varianta. V předchozích verzích mohlo být výsledkem této metody pouze standardní číslo, ale od nynější verze vrací zabudovaná funkce id() libovolné nenulové číslo, přičemž uživatelé často implementují metodu __hash__() jako return id(self).

Výchozím kódováním je ASCII

Pro všechny moduly je výchozím kódováním ASCII. Pokud bude modul obsahovat 8bitový literál a nebude mít explicitně deklarovaný typ, vyvolá se SyntaxError. V předchozí verzi to vyvolalo pouze varování. V PEP 263 je popis, jak deklarovat kódování. Pro latin1 stačí napsat na začátek zdrojového kódu:

# -*- coding: latin1 -*-
 

Nové varování UnicodeWarning

Nové varování UnicodeWarning, které je vyvoláno v případě, že porovnáváte Unicode řetězec s 8bitovým, který není možné zkonvertovat do Unicode použitím výchozího ASCII kódování. Výsledek porovnání je False:

>>> chr(128) == unichr(128)   # Nelze konvertovat chr(128) do Unicode
__main__:1: UnicodeWarning: Unicode equal comparison failed
  to convert both arguments to Unicode - interpreting them 
  as being unequal
False
>>> chr(127) == unichr(127)   # chr(127) can be converted
True
 

Předtím tato konstrukce vyvolala výjimku UnicodeDecodeError, ale v této verzi jazyka by to mohlo způsobovat problém při přístupu do slovníku. Pokud použijete unichr(128) a chr(128) jako klíče, dostanete výjimku UnicodeDecodeError.

(Implementoval Marc-André Lemburg.)

Varování ImportWarning

Jedna z nepříjemných chyb, kterou programátoři v Pythonu občas dělají, je, že zapomínají vložit __init__.py v adresáři balíčku. Ladění této chyby je nepříjemné a většinou vyžaduje spuštění interpreteru s parametrem -v k výpisu všech prohledávaných cest. Ve 2.5 se vygeneruje ImportWarning, pokud chcete importovat balíček bez __init__.py. Toto varování je ve výchozím nastavení potichu ignorováno, ale parametrem -Wd si jej můžete zobrazit.

(Implementoval Thomas Wouters.)

Drobná změna syntaxe

Seznam bázových tříd v definici třídy může být prázdný. Tento kód je nyní v pořádku:

class C():
    pass

(Implementoval Brett Cannon.)

Změny interaktivního interpreteru

V interaktivním interpreteru byly quit a exit dlouhou dobu řetězce, které některým novým uživatelům pomáhaly s ukončením interpreteru.

# Python 2.4
>>> quit
'Use Ctrl-D (i.e. EOF) to exit.'

V Pythonu 2.5 jsou quit a exit objekty, které jednak produkují užitečný výstup, ale navíc jsou volatelné. Je tedy možné zapsat quit(), nebo exit() k ukončení interpreteru.

# Python 2.5
>>> quit
'Use Ctrl-D (i.e. EOF) to exit.'

(Implementoval Georg Brandl.)

Interpret Pythonu může nyní přijímat standardní dlouhé parametry --help a --version a na Windows akceptuje /? pro zobrazení nápovědy.

(Implementoval Georg Brandl.)

Optimalizace interpreteru

Mnoho optimalizací bylo vyvinuto na NeedForSpeed sprint, který se konal na Islandu, v hlavním městě Rejkjavík 21. až 28. května 2006. Byl zaměřen na vylepšení výkonu CPythonu a sponzorován společností EWT LLC spolu s CPP Games. Zde jsou některá vylepšení:

Novinky nebo zlepšení standardní knihovny

Navíc se v nové verzi objevily nebo podstatně zlepšily balíky

Závěr

Naše krátké seznámení se s novinkami Pythonu 2.5 je u konce.

Seriál Novinky v Python 2.5 (dílů: 3)

První díl: Novinky v Python 2.5, poslední díl: Novinky v Python 2.5 - 3.
Předchozí díl: Novinky v Python 2.5 - 2 (korutiny, konstrukce with)

Související články

Novinky v Python 2.5
Novinky v Python 2.5 - 2 (korutiny, konstrukce with)
Standardní knihovna pro Python - 1 (builtins)
Standardní knihovna pro Python - 2 (builtins 2)
Standardní knihovna pro Python - 3 (builtins 3)
Standardní knihovna pro Python - 4 (builtins 4)
Standardní knihovna pro Python - 5 (řetězce)
Ruby pro začátečníky - 1
Seriál: BASH
Python a PyQt - 1 (úvod)
Python a PyQt - 2 (podmínky, cykly, tlačítka)
Začínáme programovat v jazyce Python
Kommander - 1 (Skriptované GUI)
Kommander - 2 (Starý parser)
Kommander - 3 (Nový parser)
Seriál: Začíname KProgramovať
Programujeme v PERLu - I
Programujeme v PERLu - II

Další články z této rubriky

LLVM a Clang – více než dobrá náhrada za GCC
Ze 4 s na 0,9 s – programovací jazyk Vala v praxi
Reverzujeme ovladače pro USB HID zařízení
Linux: systémové volání splice()
Programování v jazyce Vala - základní prvky jazyka

Diskuse k tomuto článku

21.8.2009 17:55 Mintaka
Rozbalit Rozbalit vše Re: Novinky v Python 2.5 - 3
Odpovědět | Sbalit | Link | Blokovat | Admin

I staré chyby si zaslouží opravu:

"množství průběŘných výsledků"
a
"osmisty" by se asi mělo psát s mezerou jako "osmi sty". Kdyby to byl osmistý, pak dohromady.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.