Forum » Programiranje » En bug
En bug
HotBurek ::
Dobro jutro.
Evo, nov dan, nov zanimiv bug.
Pri importu podatkov sem opazil, da je presenetljivo veliko cen vnešenih v CHF valuti. In sem šel raziskovat, zakaj pride do tega.
Kljub temu, da gre za simple bug, ga na oko nisem našel. Šele ko sem spodnjo kodo testiral na različnih primerih, sem našel, kje je problem.
In sedaj je potrebno ponovno uvozit kakšnih 300.000 produktov. Ker fail.
Evo, nov dan, nov zanimiv bug.
Pri importu podatkov sem opazil, da je presenetljivo veliko cen vnešenih v CHF valuti. In sem šel raziskovat, zakaj pride do tega.
Kljub temu, da gre za simple bug, ga na oko nisem našel. Šele ko sem spodnjo kodo testiral na različnih primerih, sem našel, kje je problem.
In sedaj je potrebno ponovno uvozit kakšnih 300.000 produktov. Ker fail.
# remove trailing CHF in price (1'099.00 CHF to 1'099.00) if str(product.price.endswith("CHF")): # remove CHF from price product.price = product.price[0:product.price.find("CHF")]; # and strip product.price = product.price.strip(); # set price currency product.priceCurrency = "CHF";
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
- spremenilo: HotBurek ()
mr_chai ::
Probaj ta konkreten primer rešit na bolj generičen način.
Mogoče je bolje, da to rešiš z regexom. Kjer izluščiš cifro in valuto. Potem pa cifro spremeniš v tip Money (https://pypi.org/project/money/#usage), attribut price v Productu naj bo Money tip, da si prišparaš kakšen strel v koleno v prihodnosti.
Torej, tle ne rabiš čekirati if price endswith CHF blabla.. A veš, mogoče boš moral v prihodnosti podpreti več različnih valut. Naj ti Money pol vrže nek exception, če poizkušaš kreirat kakšno valuto, ki ne obstaja, ker npr v CSV datoteki ni navedena in pol pohendlaš to tko, da imaš neko default valuto npr CHF v tem primeru...
Mogoče je bolje, da to rešiš z regexom. Kjer izluščiš cifro in valuto. Potem pa cifro spremeniš v tip Money (https://pypi.org/project/money/#usage), attribut price v Productu naj bo Money tip, da si prišparaš kakšen strel v koleno v prihodnosti.
Torej, tle ne rabiš čekirati if price endswith CHF blabla.. A veš, mogoče boš moral v prihodnosti podpreti več različnih valut. Naj ti Money pol vrže nek exception, če poizkušaš kreirat kakšno valuto, ki ne obstaja, ker npr v CSV datoteki ni navedena in pol pohendlaš to tko, da imaš neko default valuto npr CHF v tem primeru...
Zgodovina sprememb…
- spremenilo: mr_chai ()
kuall ::
in kje je problem? edino kar takoj vidim je, da nimaš case insensitive primerjave za CHF.
nauči se izražati jasno, to je tudi ena dobra lastnost programerja.
to je podobno kot ko mi stranka nalima sliko in napiše NAE DELa pol pa tuhtam kot idiot, kaj je sploh narobe in kaj bi bilo prav.
idealno je, če napišeš:
tole je narobe tu: x
tole bi bilo prav: y
napako ponoviš po teh korakih: 123
nauči se izražati jasno, to je tudi ena dobra lastnost programerja.
to je podobno kot ko mi stranka nalima sliko in napiše NAE DELa pol pa tuhtam kot idiot, kaj je sploh narobe in kaj bi bilo prav.
idealno je, če napišeš:
tole je narobe tu: x
tole bi bilo prav: y
napako ponoviš po teh korakih: 123
HotBurek ::
Problem je do sedaj bil, da se s časom pojavljajo novi primeri oblik cen:
Zgornje vrednosti za "price" bi morale bito zgolj cifre (100.12). In take, ki to niso, potem sproti rešujem.
kuall, problem je bil v if pogoju, ki vedno vrača True zaradi napačno postavljenega zaklepaja.
EUR10.10 470 EUR 1'099.00 CHF 320 zł 1 38462 12199999998.00
Zgornje vrednosti za "price" bi morale bito zgolj cifre (100.12). In take, ki to niso, potem sproti rešujem.
kuall, problem je bil v if pogoju, ki vedno vrača True zaradi napačno postavljenega zaklepaja.
# Tale vedno vrne True in gre v if statement if str(product.price.endswith("CHF")): # Zgornji zapis je isto kot tale if "True": # Ali pa kot tale if "False": # if "string" vedno vrne True... # Tole je pa popravek (premik zklepaja) if str(product.price).endswith("CHF"): # Ali pa še dodatno enačaj na koncu if str(product.price).endswith("CHF") == True:
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
Utk ::
Kater beden jezik je to, ki je loči stringa od booleana? Python? Hvala, da si me spomnil kako je beden.
Zgodovina sprememb…
- spremenil: Utk ()
mr_chai ::
Kater beden jezik je to, ki je loči stringa od booleana? Python? Hvala, da si me spomnil kako je beden.
To je feature. Nil-punning. Nisem pytnovc, sam verjetno je to mišljeno, da lahko nardiš.
if Nil:
this_does_not_execute;
Torej imaš poleg boolean True tudi truthy vrednosti, kar je vse kar ni Nil.
V Javi (last time i checked) npr, ne moreš narediti tega:
if (null) {
doesNotExecute();
}
@HotBurek. Ja napiši si en modul, ki hendla samo parsanje cen. Zdej, če cene ne sledijo nekemu lokalizacijskemu formatu, npr EUR 10.44 vs 10.44 EUR. Moraš pač vse te case pohendlat ali preko regexa, je pa opcija da pogledaš za kakšen parser generator v Pythonu in nardiš eno simpl gramatiko okol tega, sam mogoče je to overkill za tebe.
Vedno pa najprej pogledaš, če je kdo že rešil tvoj problem. Ali si probal tole ? https://pypi.org/project/price-parser/ Probaj te tvoje stringe feedat v Price.fromstring("1'099.00 CHF")
Utk ::
V Javi (last time i checked) npr, ne moreš narediti tega:
if (null) {
doesNotExecute();
}
Hvala bogu da ne.
mr_chai ::
Utk ::
Kaj je boljše se ve, zakaj potem obstaja tudi slabše pa tudi (v javascriptu enostavno nimaš compilerja, ki bi to preverjal).
mr_chai ::
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | pomoč pri SQL stavku v myphpadminOddelek: Programiranje | 1445 (519) | kuall |
» | python-rabim pomočOddelek: Programiranje | 2774 (1004) | rnla1973 |
» | [Python3] Izvajanje ukazov po določenem časuOddelek: Programiranje | 1447 (1057) | noraguta |
» | Java metode;Oddelek: Programiranje | 4934 (4126) | ragezor |
» | BOF > NEON ARES računalnikOddelek: Kaj kupiti | 4084 (2600) | Pyr0Beast |