Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)
radek napsal(a): > Avšak souhlasím s názorem, že soubory se čtou > většinou po řádcích takže je > to takto praktické ale mám z toho pocit vyjímky která se mi nelíbí. Problém je v tom, že zadrátovat do jazyka konstrukci, která ušetří několik písmenek je sice praktické, ale nedobré. Nechť je prostě všechni vidět. Pokud se soubory mohou číst i jinak, než po řádcích, což se děje velmi často, tak bych tyto zjednodušující konstrukce do jazyka vůbec nedával. Presne tak, priklady, jak by to vypadalo jinak: #cteni po radcich s defaultnim line oddelovacem (jak je ted) for line in file("data.txt").lines(): ... #cteni po radcich, ktere jsou oddelene oddelovacem for line in file("data.txt").lines(""): [...] Ale definice, že řádek v textovém souboru je ukončen jaksi není obecně přijímaná. Když chci, musím si to napsat sám a nebo použít odpovídající parser. Jan Matějka Ono obecnější řešení je udělat parsovací generátory, které by šly použít s čímkoliv file-like jako vstupním prametrem, a nestrkat parsování to objektu file. Tedy: [...] for line in lines(file("data.txt")): ... [...] atd. Výpočetní náročnost by zústala stejná. Generátory mi přijdou jako skvělý nástroj, škoda že se GvR brání zobecnění do více úrovní zanoření jenž nabízí stackless python. Ale vdyť mi nic nebrání zpracovávat soubor po znacích. # Vygenerujeme si testovaci textovy soubor. f = open('test.txt', 'w') for i in xrange(3): f.write('Line %d.\n' % i) f.close() # Pruchod po znacich. f = open('test.txt') c = 'init' while c != '': c = f.read(1) print c f.close() A nic mi nebrání napsat generátor, který vezme a bude vracet znaky a použít ho: def chargen(f): c = 'init' while c != '': c = f.read(1) yield c for c in chargen(file('test.txt')): print c A můžu si napsat jakýkoliv jiný generátor/parser. pepr ___ Python mailing list python@py.cz http://www.py.cz/mailman/listinfo/python Visit: http://www.py.cz
Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)
Petr Prikryl A k té explicitnosti -- místo xreadlines() bych sice mohl psát __iter__(), ale... The Zen of Python, by Tim Peters Beautiful is better than ugly. Simple is better than complex. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Díky za reakci, dle mého nedišputovatelného gusta uvedené věty s vyjímkou Simple is better than complex Although practicality beats purity svědčí spíš pro styl xreadlines hlavně proto že tam je ten slovní základ lines. Avšak souhlasím s názorem, že soubory se čtou většinou po řádcích takže je to takto praktické ale mám z toho pocit vyjímky která se mi nelíbí. Jan Matějka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)
Díky za reakci, dle mého nedišputovatelného gusta uvedené věty s vyjímkou Simple is better than complex Although practicality beats purity svědčí spíš pro styl xreadlines hlavně proto že tam je ten slovní základ lines. Já s tím také souhlasím. Ale pokud je xreadlines jenom deprecated, pak nic nenamítám, pokud tam zůstane. V takové Javě jsou deprecated věci klidně už desátým rokem, ale nikdo si je nedovolí vyhodit. Jinak se mi vůbec nelíbí ten Perlovský implicitní styl, kdy prostě každý objekt v nějakém kontextu něco nečekaného (rozuměj implicitního) provede. Čím dál víc se mi zdá, že GvR se bohužel asi v Perlu vidí. Takto mohou také vznikat dost ošklivé chyby a k=od se stane hůře udržovatelným. Avšak souhlasím s názorem, že soubory se čtou většinou po řádcích takže je to takto praktické ale mám z toho pocit vyjímky která se mi nelíbí. Problém je v tom, že zadrátovat do jazyka konstrukci, která ušetří několik písmenek je sice praktické, ale nedobré. Nechť je prostě všechni vidět. Pokud se soubory mohou číst i jinak, než po řádcích, což se děje velmi často, tak bych tyto zjednodušující konstrukce do jazyka vůbec nedával. Miloslav Ponkrác ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)
Ono obecnější řešení je udělat parsovací generátory, které by šly použít s čímkoliv file-like jako vstupním prametrem, a nestrkat parsování to objektu file. Tedy: místo for line in file(data.txt).lines(): ... by bylo: for line in lines(file(data.txt)): ... místo #cteni po UTF znacich for char in file(data.txt).chars(): by bylo: for char in chars(file(data.txt)): atd. Výpočetní náročnost by zústala stejná. Generátory mi přijdou jako skvělý nástroj, škoda že se GvR brání zobecnění do více úrovní zanoření jenž nabízí stackless python. Jan Matějka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)
radek napsal(a): Avšak souhlasím s názorem, že soubory se čtou většinou po řádcích takže je to takto praktické ale mám z toho pocit vyjímky která se mi nelíbí. Problém je v tom, že zadrátovat do jazyka konstrukci, která ušetří několik písmenek je sice praktické, ale nedobré. Nechť je prostě všechni vidět. Pokud se soubory mohou číst i jinak, než po řádcích, což se děje velmi často, tak bych tyto zjednodušující konstrukce do jazyka vůbec nedával. Presne tak, priklady, jak by to vypadalo jinak: #cteni po radcich s defaultnim line oddelovacem (jak je ted) for line in file(data.txt).lines(): ... #cteni po radcich, ktere jsou oddelene oddelovacem br for line in file(data.txt).lines(br): [...] Ale definice, že řádek v textovém souboru je ukončen br jaksi není obecně přijímaná. Když chci, musím si to napsat sám a nebo použít odpovídající parser. Jan Matějka Ono obecnější řešení je udělat parsovací generátory, které by šly použít s čímkoliv file-like jako vstupním prametrem, a nestrkat parsování to objektu file. Tedy: [...] for line in lines(file(data.txt)): ... [...] atd. Výpočetní náročnost by zústala stejná. Generátory mi přijdou jako skvělý nástroj, škoda že se GvR brání zobecnění do více úrovní zanoření jenž nabízí stackless python. Ale vdyť mi nic nebrání zpracovávat soubor po znacích. # Vygenerujeme si testovaci textovy soubor. f = open('test.txt', 'w') for i in xrange(3): f.write('Line %d.\n' % i) f.close() # Pruchod po znacich. f = open('test.txt') c = 'init' while c != '': c = f.read(1) print c f.close() A nic mi nebrání napsat generátor, který vezme a bude vracet znaky a použít ho: def chargen(f): c = 'init' while c != '': c = f.read(1) yield c for c in chargen(file('test.txt')): print c A můžu si napsat jakýkoliv jiný generátor/parser. pepr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python