mehrere Werte zurück liefern
@jbs: Das ist aber der einzige Fall wo die Klammern wirklich das Tupel erzeugen.
Mit oder ohne Klammern nimmt es verschiedene Wege durch den Parser. Daran habe ich implizit und explizit unterschieden. Für mich heißt `return a, b` das zwei Werte zurückgegeben werden, jedoch `return (a, b)` dass ein Wert, nämlich ein Tupel zurückgegeben wird. Das Ergebnis ist das selbe, doch die Intension ist IMHO eine andere.BlackJack hat geschrieben:@sma: Die Unterscheidung kann ich nicht nachvollziehen. In beiden Fällen wird das Tupel aus der `expr_list` erzeugt. Die Kommata sind der Ausschlaggebende Faktor für das Tupel. Damit erzeugt man explizit ein Tupel.
Stefan
@sma: Also ich würde da nicht von impliziten oder expliziten Tupeln sprechen. In beiden Fällen ist es *ein* Wert, nur im zweiten Fall sind halt noch die Klammern drumherum, um eine Absicht des Programmierers deutlicher zu machen.
Es kann ja aber auch Fälle geben, wo man semantisch gesehen mehrere Werte zurückgeben möchte, aber trotzdem Klammern setzt, weil nicht alles auf einer Zeile Platz findet.
Oder man setzt Klammern um Tupel, nicht weil man die Elemente zusammen als einen Wert sehen möchte, sondern um die Lesbarkeit zu erhöhen. Dabei habe ich jetzt nicht ``return``, sondern zum Beispiel LCs oder Generatorausdrücke im Blick. Gerade neulich hier im Forum passiert, das jemand durch ``[x*y for x, y in spam()]`` verwirrt wurde, weil das Komma als Trenner zwischen zwei Elementen in einer Liste interpretiert wurde. Klammern machen das etwas lesbarer: ``[x*y for (x, y) in spam()]``. Ich würde aber nicht davon sprechen, dass man da unterschiedliche Arten von Tupeln erzeugt.
Welchen Weg das durch den Parser nimmt, ist IMHO auch ein gutes Stück Implementierungsdetail. Grammatiken, die die Grundlage für einen Parser sind, müssen nicht zwingend die sein, die man Programmierern zum Erklären der Syntax zeigt.
Es kann ja aber auch Fälle geben, wo man semantisch gesehen mehrere Werte zurückgeben möchte, aber trotzdem Klammern setzt, weil nicht alles auf einer Zeile Platz findet.
Oder man setzt Klammern um Tupel, nicht weil man die Elemente zusammen als einen Wert sehen möchte, sondern um die Lesbarkeit zu erhöhen. Dabei habe ich jetzt nicht ``return``, sondern zum Beispiel LCs oder Generatorausdrücke im Blick. Gerade neulich hier im Forum passiert, das jemand durch ``[x*y for x, y in spam()]`` verwirrt wurde, weil das Komma als Trenner zwischen zwei Elementen in einer Liste interpretiert wurde. Klammern machen das etwas lesbarer: ``[x*y for (x, y) in spam()]``. Ich würde aber nicht davon sprechen, dass man da unterschiedliche Arten von Tupeln erzeugt.
Welchen Weg das durch den Parser nimmt, ist IMHO auch ein gutes Stück Implementierungsdetail. Grammatiken, die die Grundlage für einen Parser sind, müssen nicht zwingend die sein, die man Programmierern zum Erklären der Syntax zeigt.
Wir haben hier unterschiedliche Meinungen. Hier muss man z.B. wissen, welchen Weg der Parser nimmt, um zu erkennen, welches (implizite) Tupel zurückgegeben wird:
Man dann das durch explizite Tupel eindeutig machen:
Stefan
Code: Alles auswählen
return a if b else a, b
Code: Alles auswählen
return (a if b else a, b)
return a if b else (a, b)
@sma: Ich hätte da explizite Klammerung gesagt, weil das eben in meinen Augen nichts mit Tupeln zu tun hat sondern wie in allen anderen Fällen auch, einfach Klammerung ist, um die Reihenfolge der Auswertung zu beeinflussen. Und der erste Fall mit Klammerung ist IMHO sinnlos, weil man da trotzdem wissen muss, wie das nun ausgewertet wird. Wenn man das deutlicher machen möchte, müsste es so aussehen:
*So* würde ich es auch schreiben.
Code: Alles auswählen
return (a if b else a), 23
# oder
return ((a if b else a), 23)