A functools modul partial() függvénye arra szolgál, hogy egy több paraméterrel rendelkező hívható objektumból bizonyos paraméterek értékének rögzítésével egy új hívható objektumot állítson elő, amely ilyen módon az eredeti hívható objektum egy speciális változata.
E módszer azáltal teszi olvashatóbbá a kódot, hogy a partial() eredményét egy, az adott célhoz illeszkedő kifejező névhez tudjuk rendelni. Továbbá, egyszerűbbek és biztonságosabbak lesznek a hívások, nem kell újra és újra ugyanazokat az argumentumokat beírni.
A Python tudásépítés lépésről lépésre című e-könyvben számos alkalmazási példát találunk, de most egy olyan, gyakorlatban is jól hasznosíthatót mutatunk, amely nem szerepel a könyvben.
Egy olyan grafikus felhasználói felülettel (GUI) rendelkező alkalmazás készítése a feladat, amellyel két címke (label) feliratát egy nyomógomb (button) megnyomásával meg tudjuk cserélni. Az alábbi képen látható egy lehetséges megvalósítás. Ebben két helyen is használtuk a partial() függvényt. A részletes kommentek segítik a működés megértését és azt, hogy az adott helyen miért alkalmazzuk a partial() függvényt.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import tkinter as tk from functools import partial root=tk.Tk() # Mivel ugyanolyan szegéllyel, háttérrel, betűszínnel és -típussal rendelkező # címkéket kívánunk létrehozni, ezért a Label konstruktor parciális változatát # állítjuk elő, amelyben rögzítjük e jellemzők értékét. # Az új, specializált konstruktornak egy kifejező nevet adunk. LabelYellowBlue = partial(tk.Label, root, bg='yellow', fg='blue', bd=1, relief=tk.SOLID, font=('Courier',20,'bold')) # Létrehozzuk a két ugyanolyan megjelenésű címkét, de eltérő felirattal. # Ezek feliratát fogjuk egy gombnyomással megcserélni. lb1 = LabelYellowBlue(text='Címke1') lb2 = LabelYellowBlue(text='Címke2') # Mielőtt a nyomógomb grafikus elemet létrehoznánk, definiáljuk a lenyomásakor # végrehajtandó függvényt. def swap_text(label1, label2): label1['text'], label2['text'] = label2['text'], label1['text'] # A nyomógomb létrehozása. Minthogy a command paraméter értéke egy argumentumok # nélküli függvény kell, hogy legyen, ezért a fenti függvénynek egy parciális # változatát rendeljük hozzá, ahol a két paraméter értékét a korábban létrehozott # címkeobjektumokkal rögzítjük. btn = tk.Button(root, bg='gray90', text ='Címkék szövegcseréje', font=('Arial',14), command = partial(swap_text, lb1, lb2)) # A grafikus elemek lehelyezése. lb1.pack() lb2.pack() btn.pack() root.mainloop() |
Próbáljuk ki a programot! Ennek eredményeként ezt láthatjuk:

A GUI alkalmazásokkal a Python tudásépítés lépésről lépésre című e-könyv „Grafikus felhasználói felület készítése” fejezete foglalkozik meglehetősen részletesen. Ennek tanulmányozása különösen ajánlott azoknak, akik még nem járatosak a tkinter modulban, mert annak használata a hivatalos dokumentációban szereplő leírásból nem biztos, hogy könnyen elsajátítható.