Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
KAPITOLA 11 Úvod do jazyka Python<br />
pouhého operátoru = používá operátor +=, budou přijatá data připojena ke stávajícímu obsahu<br />
vyrovnávací paměti. Hodnota 1 024 bajtů je zvolena víceméně náhodně.<br />
V dalším kroku je potřeba rozdělit vyrovnávací paměť na jednotlivé řádky textu. Slouží k tomu<br />
následující řádky programu:<br />
radky = prijimaci_pamet.split(‚\r\n‘)<br />
prijimaci_pamet = radky.pop();<br />
První řádek nastaví proměnnou radky tak, aby obsahovala celý řádek textu z přijímací vyrovnávací<br />
paměti. To zajišťuje funkce split, která vyhledává znaky EOL (end of line – konec<br />
řádku) symbolizované řetězcem \r\n. Tyto znaky se vyskytují pouze na konci řádku. Jestliže je<br />
tedy vyrovnávací paměť rozdělena tímto způsobem, máte jistotu, že proměnná radky obsahuje<br />
pouze kompletní řádky odpovědí ze serveru. Instrukce pop na druhém řádku zajišťuje, že jsou<br />
z proměnné prijimaci_pamet odebírány pouze úplné řádky: vzhledem k tomu, že odpovědi ze<br />
serveru jsou načítány v dávkách po 1 kB, je pravděpodobné, že v libovolném okamžiku bude<br />
vyrovnávací paměť obsahovat pouze části řádku. V tomto případě zůstane neúplný řádek ve<br />
vyrovnávací paměti a čeká na načtení zbytku řádku při následujícím průběhu cyklu a přijetí<br />
dalšího 1 kB dat ze serveru.<br />
V této fázi proměnná radky obsahuje seznam úplných odpovědí – celých řádků – přijatých<br />
ze serveru. Zadejte následující kód, který tyto řádky zpracuje a zjistí jména účastníků kanálu:<br />
for radek in radky:<br />
odpoved = radek.rstrip().split(‚ ‚, 3)<br />
kod_odpovedi = odpoved[1]<br />
if kod_odpovedi == RPL_NAMREPLY:<br />
seznam_jmen = odpoved[3].split(‚:‘)[1]<br />
jmena += seznam_jmen.split(‚ ‚)<br />
Tyto příkazy jsou provedeny pro každý řádek nalezený v proměnné radky a zjišťují číselný kód<br />
odpovědi, který poskytl server IRC. Existuje sice mnoho různých kódů odpovědi, ale tento<br />
program se zajímá pouze o dva z nich, které byly definovány jako konstanty na začátku programu:<br />
353, který znamená, že následuje seznam jmen, a 366, který označuje konec seznamu.<br />
Příkaz if vyhledá první z těchto odpovědí a poté pomocí funkce split načte jména a přidá<br />
je do seznamu jmena.<br />
V této fázi seznam jmena obsahuje všechna jména, která byla přijata ze serveru v rámci odpovědi<br />
na dotaz programu. Jména některých uživatelů však mohou chybět: do přijetí odpovědi<br />
366, která signalizuje konec názvů členů, není seznam úplný. Proto poslední řádek – jmena +=<br />
seznam_jmen.split(‚ ‚) – nově přijatá jména k existujícímu seznamu připojuje, místo aby<br />
seznam úplně přepsal: při každém spuštění této části kódu program pravděpodobně přijme<br />
pouze část celého seznamu členů. Chcete-li jazyku Python sdělit, jak má postupovat po získání<br />
kompletního seznamu, zadejte tyto řádky:<br />
if kod_odpovedi == RPL_ENDOFNAMES:<br />
# Zobrazi jmena<br />
print ‚\r\nUzivatele pro %(kanal)s:‘ % irc<br />
for jmeno in jmena:<br />
169