[python] dynamicke metody
Hynek Fabian
hynek.fabian na firma.seznam.cz
Pátek Duben 25 15:08:03 CEST 2014
Jestli jsem ten puvodni priklad dobre pochopil tak chyba je tady:
setattr(self, _func, self._sql(_sql = _sql))
Pridas sice atribut se spravnym jmenem, ale nestrcis do nej referenci na
tu funkci alebrz vysledek z jejiho zavolani.
potrebujes neco _zhruba_ (strilim od boku, nevyzkouseno) takoveho:
setattr(self, _func, lambda sql, params: self._sql(_sql, params))
Mam-li to brat jako intelektualni cviceni, pripada mi to cely ponekud
prekomplikovany, stacila by uplne jednoducha fabricka funkce ktera bude
vracet uzaveru se vsim:
def queryMaker(conn, query):
def queryStub(**params):
with conn as cur:
cur.execute(query, params)
return cur.fetchall()
return queryStub
--- cut here ---
addSpam = queryMaker(conn, "INSERT ham = %(ham)s INTO spam")
addSpam(ham = 42)
Strkat to jeste do slovniku nema valny smysl – pokud ho budes bouchat
rucne, je to zbytecny a pokud by tam byla nejaka dalsi abstrakce (jako
treba ze by se ten slovnik odnekud nacital) tak nejde nejak rozume
zajistit aby ocekavane parametry odpovidaly skutecnym a cely se to
rozsype. (A proto se takovy vylomeniny ve skutecnosti nedelaji…)
On 04/25/14 12:07, Marek Sirový wrote:
> Ahoj,
>
>
> diky za reakci, sqlalchemy znam a ORM taky, ale mam radeji ciste sql
> dotazy. Kazdopadne o to nejde.
>
> Pravdepodobne jsem spatne popsal problem, me nejde o to pripojit se k
> databazi, me jde o to vyzkouset si napsat tu abstrakci.
>
> Uplne konkretne, chci napsat tridu, ktera podle predaneho pole behem
> inicializace si vygeneruje metody dle slovniku. Nedelam to pro nic
> konkretniho, jen me bavi python a zkousim co vsechno jde a tim se
> ucim dalsi veci
>
>
>
>
> #moje magicka trida class db: # nejaka magie
>
>
>
> # mam slovnik: SQL = { 'addUser' : 'insert into users (name, email)
> VALUES ($name, $email);', 'delUser' : 'delete from users where name
> = $name', }
>
> # provedu si inicializaci data = db(SQL)
>
> # a ted mam objekt data, ktery ma metodu addUser a delUser, # pricemz
> kazda z nich prebira **kwargs a podle toho doplni dotaz do db. #
> priklad:
>
> data.addUser(name = 'karel', email = 'karel na email.tld')
>
>
> Toto pouziti je jen priklad, ktery me napadl pro vyzkouseni, SQL
> injection tam samozrejme hrozi, ale o bezpecnost tu nejde, tu bych
> stejne resil pravdepodobne uz na formularich pomoci validace a csrf,
> pak urcite na db kde z kodu volam stejne jedine procedury a pohledy,
> Ale ted si hraju s dymanickymi metodami a chci zkusit generovat je ze
> slovniku. Kod uplne v prvnim prispevku je pokus, ktery nefunguje
> protoze sem nejpis neco spatne pochopil.
>
> Predem diky
>
> _______________________________________________ Python mailing list
> python na py.cz http://www.py.cz/mailman/listinfo/python
>
> Visit: http://www.py.cz
>
Další informace o konferenci Python