"Doppelte Ausgabe" bei Funktionsaufruf

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
CODY
User
Beiträge: 3
Registriert: Mittwoch 1. Juli 2009, 18:43

Hallo zusammen,

bevor ich mein Problem erläutere, ein kleines Beispiel:

Code: Alles auswählen

def foo(x = 'hello', y = 'world'):
    print x
    print y
    return 1

def bar():
    if foo() == 1:
       print bar
Das Ganze erzeugt nun folgende Ausgabe:

Code: Alles auswählen

>>> bar()
hello
world
bar
Scheinbar wird durch den in bar() eingebetteten Aufruf foo(), die Funktion komplett aufgerufen, d.h. auch die print-Befehle. Die möchte ich nun aber eigentlich gar nicht mehr haben. bar() soll also tatsächlich nur sowas ausgeben, falls die Bedingungen zutreffen:

Code: Alles auswählen

>>> bar()
bar
Frage nun: Ist das (ohne große Umstände) möglich oder sollte ich den Ansatz grundsätzlich neu überdenken? Ich habe dazu auch nichts konkretes gefunden. Falls mir also zumindest jemand weiß, wo ich dazu etwas nachlesen kann, wäre mir auch schon sehr geholfen!

Grüße!
Zuletzt geändert von CODY am Dienstag 6. Dezember 2011, 16:42, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Generell solltest du immer Logik von Ausgabe trennen. Wenn du das nicht beachtest, dann kommt es zu solchen unglücklichen Umständen wie bei dir gerade. Das beste wäre es, wenn du den Code vollständig überarbeitest und nachträglich eine Trennung durchführst. Alternativ könntest du "foo" auch so parametrisieren, dass du Kontrolle über die Durchführung einer Ausgabe hast. Du wirst also nicht um Arbeit herum kommen.
Das Leben ist wie ein Tennisball.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hallo,

mal abgesehen von der kaputten Einrückung; wenn du in der Funtion foo print-Statements hast, und du rufst die Funktion auf, dann wird natürlich auch was ausgegeben, insofern verstehe ich nicht, welchen Ansatz du da überdenken willst? Vielleicht einfach keine `print`s in foo?
Vielleicht beschreibst du mal genauer, was dein Problem ist, ohne diese nichtssagenden Beispiel-Konstrukte, die hier auch nix bringen :)
Benutzeravatar
CODY
User
Beiträge: 3
Registriert: Mittwoch 1. Juli 2009, 18:43

EyDu hat geschrieben: Generell solltest du immer Logik von Ausgabe trennen. Wenn du das nicht beachtest, dann kommt es zu solchen unglücklichen Umständen wie bei dir gerade. Das beste wäre es, wenn du den Code vollständig überarbeitest und nachträglich eine Trennung durchführst. Alternativ könntest du "foo" auch so parametrisieren, dass du Kontrolle über die Durchführung einer Ausgabe hast. Du wirst also nicht um Arbeit herum kommen.
Hmm, okay. Das hatte ich fast schon befürchtet. Wahrscheinlich werde ich den Code dann wohl auch ganz überarbeiten, der alternative ist - vermute ich - unnötig kompliziert. Jedenfalls vielen Dank für deine Antwort!

@frabron:
Mein einziges Problem ist, dass ich eigentlich nur den return-Wert von foo() mit etwas vergleichen möchte, ohne dass gleich die ganze Funktion wieder runtergespult wird. Scheinbar handelt es sich hier aber eher um einen Denkfehler meinerseits. Wie gesagt: Code ganz überarbeiten ist wohl die beste Lösung..

Grüße
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Naja, besonders kompliziert wäre das Parametrisieren nicht:

Code: Alles auswählen

def foo(x = 'hello', y = 'world', output=True):
    if output:
        print x
        print y

    return 1
Nun müsstest du nur überall dort wo nichts ausgegeben werden sollte einfach den dritten Parameter entsprechend übergeben. Soll etwas ausgegeben werden, musst du die Aufrufe nicht ändern Es wird aber darauf hinaus laufen, dass du genau so viel Code anfassen musst und dich später nur darüber ärgerst, dass du es am Anfang nicht gleich richtig gemacht hast.
Das Leben ist wie ein Tennisball.
Antworten