Biztos en vagyok a hulye, de ezt nem ertem, hogy itt mi tortenik a dict-el a func hivasok kozott:
def parse(params,d={}):
for p in params.split(";"):
k,v=p.split("=",1)
d[k]=v
return dx=parse("a=1;b=2")
print(x)
y=parse("c=3")
print(y)
z=parse("d=4;e=5")
print(z)
# ./wtf.py
{'a': '1', 'b': '2'}
{'a': '1', 'b': '2', 'c': '3'}
{'a': '1', 'b': '2', 'c': '3', 'd': '4', 'e': '5'}
ugye itt azt varnam, hogy mindig csak az aktualis parse() hivas eredmenye keruljon bele a returned dict-be, de a korabbiak hogy kerulnek oda pl. a z-be az a:1 ?
igen, tudom hogy ha a d={} nem a parameterekbe lenen hanem a def utani sorban akkor mukodik, de az volt a cel, hogy opcionalisan meg lehessen adni egy mar letezo dict-et, hogy abba parsoljon bele.
- 1540 megtekintés
Hozzászólások
Mert list és dict paraméterben mem referencia lesz, és ha már létezik akkor ugyan az lesz.
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
koszi, legalabbis elmagyaraztak tobbfele megkozelitesbol, hogy ez miert van igy, meg hogy ez mekkora faszsag masok szeirnt is :)
szoval a gyakorlatban ez igy viselkedik, es igy mar ertheto:
default_d={}
def parse(params,d=default_d):
...
- A hozzászóláshoz be kell jelentkezni
meg hogy ez mekkora faszsag masok szeirnt is :)
Nem állítom, hogy nem fájdalmas, de őszintén szólva így legalább konzisztens a referencia kezelés a nyelvben, inkább ez, mint a mindenféle kivételek gányolása. Fel szoktuk tenni egyébként interjún ezt a kérdést, a legtöbben rájönnek, hogy mi hibázik, elég sokan arra is, hogy miért, érdekes módon megoldani egész sokan nem a gyak minden production codeban tele levő if p is None: formával próbálják. :)
Egyébként ez elég c kód így, szerintem tisztább, (de mindenképp pythonikusabb, bár az nem annyira szinonima mindig :D) ha a parse azt csinálja, amit a neve mond, ad egy felparsolt dictet, aztán ha a hívó szeretné ezt másokkal összeönteni, akkor mondhatja, hogy mydict.update(parse(params)). Ha háklis vagy az erőforrásokra, akkor a d[k]=v helyett mondhatod, hogy "yield k,v".
Ja, és ez nyilván alkalmazás függő, de ilyenre tényleg nincs valami értelmes serializált formátum, hogy ne kelljen splitekkel baszakodni?
- A hozzászóláshoz be kell jelentkezni
> értelmes serializált formátum, hogy ne kelljen splitekkel baszakodni?
az inputra nincs rahatasom, amugy emaileket parsolok es a Content-*: headerekkel szivok epp, amugy a fenti pelda kod jelentosen leegyszerusitett, ennel azert bonyolultabb sokkal...
- A hozzászóláshoz be kell jelentkezni
emailekre ott van az stdlibben az email (meg a mailbox). Egész normális működésre képes való világ beli levelekkel is, Van valami különösebb okod arra, hogy kézzel szenvedj headerekkel?
- A hozzászóláshoz be kell jelentkezni
tudom, eddig azt hasznaltam. de egyreszt tetu lassu (foleg pypy-vel, bar azt most talan megfixeltek), meg bugos is (van egy csomo levelem amin az elszall - persze nyilvan az email is hibas valamennyire, de lehetne toleransabb a parseruk).
csak osszehasonlitaskent, az en parserem 0m7.724s (pypy-vel 0m6.703s) alatt daralt le 95 ezer levelet, az email lib ugyanezt 4m10.829s (pypy-vel 2m58.758s) alatt...
- A hozzászóláshoz be kell jelentkezni
Sebességét annyira nem néztem (nem ott volt nekünk a bottlenekc), ajánlani azért mertem, mert azért valamennyire megtekertük mindenféle érdekesebb levéllel, és csak nagyon fosott spam jellegűeken esett el néha, eleve azért kezdtük el nézni, mert a java minden szarra besírt.
De jó tudni, hogy valójában nem az igazi. köszi.
a pypy ticket fini :)
- A hozzászóláshoz be kell jelentkezni
hat 100k levelbol volt ugy 7 amin elhasalt szoval annyira azert valoban nem rossz, de akkor is. foleg, hogy en spamszurot fejlesztek, igy foleg spam leveleket kell parsolni...
meg van sok olyan level, amin nem szall el, de megse jol parsolja, kimaradnak mime partok vagy rosszul irja a content typeot...
- A hozzászóláshoz be kell jelentkezni
Az mondjuk annyira nem katasztrófa azért, a mime part elhagyás már karcosabb. Ill hát ha én csinálnék spamszűrőt, akkor az, aki nem tudja szabványosan összerakni a levelét, mehetne a faszba :D
- A hozzászóláshoz be kell jelentkezni
> mime part elhagyás
pedig meglepoen sok emailben hianyzik a vegerol az end-boundary, ami a levelezoprogramokat lathatoan nem zavarja, de az email lib tudomast sem vesz emiatt az utolso partrol :(
> aki nem tudja szabványosan összerakni a levelét, mehetne a faszba
en egyetertenek, de ahogy altalaban, a spamek (nyilvan nem mind, de eleg sok) jobban betartjak az RFC-ket mint a nem-spam levelezes... kulonos tekintettel a PHPistikek altal osszekokanyolt webaruhazak rendeles-visszaigazolo meg szamla leveleire, de lattam mar valami nyugateuropai allami intezetbol is olyan levelet amit minden alkalommal megfogott a szurom mert nem birta parsolni. de amig az outlook es/vagy thunderbird megjeleniti, addig muszaj nekem is valahogy belelatni...
- A hozzászóláshoz be kell jelentkezni
pedig meglepoen sok emailben hianyzik a vegerol az end-boundary, ami a levelezoprogramokat lathatoan nem zavarja, de az email lib tudomast sem vesz emiatt az utolso partrol :(
Hú, erről rémlik valami, megpróbálom majd feltúrni.
pedig meglepoen sok emailben hianyzik a vegerol az end-boundary, ami a levelezoprogramokat lathatoan nem zavarja, de az email lib tudomast sem vesz emiatt az utolso partrol :(
De jó, hogy nem én fejlesztek ilyesmit :D Írtam már ilyen-olyan parsert életemben, de email nem szeretnék, az átlagosnál nagyobb szopásnak látszik.
- A hozzászóláshoz be kell jelentkezni
> az átlagosnál nagyobb szopásnak látszik.
pedig semmi ez a pdf parsolasahoz kepest... de meg a html is tobb meglepetest tartogat :)
- A hozzászóláshoz be kell jelentkezni
jó, hát ki mivel szopatja magát :D
- A hozzászóláshoz be kell jelentkezni
elkeszult a nagy mu, de csak eros idegzetueknek ajanlom a megtekinteset :)
45k spam es 100k nemspam levelen tesztelve, osszehasonlitva az email lib kimenetevel, 99%-ban ugyanaz a maradek 1%-ban pedig jobb lett. es vagy 10x gyorsabb!
- A hozzászóláshoz be kell jelentkezni
Tipp gyors es biztonsagos parsolashoz: https://github.com/google/wuffs
Ez persze mas jellegu befektetest igenyel, mint kezzel pythonban osszedobni valamit.
- A hozzászóláshoz be kell jelentkezni
.
- A hozzászóláshoz be kell jelentkezni
A d default értéke mutable. Egy rendes IDE nyavajogna miatta rögtön. :)
- A hozzászóláshoz be kell jelentkezni
Raadasul nem csak mutable, de a fv parse-olasakor, egyszer hozza letre. Nem minden egyes hivaskor, ahogy a kerdezo varna.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Klasszikus hiba, pedig elegge logikus.
Szokasos javitasa: d=None default erteknek, aztan if d is None: d={}
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
nekem meg nem sikerult 20 ev alatt belefutni :)
igen en is None-val oldottam meg magamtol, csak annyira bantja a szemem, erosen ganyolasnak nez ki :)
- A hozzászóláshoz be kell jelentkezni
Csinalj ra akkor dekoratort, ami a parametereken vegigmegy, es az ures listakat kicsereli uj ures listakra, dictnel, setnel ugyanigy! Lehet, hogy mar van is ilyen, nem tudom.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Gányolásra mégnagyobb gányolás XD
// Hocus Pocus, grab the focus
winSetFocus(...)
http://c2.com/cgi/wiki?FunnyThingsSeenInSourceCodeAndDocumentation
- A hozzászóláshoz be kell jelentkezni
def parse(params, d=None):
parsed = {k: v for k, v in (p.split("=", 1) for p in params.split(";"))}
return parsed if not d else dict(d, **parsed)
?
- A hozzászóláshoz be kell jelentkezni
ez tetszik! sajnos a gyakorlatban lenyegesen bonyolultabb a parser (whitespacek, escapeles, idezojelek, szintaxis hibak stb), a fentit csak peldanak irtam...
- A hozzászóláshoz be kell jelentkezni
Esetleg valami kész parser megoldást használni?
Mint pl. ez?
https://www.dabeaz.com/ply/ply.html
(Egyébként elég sok hasonló létezik ezen felül is...)
"Share what you know. Learn what you don't."
- A hozzászóláshoz be kell jelentkezni
nem vagom a lex/yacc szintaxist (vagy 20 eve nem is talalkoztam ilyennel sehol, azt hittem mar kihalt :))
inkabb valami cseles regexp lesz a megoldas, vagy marad a karakterenkenti vegigiteralas, keves ilyen string van es nem is hosszuak (atlag 40-50 karakter), ki lehet birni, nem ezen fog mulni. de lehet erre hasznalom az email lib sajatjat, majd meglatom.
- A hozzászóláshoz be kell jelentkezni
Jók ezek a magas szintű nyelvek, de nagyon kell őket ismerni.
Nemrég azzal szívtam php-ban, hogy:
if (!query->execute()) {...}
2x került be az SQL-be amit akartam. Hogy ezt mi a halálért értékelte ki kétszer, csak tippem van, de amint átírtam erre, működött:
$query_result=query->execute();
if (!$query_result) {...}
- A hozzászóláshoz be kell jelentkezni
Ha tanulni akarsz: https://en.wikipedia.org/wiki/Pure_function
Még ha a Python azt is tenné, amit szeretnél, nagyon gáz bemenő paramétert módosítani (és vissza is adni).
- A hozzászóláshoz be kell jelentkezni
Ó, mennyi ilyen kóddal találkoztam a régi szép időkben.
Ha tartós rendszert építesz és okos csapatot nevelsz, akkor száz kiadásban sem érheti baj; ha csak a gépekre hagyatkozol, akkor egyszer jól jársz, máskor rosszul; de ha sem a rendszer nem bírja a terhet, sem a csapat nem tanul a hibákból, akkor minden egyes kiadás kockázat.
- A hozzászóláshoz be kell jelentkezni
> nagyon gáz bemenő paramétert módosítani (és vissza is adni).
Kivéve persze, ha a kolléga azért nem követi a 'pure function' modellt ebben az esetben, mert nem is akarja.
(Tudni kell, hogy nagyon sokféle modell van a programozásban, ezek közül számos olyan is van, amik nem használhatók egyszerre.)
- A hozzászóláshoz be kell jelentkezni
errol a pure izerol most hallok eloszor... de en amugy se kovetek senkit es semmit, mindig elol megyek :)
nem veletlen nem dolgozom programozokent, utalom ha megmondjak hogy csinaljam... a hobbyba meg ne ugasson bele senki :)
- A hozzászóláshoz be kell jelentkezni
Okos emberektől érdemes tanulni, elég nagy tudománya van ennek a tákoláson túl. Amúgy hobbyból nyugodtan lehet tákolni, csak akkor ne csodálkozz, hogy tökön lövöd magad, és ha utána fórumtémát nyitsz, akkor ne csodálkozz, ha beleugatnak, hiszen te kérted :).
- A hozzászóláshoz be kell jelentkezni
A Chad programozók márpedig módosítják a bemenő paramétert amikor kell. Nyilván egyszerűsít, ha csak pure functionök vannak, de aztán kiderül, hogy többet fut a GC mint a programunk, és akkor jön a pislogás. Szóval mindent csak ésszel!
- A hozzászóláshoz be kell jelentkezni
"Result variable" a jelenség neve, és kód smellnek számít.
// Hocus Pocus, grab the focus
winSetFocus(...)
http://c2.com/cgi/wiki?FunnyThingsSeenInSourceCodeAndDocumentation
- A hozzászóláshoz be kell jelentkezni