» »

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. :O

# 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
  • 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...

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

HotBurek ::

Problem je do sedaj bil, da se s časom pojavljajo novi primeri oblik cen:

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

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 ::

Utk je izjavil:

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 je izjavil:

V Javi (last time i checked) npr, ne moreš narediti tega:

if (null) {
doesNotExecute();
}

Hvala bogu da ne.



Ne boš verjel, ampak v dinamičnih jezikih ima to smisel. Ne mislim pa s tabo debatirat kaj je boljše.

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 ::

Utk je izjavil:

Kaj je boljše se ve, zakaj potem obstaja tudi slabše pa tudi (v javascriptu enostavno nimaš compilerja, ki bi to preverjal).


odvisno od jezika in designa. V enih jezikih je to dobro narejeno (ala Clojure npr), v drugih pa slabo (ala js)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

pomoč pri SQL stavku v myphpadmin

Oddelek: Programiranje
201445 (519) kuall
»

python-rabim pomoč

Oddelek: Programiranje
162774 (1004) rnla1973
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211447 (1057) noraguta
»

Java metode;

Oddelek: Programiranje
354934 (4126) ragezor
»

BOF > NEON ARES računalnik

Oddelek: Kaj kupiti
494084 (2600) Pyr0Beast

Več podobnih tem