[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