abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 14
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 4
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 11
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 10
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 4
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 773 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Python: čtení souboru: "except IOError" versus "finally"

Fluttershy, yay! avatar 17.2.2009 18:23 Fluttershy, yay! | skóre: 81 | blog:
Python: čtení souboru: "except IOError" versus "finally"
Přečteno: 549×

Mám funkci v Pythonu:

def get_template(template_file):
    """Get a file containing a template. Return its content as a string."""

    try:
        return open(template_file, 'r').read()

    except IOError:
        print "Error: Cannot read the file containing the template."

Na webu Pythonu se ale (v HOWTO Idioms and Anti-Idioms in Python) uvádí jako ne zcela správný příklad:

def get_status(file):
    try:
        return open(file).readline()
    except (IOError, OSError):
        print "file not found"
        sys.exit(1)

Mimochodem, proč je tam OSError?

U příkladu níže se píše, že ideální a že výjimka se má řešit v místě volání (což nechci).

def get_status(file):
    fp = open(file)
    try:
        return fp.readline()
    finally:
        fp.close()

Jak je to v mém kódu s uzavíráním souboru? Nemám do svého try bloku vnořit ještě jeden s větví finally?


Řešení dotazu:


Odpovědi

18.2.2009 09:07 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Nikdo neodpovídá, tak to zkusím. Ale moc nevím, v čem je jádro pudla, tak to nějak vágně okomentuju:

Jestliže chci přečíst soubor, tak chci buď jeho obsah nebo vyhozenou výjimku. Ten první příklad se mi proto moc nelíbí, protože když něco selže, tak jen vypíše nějaký řetězec na obrazovku, ale vrátí None. Navíc, nevypíšou se podrobnosti o chybě. Zavírat soubor nemusíš.

Ve druhém (a třetím) příkladě se přepisuje klíčové slovo „file“, což není dobrý nápad. Naopak, je spíš zvykem používat file místo open (jsou to synonyma).

Druhý příklad: Kdy se v tomto případě může vyskytnout OSError, to nevím. Dám se podat.

Třetí příklad považuju za zrádný. Někdy vrátí None, někdy vyhodí výjimku,

No prostě, já bych to psal takhle

 

def readfile(fn):
    return file(fn).read()

A na to bych vlastně ani nepsal funkci. Ale to je do značné míry otázka vkusu a taky toho, jak moc si chceš všechno ošetřit sám.

18.2.2009 11:05 razor | skóre: 32
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Imho ten první příklad je spíš špatně proto, že ověřuje existenci souboru pomocí vyjímky.To by se spíš mělo řešit např pomocí os.path ...

Fluttershy, yay! avatar 18.2.2009 12:36 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
Tak já jsem tam hodil tu výjimku proto, že se jí řeší všechny chyby vstupu (neexistence/smazání souboru,...). Totiž os.path mi nevyřeší případ, když během čtení něco ten soubor smaže. Takže tam mám dát obojí?
18.2.2009 14:16 razor | skóre: 32
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Je to tak jak řikáš - os.path spoustu věcí nevyřeší. Jako špatný příklad je to podle mě uvedeno právě z toho důvodu, že se tím ověřuje existence souboru, na což jsou ale jinačí nástroje. Pro jiné případy může být samořejmě použití vyjímek adekvátní.

18.2.2009 13:42 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

No a? Pokud je ten soubor pro funkčnost nutný, pak je výjimka na místě. Pokud má aplikace počítat s tím, že soubor tam být nemusí, pak bylo by lepší použít os.path.isfile().

 

18.2.2009 14:37 razor | skóre: 32
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Pokud je soubor nutný, tak bych vyhodil svojí vyjímku:

if not os.path.exists("soubor"):
	raise NejakaMojeVyjimka(.......)
18.2.2009 16:09 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

To je jedna třída a několik řádků kódu navíc. Záleží na rozsahu a komplexnosti projektu, jestli je nutné mít pro všechno vlastní výjimky.

Stejně tak pak musíš ošetřit i výjimku z open()/file(), protože ten soubor mohl v čase mezi exists() a open() někdo smazat :-)

Fluttershy, yay! avatar 18.2.2009 18:28 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
Záleží na rozsahu a komplexnosti projektu...

Několik set řádků, možná to poslouží jako backend pro GUI nebo jednoduchou webovou aplikaci.

Fluttershy, yay! avatar 18.2.2009 13:07 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
Jestliže chci přečíst soubor, tak chci buď jeho obsah nebo vyhozenou výjimku. Ten první příklad se mi proto moc nelíbí, protože když něco selže, tak jen vypíše nějaký řetězec na obrazovku, ale vrátí None. Navíc, nevypíšou se podrobnosti o chybě.

OK, co s tím? sys.exit? Ale to je nevhodné při použití jako knihovny ve frameworku...

Zavírat soubor nemusíš.

Díky.

Ve druhém (a třetím) příkladě se přepisuje klíčové slovo „file“, což není dobrý nápad. Naopak, je spíš zvykem používat file místo open (jsou to synonyma).

Ten kód je z webu Pythonu...

Třetí příklad považuju za zrádný. Někdy vrátí None, někdy vyhodí výjimku,...

Taky si myslím, ale autor toho HOWTO píše, že to má být ošetřeno v místě volání funkce.

18.2.2009 13:52 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

 

OK, co s tím? sys.exit? Ale to je nevhodné při použití jako knihovny ve frameworku..

 

Tak mohlo by to třeba vyhazovat výjimku, že :-) Nebo vracet None. Ale výjimka bude lepší, především může nést informaci o chybě; to tam pak ani žádné try-except nemusíš dávat. Knihovna by asi také neměla sama od sebe něco vypisovat na jakýkoliv standardní výstup, stejně jako by neměla exitovat (pokud to ovšem nemá být smysl knihovny).

Soubor se ti uzavře sám, jakmile se garbage collector bude chtít zbavit instance file. To může být kdykoliv a může to případně i vypisovat nějaké warningy nebo tak něco, což by mohlo být dost nečekané a matoucí, takže občas se soubory uzavírají v bloku finally.

Mimochodem, pokud řešíš takové detaily už u obyčejného čtení souboru, co teprve děláš při rozhodování o celkovém designu aplikace? :-)

Fluttershy, yay! avatar 18.2.2009 18:25 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
Tak mohlo by to třeba vyhazovat výjimku, že :-)

Bingo!

Mimochodem, pokud řešíš takové detaily už u obyčejného čtení souboru, co teprve děláš při rozhodování o celkovém designu aplikace? :-)

Ladím si styl. ^_^

18.2.2009 18:09 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Jestliže ty výjimky odchytávat nepotřebuješ, tak to nedělej.  Mnohem lépe se to pak ladí, protože backtrace ukáže spoustu důležitých informací. Nejhorší je, když někdo odchytne vyjimku a dá tam print "ERROR" a ukončí program.

Fluttershy, yay! avatar 18.2.2009 18:19 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
Reálně je to s tím mým skriptem tak, že pokud nastane při čtení daného souboru problém, nemá smysl pokračovat. Ale kvůli možné další integraci do něčeho většího tam chci mít to vypisování (alespoň abych věděl, kde přesně je chyba) své (to originální zase není košer pro BFU). Takže to vypadá, že to ještě bude vracet výjimku v případě vrácení None.
19.2.2009 11:25 David Růžička
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"

Informace, kde přesně je chyba, by ale měla být součástí té výjimky, ne? Obecně platí, že by měla být přísně dodržena pravidla ošetřování chyb - buď VŠECHNO ve frameworku pouští/vyhazuje výjimku, nebo všechno vrací/nastavuje nějaký předdefinovaný chybový stav (None, -1, ...). V tomhle případě zřejmě metoda předpokládá, že template existuje a jeho neexistence je tedy vyjímečným stavem (odtud výjimka :-) ).

Já bych definoval vlastní výjimku (obecnou TemplateError, případně z ní ještě odvozenou TemplateReadfileError) obsahující příslušné informace a do ní vložil původní výjimku - nikdy nevím, kdy framework použiju nebo jak moc se rozroste.

Když už jsme u toho, místo metody get_template bych udělal třídu Template buď obsahující metodu něco jako Load, nebo načítající template v konstruktoru - pro jistotu, nikdy nevím, co všechno budu chtít s templatem ještě dělat, aspoň by to bylo všechno v kupě. :-)

Navíc možná by bylo dobré neotvírat přímo soubory z disku, ale vytvořit si třídu, která bude zajišťovat načítání dat podle nějakého identifikátoru (v tomhle nejjednodušším případě podle jména souboru), nikdy nevím, kdy budu chtít templaty třeba načítat z databáze... Záleží na tom, jak moc si představuješ, že se ten framework může rozrůst a na co všechno bys ho mohl chtít použít.

Fluttershy, yay! avatar 19.2.2009 15:20 Fluttershy, yay! | skóre: 81 | blog:
Rozbalit Rozbalit vše Re: Python: čtení souboru: "except IOError" versus "finally"
To všechno je fajn, ale řešit to budu ve chvíli, kdy už nepůjde o pár set řádkový skriptík...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.