range() vs. xrange() (bylo RE: [python] dotaz-mřížka)

Petr Prikryl Prikryl na skil.cz
Čtvrtek Březen 10 10:39:17 CET 2005


Ondřej Súkup napsal...
> Petr Prikryl napsal(a):
> [...]
> > Místo range(DELKA) je lepší používat xrange(DELKA).
>
> co se tyká budoucnosti moc ne ....
> xrange je na seznamu to be removed 
> http://www.python.org/peps/pep-3000.html
> tak ze pod budoucími verzemi pythonu nepouzitelne

Dovolím si důrazně nesouhlasit. Stejný dokument
říká, že range() má vracet iterátor. Jinými slovy
to znamená, že se staré range() má zcela zrušit
a xrange() se má přejmenovat na range().

Uvedený dokument je navíc věnován "hypotetické
budoucí verzi Pythonu" a slouží spíš pro diskusi
a ověřování nápadů při dalším vývoji.

Hlavním důvodem pro můj důrazný nesouhlas je
rozdíl ve funčnosti (efektivnosti) range()
a xrange(). Jméno není tak důležité. Přejmenování
funkce se dá v Pythonu dosáhnout velmi snadno:

>>> range
<built-in function range>
>>> xrange
<type 'xrange'>
>>> range = xrange
>>> range
<type 'xrange'>
>>>

Tím už nyní dosáhnu toho, že se zahodí odkaz 
na zabudovanou funkci range() a pod tímto jménem
se podstrčí xrange(). Funguje to ale jenom v daném
(lokálním) prostoru jmen.

Aby budoucí verze Pythonu neznemožnila používání
starších programů, které používají xrange(), může
provést něco takového (trochu chytřeji):

def xrange():
    # print 'Varovani...'
    return range()

To znamená, že všude, kde budu používat
(v té době již nepodporovanou) funkci xrange(),
bude potichu nahrazena použitím nové range().
Jakmile to bude aktuální, dá se najevo
změna trochu hlasitěji (naznačeno zakomentovaným
printem).

Petr
-- 
Petr Prikryl (prikrylp at skil dot cz) 



Další informace o konferenci Python