[python] raw_input() jeste jednou (bylo raw_input() bug ... vyvojPythonu, jimavy pribeh)

Petr Prikryl PrikrylP na skil.cz
Středa Srpen 3 14:12:56 CEST 2005


geon
> pepr
> > 
> > Stručně řečeno, GvR lituje, že raw_input() vůbec
> > vzniklo. [...] můžu jednoduše nahradit vlastní
> > malou funkcí:
> > ========================================
> > import sys
> > def my_input(prompt):
> >     sys.stdout.write(prompt)
> >     return sys.stdin.readline()
> > 
> > r = my_input('prompt: ')
> > print r
> > ========================================
> 
> Mám k tomu snad 2 poznámky:
> * rozhodně to není pro začátečníky. Je to takové
>   nejednoduché, nepřímé. [...]

A to jsem tam ještě udělal chybu... Správně by to
mělo vypadat nějak takto:
========================================
# -*- coding: cp1250 -*-

import sys

def my_input(prompt):
    sys.stdout.write(prompt.encode(sys.stdout.encoding))
    return unicode(sys.stdin.readline(), sys.stdin.encoding)

r = my_input('Příšerně žluťoučký kůň chce vstup: ')
print r

r = my_input(u'Příšerně žluťoučký kůň chce další vstup: ')
print r
========================================

Většina věcí se dělala v angličtině a funkce 
raw_input() vznikla pravděpodobně v době, kdy se o
komplikacích s různým kódováním moc nepřemýšlelo.
Kompromisům se vyhnout nedá.

> * proč se takto neimplementuje raw_input? (možná
>   že to tam guido píše, četl jsem to zhruba)

Je to implementováno v jádře (jazyk C) a je tam
chyba. Dříve zmíněný patch se to snaží řešit
změnou implementace file.write(). Objevují se ale
další komplikace (jak se to má chovat pro binární
soubory, jestli se file.write() má chovat jako
print nebo naopak).

> Myslím že není dobré začátečníky hned upozorňovat
> na bug, který je téměř v prvním příkazu, se kterým
> se setkají. Spíš je se snažit přimět nepoužívat
> diakritiku [...]

V dokumentaci se píše, že se nemá používat
input(). Podobně by se dalo prohlásit, že se nemá
používat raw_input() -- každá z těchto funkcí má
své problémy. Pokud definuji jednoduše
pojmenovanou funkci pro vstup, nemusím přece
začátečníkům vysvětlovat, proč je definována právě
takto. Hlavní je, že to funguje (doufejme ;-)

pepr

P.S. Ne všechny věci, které vypadají jednoduše,
     jsou jednoduché.



Další informace o konferenci Python