P R O G R A M U J E M E>>> f.close() #zatvorime subor>>> sys.exit() #opustime Pytho<strong>na</strong>>>> import pickle>>> f=open(‘notes’,’r’)>>> telcisla=pickle.load(f){‘robert’: ‘183 426’, ‘manfred’: ‘684 158’}Chyby a výnimkyS výnimkou odseku Zme<strong>na</strong> pozície v súbore som sa doteraz s<strong>na</strong>žil koncipova príklady tak,aby som nemusel uvádza chybové hlásenia Pytho<strong>na</strong>. Jedným z dôvodov bolo, že som vásnechcel iritova týmito chybovými hláseniami. Druhý bol priestorový dôvod. Na prvýpoh¾ad neukážu tieto hlásenia niè zaujímavé a zaberajú priemerne tri cenné riadky. Terazvám ukážem, že to tak celkom neplatí a že chybové hlásenia nás upozornia <strong>na</strong> ve¾adôležitých veci, výnimky sa môžu sta ve¾mi dobrým priate¾om programátora.Chyby syntaxePredstavujú <strong>na</strong>jèastejší druh chýb. Dopustíme sa ich, ak nieèo nesprávne <strong>na</strong>píšeme aPython <strong>na</strong>šej požiadavke neporozumie. Napríklad:>>> def funkcia() #zabudol som “:”File “”, line 1def funkcia()^SyntaxError: invalid syntaxV riadku pod <strong>na</strong>šou nesprávnou definíciou hneï za slovom File nájdeme údaj, v ktoromsúbore sa chyba stala. Ak uvidíme , z<strong>na</strong>èí to, že chyba sa stala pri interaktívnomvstupe (zadávania príkazov). Za slovom line vidíme, <strong>na</strong> ktorom riadku sa chyba stala. Vïalšom riadku uvidíme, kde v definícii sa chyba vy<strong>sk</strong>ytla. Python sa nám toto miesto s<strong>na</strong>žíukáza pomocou malej šípky (^).VýnimkyNie všetky chyby sú syntaktické. Aj keï je definícia syntakticky správ<strong>na</strong>, pri vykonávaníkódu môže dôjs k chybe. Takáto chyba sa potom volá výnimka a každá takáto výnimkamá svoje meno. Typickým príkladom výnimky je delenie nulou (ZeroDivisionError). Výraz,kde ho použijeme, je síce syntakticky správny, ale matematicky nemožný. Je možné definovavlastné výnimky. Na vytvorenie vlastnej výnimky budeme musie vedie , ako vytvoritriedu, èo bude témou ïalšej èasti seriálu. Príklady výnimiek:>>> 5/0 #delenie nulouTraceback (most recent call last):File “”, line 1, in ?ZeroDivisionError: integer division or modulo>>> preme<strong>na</strong>/4 #neexistujuca premen<strong>na</strong>Traceback (most recent call last):File “”, line 1, in ?NameError: There is no variable <strong>na</strong>med ‘preme<strong>na</strong>’Chybové hlásenie je podobné ako pri syntaktickej chybe. Prvé slovo posledného riadkatohto hlásenia ukazuje meno výnimky, ako <strong>na</strong>pr. ZeroDivisionError alebo NameError,zvyšok riadka tvorí opis chyby. Mená výnimiek sú vstavané (preddefinované) identifikátory,no nie sú to k¾úèové slová. Zoz<strong>na</strong>m a opis všetkých vstavaných výnimiek sa dá nájs vdokumentácii. Prvé dva údaje stredného riadka chybového hlásenia ukazujú, v ktoromsúbore a <strong>na</strong> ktorom riadku sa chyba stala. Zvyšok chybového hlásenia sa zaberá zásobníkoma je pre nás nezaujímavý.Spracovanie výnimiekKrása výnimiek spoèíva v tom, že sa dajú spracúva . Napríklad pri delení nulou pokojnemôžeme <strong>na</strong>písa používate¾ovi nášho programu, že nulou sa nesmie deli , a tým muušetri menej preh¾adné chybové hlásenie.>>> try:... 5/0... except ZeroDivisionError:... print “nulou sa nesmie delit!”...nulou sa nesmie delit!Všetko to funguje takto:l Blok medzi try: a except: sa vykoná,l ak sa nevy<strong>sk</strong>ytne nijaká výnimka, blok za try: sa vykoná a èas except je ignorovaná,l ak sa v priebehu vykonávania bloku za try: vy<strong>sk</strong>ytne výnimka, zvyšok bloku za výrazomtry: bude ignorovaný. Meno výnimky sa porovná s výnimkou/výnimkami uvedenými predvýrazom except:, a ak sa meno výnimky, ktorá sa vy<strong>sk</strong>ytla, zhoduje s me<strong>na</strong>mi uvedenýmipri except:, vykoná sa blok za except:.l V prípade vý<strong>sk</strong>ytu výnimky, ktorá nie je definovaná pri except:, bude vyvolané hlásenievy<strong>sk</strong>ytujúcej sa výnimky, akoby sa výrazy except: a try: nepoužili.Ako som už <strong>na</strong>z<strong>na</strong>èil, môžeme spracúva viaceré výnimky pomocou jediného výrazuexcept:, <strong>na</strong>pr. ak chceme ignorova delenie nulou (ZeroDivisionError) a výnimku použitiame<strong>na</strong> neexistujúcej premennej (NameError). V jednom výraze try: môže by viac výrazovexcept:, môžu by ukonèené príkazmi break alebo return. Ïalej platí, že except: nespracúvalen výnimky vy<strong>sk</strong>ytujúce sa priamo v bloku za výrazom try:, ale <strong>na</strong>pr. tie, ktoré savy<strong>sk</strong>ytnú vo funkciách vy<strong>sk</strong>ytujúcich sa v bloku za try:>>> def funkcia():... premen<strong>na</strong>/0...>>> try:... funkcia()... except:... print ‘vy<strong>sk</strong>ytla sa nejaka vynimka’...vy<strong>sk</strong>ytla sa nejaka vynimkaPoužitím osamostatneného výrazu except: bez argumentov (except:) spracúvame všetkyvýnimky <strong>na</strong>raz. Takýto osamostatnený výraz except: odporúèam používa maximálne opatrnea zriedka, pretože tým môžeme ve¾mi ¾ahko prehliadnu chyby v <strong>na</strong>šich programoch.Výraz try..except môže ma aj èas else: (podobne ako if, while alebo <strong>na</strong>pr. for), ktorása vykoná, ak sa vy<strong>sk</strong>ytne výnimka, ktorá nie je uvedená pri výraze except:for arg in sys.argv[1:]:try:f=open(arg, ‘r’) #otvorime subor predanky ako argument<strong>na</strong> citanieexcept IOError:print ‘nemozem otvorit’, arg #subor neexistujeelse:print arg, ‘ma’, len(f.readlines()), ‘lines’ #ak savy<strong>sk</strong>ytne i<strong>na</strong> vynimkaf.close()Argumenty výnimiekPri niektorých výnimkách je možné uvies argument/y. Takýto argument je väèšinou èaschybového hlásenia uvedeného za menom chyby.>>> try:... f=open(‘subor.test’)... except IOError, x:... print ‘chybove hlasenie znie:’, x...chybove hlasenie znie: [Errno 2] Adresár alebo súbor neexistuje: ‘subor.test’Vyvolávanie výnimiekPomocou výrazu raise môžeme prinúti Python vyvola ¾ubovo¾nú výnimku. Prvý argumentraise je meno výnimky, druhý je argument samotnej výnimky:>>> raise IOError, ‘mnou vyvola<strong>na</strong> vynimka’Traceback (most recent call last):File “”, line 1, in ?IOError: mnou vyvola<strong>na</strong> vynimkafi<strong>na</strong>lly:Výraz fi<strong>na</strong>lly: je špeciál<strong>na</strong> èas výrazu try:, ktorá sa vykoná v každom prípade, nezáleží <strong>na</strong>tom, èi sa blok try: opustí pomocou príkazu break alebo return, takisto je jedno, èi savy<strong>sk</strong>ytla výnimka, alebo nie. Blok za výrazom fi<strong>na</strong>lly: sa jednoducho vykoná za všetkýchokolností.>>> try:... f=open(‘subor.test’)... fi<strong>na</strong>lly:... print ‘toto sa zobrazi v kazdom pripade’...toto sa zobrazi v kazdom pripadeTraceback (most recent call last):File “”, line 2, in ?IOError: [Errno 2] Adresár alebo súbor neexistuje: ‘subor.test’Jeden výraz try: môže ma jeden alebo viac výrazov except: alebo jeden výraz fi<strong>na</strong>lly:. Musíma však pri<strong>na</strong>jmenšom aspoò jednu z týchto dvoch èastí a nesmie ich ma obidve <strong>na</strong>raz.Nabudúce:Preberieme poslednú, rozhodne <strong>na</strong>jdôležitejšiu a <strong>na</strong>jzaujímavejšiu tému – objektovo orientovanéprogramovanie v podaní Pytho<strong>na</strong>.Príjemné prežitie vianoèných sviatkov prajen Martin Užákuzak@ba.telecom.<strong>sk</strong>12/2000 PC REVUE 127
P R O G R A M U J E M EMalé ve¾ké databázy / 4. èasUž vieme, ako <strong>na</strong>inštalova , spusti a zastavi MySQL server, ba vieme sa aj prihlási ako roota zmeni si heslo, takže nám už niè nebráni, aby sme s ním zaèali pracova . Ako sme užuviedli, <strong>na</strong> komunikáciu so serverom používame súbor SQL príkazov. Na zadávanie týchtopríkazov môžeme použi už známeho klienta MySQL Monitor (program mysql) alebo súborpomocných programov. Ak sa chceme o možnostiach toho-ktorého pomocného programudozvedie viac, spustíme ho s parametrom –help alebo –h. V struènej nápovedi zistíme základnéparametre daného programu. Pre názornos budeme príkazy pre klienta mysqloz<strong>na</strong>èova promptom mysql>, bez tohto promptu uvažujeme pomocné programy vprostredí príslušného operaèného systému. Takisto budeme príkazy písa malými písme<strong>na</strong>mi,lebo klient mysql akceptuje aj malé písmená.Základné príkazy SQLMySQL obsahuje množinu príkazov pod¾a normy SQL92, my však budeme zatia¾ využívaiba základnú <strong>sk</strong>upinu, ktorá je opísaná v tabu¾ke è. 1.Príkazcreate tabledrop tablealter tableinsert intoupdatedeleteselectOpisvytvorenie tabu¾kyzmazanie tabu¾kyúprava štruktúry tabu¾kyvloženie záz<strong>na</strong>mu do tabu¾kyúprava záz<strong>na</strong>mu v tabu¾kevymazanie záz<strong>na</strong>mu v tabu¾kevýpis z tabu¾kyZ tabu¾ky je zrejmé, že <strong>na</strong> základnú èinnos so serverom postaèuje sedem príkazov.Azda <strong>na</strong>jdôležitejším príkazom je SELECT. Jednotlivé príkazy a ich možnosti si objasnímepostupne, ako budeme vytvára <strong>na</strong>šu databázu.Naša prvá databázaAko sme spomenuli, budeme pracova s databázou KNIZNICA a s tabu¾kami v nejuloženými. Vieme, že MySQL server po inštalácii obsahuje dve základné databázy –MYSQL a TEST. Preto musíme databázu KNIZNICA vytvori sami.položka cis_odd bola zároveò primárnym k¾úèom a aby mala autoinkrementaènúschopnos . To z<strong>na</strong>mená, aby sa vždy po pridaní nového záz<strong>na</strong>mu automaticky zväèšilajej hodnota o 1.Aby sme vytvorili tabu¾ku ZANER, spustíme klienta mysql s parametrom kniznica, èímsa automaticky <strong>na</strong>stavíme do prostredia databázy KNIZNICA. Odteraz príkazy, ktorébudeme zadáva , sa budú týka databázy KNIZNICA a tabuliek v nej. Vytvorenie samotnejtabu¾ky vykonáme príkazom:mysql > create table zaner (cis_odd int auto_increment primary key,tematika varchar(20));Ak je riadok príkazu ve¾mi dlhý, stlaèíme Enter a pokraèujeme <strong>na</strong> novom riadku za šípkou.Spomeòme si, že príkaz klienta sa vykoná až po zadaní bodkoèiarky a stlaèení Enter.Obr. 2Ak sme neurobili v zápise nijakú chybu, server potvrdí vyko<strong>na</strong>nie príkazu hlásenímQuery OK, tak ako je to <strong>na</strong> obrázku è. 2.Podobným spôsobom si vytvoríme aj tabu¾ku KNIHA. Polia tabu¾ky budú ma tietonázvy a typy, ako sú opísané v tab. è. 2.Názov po¾aid<strong>na</strong>zovautorvydavatelcis_oddce<strong>na</strong>poz<strong>na</strong>mkaTyp po¾aintvarchar(40)varchar(30)varchar(25)intdecimal(7,2)varchar(25)Zadaním príkazu:mysql > create table kniha (-> id int auto_increment primary key,-> <strong>na</strong>zov varchar(40),-> autor varchar(30),-> vydavatel varchar(25),-> cis_odd int,-> ce<strong>na</strong> decimal(7,2),-> poz<strong>na</strong>mka varchar(25));Obr. 1Na vytvorenie databázy použijeme program mysqladmin s vo¾bou create meno_databázy. Takže zadáme:mysqladmin create kniznicaAby sme sa presvedèili, èi <strong>na</strong>ozaj všetko prebehlo v poriadku, použijeme ïalší pomocnýprogrammysqlshowkde <strong>na</strong> obrazovke uvidíme výpis jednotlivých databáz, vytvorených <strong>na</strong> <strong>na</strong>šom serveri.Môžeme použi aj klienta mysql, v ktorom zadáme príkaz pre klienta:mysql> show databases;Odpoveï servera <strong>na</strong> tento príkaz by mala by taká ako <strong>na</strong> obr. è. 1.Tabu¾kyTeraz máme vytvorenú databázu KNIZNICA. Zatia¾ je prázd<strong>na</strong>, ale vieme, že bude obsahova(doèasne iba dve) tabu¾ky ZANER a KNIHA. Tabu¾ka sa vytvorí príkazom:create table meno_tabulky (položka1 typ_položky1, položka2 typ_položky2,...,položkantyp_položkyn)kde meno_tabulky je konkrétne meno, <strong>na</strong>pr. ZANER, a v zátvorkách sa uvádza menopoložky a jej daný typ.Tabu¾ka ZANER má iba dve položky – cis_odd, ktorá je typu int, a tematika, ktoráje typu varchar s poètom z<strong>na</strong>kov do 20. Z konštruktívneho h¾adi<strong>sk</strong>a je vhodné, aby prvásme vytvorili druhú tabu¾ku s názvom KNIHA.Typ id int auto_increment a varchar už poznáme, typ decimal(7,2) z<strong>na</strong>mená, že je toèíselná hodnota <strong>na</strong> sedem miest, z èoho dve sú za desatinnou èiarkou (v poèítaèovomprostredí bodkou). Maximál<strong>na</strong> hodnota tohto výrazu je teda 99999,99, èo je, myslím, <strong>na</strong>cenu knihy postaèujúce.Aby sme sa presvedèili, že sme <strong>sk</strong>utoène vytvorili tabu¾ku KNIHA, spustíme program:mysqlshow kniznicaèím zobrazíme všetky tabu¾ky v databáze KNIZNICA.Môžeme zada príkaz pre klienta:mysql > describe kniha;Tak dostaneme štruktúru tabu¾ky, tak ako je <strong>na</strong> obr. è. 3.Takýmto spôsobom si môžeme overi , èi sme tabu¾ku <strong>na</strong>definovali správne.Keby sme z akéhoko¾vek dôvodu potrebovali tabu¾ku vymaza , použijeme príkaz:mysql > drop table meno_tabu¾ky;Po použití tohto príkazu je tabu¾ka nenávratne stratená, takže ho používajme s rozvahou!Napåòanie tabuliekAk sme úspešne vytvorili tabu¾ky, môžeme ich zaèa <strong>na</strong>påòa vhodnými informáciami. Na<strong>na</strong>påòanie tabuliek sa používa príkaz INSERT INTO v takomto tvare:insert into meno_tabu¾ky (meno_1_položky, meno_2_položky, meno_n_položky)VALUES (hodnota_1_položky, hodnota_2_položky, ..., hodnota_n_položky)Ak budeme dopåòa položky v presnom poradí, tak ako sú <strong>na</strong>definované v tabu¾ke, nemusímev zápise príkazu vypisova názvy jednotlivých položiek pred slovom VALUES(=hodnoty). Tým si trochu zjednodušíme zápis.128 PC REVUE 12/2000