Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

2017-03-31 Tema obsahu Petr Přikryl

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)

2006-11-14 Tema obsahu Petr Přikryl
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


Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

2006-11-14 Tema obsahu superman
Tak tohle by bylo žůžo, to by se mi moc zamlouvalo. Bylo by to skvělé a 
obecné řešení. Jenže bohužel to asi není v Perlu, takže od GvR máme 
smůlu. :-(

S takovýmto řešením by se podle mě vyřešila jako vedlejší efekti i řada 
dalších konstrukcí a dalo by se to použít k řadě dalším věcem.


Miloslav Ponkrác

Jan Matejka napsal(a):
> 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")):
>  ...
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

2006-11-14 Tema obsahu Jan Matejka
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)

2006-11-14 Tema obsahu radek
> > 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(""):
 ...

#cteni po UTF znacich
for char in file("data.txt").chars():
 ...

#cteni po bytech
for byte in file("data.txt").bytes():
 ...

Navic by ty metody s defaultnim parametrem mohly byt propagovane jako
atributy, tedy napr.:

for line in file("data.txt").lines:
 ...

Radek
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

2006-11-14 Tema obsahu superman
> 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)

2006-11-14 Tema obsahu Jan Matejka
> 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


[python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

2006-11-14 Tema obsahu Petr Prikryl
Jan Matejka
> [...] je to spíš jako 
>   for line in f.xreadlines():
> 
> Kde xreadlines() vrací iterátor, který čte soubor 
> postupně na rozdíl od readlines který přečte soubor 
> najednou do seznamu řádků.
> 
> Přidám se ale k nadávání na odstraňování starých prvků 
> jazyka.  Xreadlines je od verze 2.3 označeno za zastaralé. 
> 
> for line in file("data.txt").xreadlines():
>   ...
> 
> se mi líbí víc než preferované 
> for line in file('data.txt')
>   ...
> 
> protože "explicit is better than implicit". Xreadlines() 
> totiž vyjadřuje že se čte po řádcích a nikoliv po bytech,
> unicode znacích nebo co já vím jakých jednotkách v souboru.


3.9 File Objects 
next( ) 

A file object is its own iterator, for example iter(f) 
returns f (unless f is closed). When a file is used as 
an iterator, typically in a for loop (for example, 
for line in f: print line), the next() method is called 
repeatedly. This method returns the next input line, 
or raises StopIteration when EOF is hit. In order to make 
a for loop the most efficient way of looping over the lines 
of a file (a very common operation), the next() method 
uses a hidden read-ahead buffer.


Volný překlad: Objekt typu soubor je svým vlastním
iterátorem. Takže například iter(f) vrací f (pokud f
není uzavřen). Pokud je souborový objekt použit 
jako iterátor -- typicky v cyklu for (například
for line in f: print line), volá se opakovaně metoda next(). 
Tato metoda vrací další vstupní řádek nebo na konci
vyvolá výjimku StopIteration. Aby cyklus for mohl 
řádky souboru procházet co nejefektivněji (jde o velmi
běžnou operaci), používá metoda next() skrytou vyrovnávací
paměť pro načítání dat předem.

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."

pepr
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python