BlackJack hat geschrieben:@Alfons Mittelmeyer: Das einzige davon das nicht geht und vielleicht auf den ersten Blick überraschend ist, ist das letzte Beispiel. Alles andere sollte man erwarten wenn man Python's Semantik verstanden hat.
Zum Beispiel ist das Äquivalent zu ``print(5 + 1, 2, 3)`` als ``*``-Form ``print(*(5 + 1, 2, 3))``. Wie man auf die abwegige Idee kommen kann die ``5 +`` vor dieses Konstrukt zu schreiben, in der irrigen Hoffnung das würde sich dann auf das erste Element in dem Tupel beziehen ist mir ein Rätsel.
Das sind doch keine abwegige Gedanken, betrachten wir uns:
Der Operator "
+" ist ein binärer Operator. Und das '
*' ist in diesem Fall ein unärer Operator. Unäre Operatoren haben allgemein Vorrang vor binären Operatoren. Daher sollte von der Semantik her zuerst das Tuple expandiert werden, wonach dann die 5 zum ersten Element addiert werden kann. Aber hier gibt es einen Syntax Error. Der Parser parst auf einen mathematischen Ausdruck und erwartet einen Rechtswert. Dabei sieht er wohl fälschlicherweise das '*' als den binären Multiplikationsoperator an und wirft einen SyntaxError.
Es ist derselbe Fehler, wie bei:
Dieses und das übrige Verhalten erklärt sich natürlich daraus, daß hier das '*' gar kein normaler unärer Operator ist, sondern hier '*' den letzten Teil einer positionellen Argumentliste expandiert und danach müssen keyword Argumente folgen, welche zudem die Funktion 'print' auch gar niicht kennt.
'*' ist also nicht einfach die Expandierung eines Tuples sondern die Expandierung eines Tuples als letzer Teil der positionellen Funktionsargumente.