[Tutor PyCZ] ještě seznam jako globální proměnná

Petr Prikryl PrikrylP na skil.cz
Středa Březen 28 07:49:42 CEST 2007



Jan Šimůnek
> [...] 
> děkuji za včerejší rady, snad to bude fungovat [...]

Z těch rad bych si vybral především to vyhýbání se
globálním proměnným.

> Dělám grafický formulář, do kterého se údaje naklepou 
> myší z OptionMenu (mnoha), takže je potom nutné takto
> nastavené proměnné hromadně zpracovat a uložit jako 
> řádek do databáze. Takže nemohu volat parametry této
> funkce, tu nechávám uživatele volat až když je vše 
> nastaveno. Seznamy by mě měly ušetřit
> kód, abych nemusel psát do nekonečna:
> 
> vyberA=StringVar()
> vyberA.set("0")
> vyberB=StringVar()
> vyberB.set("0")
> 
> atd. ...
> 
> a potom
> 
> def zpracovani():
>       global vyberA
>       global vyberB
>       atd. ...
> 
> do zblbnutí, protože těch výběrů je několik desítek.

Odhaduji, že by dané parametry bylo lepší sbírat
do struktury, které se v Pythonu říká slovník,
v C++ map a obecně vyhledávací tabulka.

d = {}  # prázdný slovník
d['volba1'] = True
d['volba3'] = '0'
d['graf.typ3'] = 14
atd.

Funkci zpracování pak mohu předat slovník jako
celek. 

def zpracuj(D):
    for klic in D:
        ...zohledni D[klic]
    ...nebo
    if D['volba1']:
        ...
     

> (Obávám se, že jediným "přínosem" koncepce objektového 
> programování je, že 90% zdrojového textu programu 
> je v porovnání s procedurálním programováním jen 
> naprostý balast.)

Podle mého odhadu jste k tomu ještě dostatečně 
nepřičichnul a neměl byste to hodnotit. Jsou oblasti,
kdy je objektově orientované programování zbytečné,
ale u praktických problémů je jich málo. Většinou
je OOP lepší (ne z akademických důvodů, ale protože
se s tím líp pracuje). Je to, jako kdybyste tvrdil, 
že rýč je lepší než motyka, protože se s ním ta hlína
líp uplácává. Musíte změnit přístup. Musíte k tomu
přistoupit nezaujatě a hledat, co se tím asi myslí.

Prostá funkce je někdy určitě lepší, než třída
a její metody. Použité nástroje musí odrážet 
způsob myšlení. Při programování převádíte své
myšlenky na formálnější zápis. U OOP musíte
jinak myslet. Možná jste si zvykl myslet moc
procedurálně (data + algoritmus = program).
Zkuste se na to dívat jako na spolupracující
kousky, personifikujte si je do role specialistů,
kteří poskytují své služby.

> Takže pokud by se proměnné z OptionMenu daly 
> stáhnout do seznamů (po logických celcích), 
> což jde při jejich deklaraci pomocí cyklu, 
> to jsem už vyzkoušel, a ty seznamy jednoduše 
> nastavit jako globální (a ne položku po položce),
> pak by to byla velká úspora kódu.

Těžko se o tom bavit bez hlubší znalosti vašeho
problému a přístupu. Chce to samostatnější příklad,
na kterém ukážete, jak to děláte a jaký je celkový
záměr.

pepr


Další informace o konferenci Tutor