asi před rokem kolega s úspěchem nasadil do GUI kódu "currying" (tu pythonní obdobu) pro předzpracování zobrazených dat.
Chápu to správně, že místo f(data1) -> data2; g(data2) -> data3 pouzil f(data1) -> g; g() -> data3? Má to nějaké významné výhody, převažující nevýhodu, že sa na data2 nemůžu kouknout?
V konkrétním kontextu (přiřazení metody v konstruktoru objektu) to má dost velkou výhodu v tom, že prakticky celé chování objektu je zřejmé z jednoho rychlého pohledu. Žádný meziobjekt s vlastním jménem se nevytváří. Představ si, že máš pole slovníků s daty jednotlivých řádků (třeba z databáze) a GUI objekt, který z těchto řádků dokáže vybrat podmnožinu zobrazených údajů (z klíčů ve slovníku) do sloupců a transformovat ji dynamicky podle aktuálního nastavení sloupců. Z transformace vzejde dvojice (reprezentace, řadicí data) tak, že ze slovníku { 'jmeno': 'KaRel', 'vek': 23 } uděláme { JMENO: ('Karel', 'Karel'), VEK: ('23', 23) }. Konstruktor pro sloupec má hlavičku
def __init__(nazev, transformace):
Pro každý sloupec můžeš udělat samozřejmě udělat samostatnou funkci typu
def transformujVek(radek):
return (str(radek[klic]), radek[klic])
a tu funkci přidat do konstruktoru. Pokud si ale uděláš funkci transformuj(), která obsahuje functools.partial(), vypadá deklarace sloupců pro danou transformaci třeba takto:
Sloupec(
JMENO,
transformuj('jmeno', lambda x: x.capitalize(), lambda x: x)
),
Sloupec(
VEK,
transformuj('vek',lambda x: x, lambda x: x)
)
Příklad jsem zjednodušil a upravil, ve skutečnosti dochází k transformaci různorodých dat, skutečný kód je psán trochu pěkněji a samozřejmě je možné při volání funkce transformuj() vynechat implicitní hodnoty (typu lambda x: x). Ale doufám, že je z příkladu jasné, k čemu to slouží. Na parametry funkce transformuj() nikdy nikdo nahlížet nepotřeboval.