Seite 1 von 1

Synergieeffekte zwischen Funktionsaufrufen?

Verfasst: Samstag 8. September 2012, 05:30
von erdnuss
Hallo Python-Forum, ich bin neu hier. ^.^

Nachdem ich auf ein seltsames Problem gestoßen bin, das sich nicht einfach in eine Suchanfrage übersetzen ließ, dachte ich, ich suche mal auf diesem Wege Rat. Wäre toll, wenn einer von euch eine Idee hätte. :)

Ich suche nach einer Erklärung für folgendes Phänomen:

Meine Funktion grade bekommt einen richtigen und einen potentiell falschen String als Eingabe, sucht unter anderem Tippfehler im potentiell falschen String, sammelt sie und gibt dann als Ergebnis die Liste der Typos aus.

Ich habe eine Reihe von Testfällen, die alle wie erwartet verarbeitet werden, wenn ich sie einzeln durchlaufen lasse. Packe ich aber alle Testeingaben in eine Liste und gehe dann mit

Code: Alles auswählen

for (seq1, seq2, value) in specs:
            self.assertTupleEqual(grade(seq1, seq2), value)
durch diese Liste, finde ich z.B. im Ergebnis für Zeile n einen Fehler aus Zeile n-1.

Also, stark vereinfacht:

Code: Alles auswählen

>>>eingabe_mit_typos_1 = [typo1_1, ok, typo1_2]
>>>eingabe_mit_typos_2 = [ok, typo2_1, ok]

>>> grade(eingabe_mit_typos_1)
[typo1_1, typo1_2]

>>>grade(eingabe_mit_typos_2)
[typo2_1]

>>>for case in [eingabe_mit_typos_1, eingabe_mit_typos_2]:
                grade(case)
[typo1_1, typo1_2]
[typo1_1, typo1_2, typo_2_1]
Anscheinend wird die Liste der Typos, die ich da anlege, irgendwie weitergegeben an den nächsten Funktionsaufruf. Ist das ein bekanntes Problem? Wurde da etwas in einem Cache abgelegt, bzw. gibt es etwas, das ich zwischen den Funktionsaufrufen zurücksetzen kann?

Re: Synergieeffekte zwischen Funktionsaufrufen?

Verfasst: Samstag 8. September 2012, 08:28
von BlackJack
@erdnuss: Irgendwie wäre es ja praktisch gewesen auch den Quelltext zu sehen, der sich unerwartet verhält. Sonst kann man nur raten was da passiert.

Ich rate mal und tippe irgendwo auf ein veränderbares Objekt als Default-Wert. Die Ausdrücke für Default-Werte bei Funktionsaufrufen werden *einmal* ausgewertet, und zwar wenn die ``def``-Anweisung abgearbeitet wird. Jeder Funktionsaufruf arbeitet mit *dem* Ergebnis. Der Default-Ausdruck wird also *nicht* beim *Aufruf* der Funktion jedes mal neu ausgewertet.

Wenn man so ein Verhalten möchte, bindet man den Default-Wert üblicherweise an `None` und testet darauf innerhalb der Funktion um gegebenenfalls ein Objekt dort neu zu erstellen.