Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Voiko syötteen (input) ohittaa debuggauksessa?

Jaska [08.04.2018 22:45:15]

#

Tein Python-skriptiä, johon jäi bugi, joka ilmeni vasta kun käyttäjä syötti viiteen kysymykseen syötteen. Debuggaaminen taidoillani oli hidasta, kun piti viiteen eri kohtaan laittaa kommentti tyyliin

a = raw_input("Anna syöte?")
b = raw_input("Anna syöte?")
c = raw_input("Anna syöte?")
d = raw_input("Anna syöte?")
e = raw_input("Anna syöte?")

muutettiin muotoon

#a = raw_input("Anna syöte?")
a = 1
#b = raw_input("Anna syöte?")
b = 2
#c = raw_input("Anna syöte?")
c = 2
#d = raw_input("Anna syöte?")
d = 1
#e = raw_input("Anna syöte?")
e = 1

Nyt pystyin skippaamaan syötteen lukemisen ja tulostelemaan muuttujia, jolloin löysin bugin. Mutta onko jotenkin fiksumpaa tapaa debugata Python-skriptiä siten, että se skippaisi syötteen lukemisen ja hyppäisi suoraan kohtaan, jossa bugia kannattaa tutkia? Onko debuggereissa toimintoa, jolla voisi sanoa, että viiteen ensimmäiseen inputiin vastataan 1, 2, 2, 1, 1 ja sitten asetetaan breakpointti?

Grez [08.04.2018 23:05:12]

#

Jos et halua koodia muokata, niin voisit myös kirjoittaa syötettävät tiedot tiedostoon ja antaa syötteen ohjelmalle tiedostosta.

Silti sattaa hyvinkin olla järkevämpää muuttaa testauksen ajaksi koodia niinkuin olet tuossa tehnytkin. Sitä en sit tiedä miksi siinä menisi merkittävästi aikaa, eli miksi se muodostuisi debuggaamista merkittävästi hidastavaksi tekijäksi.

Toki laajemmissa projekteissa kannattaa käyttää koneellista testausta ja sitäkin ajatellen tehdä koodi testausystävällisemmiksi niin, että testitapaukset voidaan ajaa koneellisesti ilman syötteen antoa käsin.

Jaska [08.04.2018 23:14:28]

#

Grez kirjoitti:

Sitä en sit tiedä miksi siinä menisi merkittävästi aikaa, eli miksi se muodostuisi debuggaamista merkittävästi hidastavaksi tekijäksi.

Ei siinä mennytkään liikaa aikaa, mutta mietin vaan että voiko asiat tehdä kätevämmin. Vaikka että joku toinen skripti nauhottaisi kaikki inputit ja hiiren liikkeet, jotta joku harvinainen bugi, joka esiintyy vaan tietyillä yhdistelmillä eri inputeista pystyttäisiin helposti toistamaan. Tässä vielä muisti hyvin mitä kuhunkin muuttujaan oli syöttänyt, mutta muistaminen voi vaikeutua jos vika ilmenee vaikka useiden kymmenien inputien antamisen jälkeen.

kalppi [09.04.2018 00:54:32]

#

Huomiona se etten pythonia varsinaisesti osaa, mutta googlen avulla sain seuraavanlaisen tehtyä, jos siitä vaikka jotain apua olisi:

from functools import wraps

def counter(func):
    @wraps(func)
    def tmp(*args, **kwargs):
        tmp.count += 1
        return func(*args, **kwargs)
    tmp.count = -1
    return tmp

@counter
def debug_lue(t):
	return [1, 2, 2, 1, 1][debug_lue.count]


def lue(teksti):
	return raw_input(teksti + ": ")


DEBUG = True

if DEBUG == True:
	lue = debug_lue

a = lue("Eka")
b = lue("Toka")
c = lue("Kolmas")

print a, b, c 	# 1 2 2

Jaska [09.04.2018 12:41:27]

#

Jeps. Hyvin toimii ja näköjään osaat ainakin tässä asiassa enemmän Pythonia kuin minä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta