Seite 1 von 1

Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 21:34
von Sophus
Hallo Leute, irgendwie sehe ich den Wald vor lauter Bäumen nicht.

Angenommen, wir wollen einer Funktion Argumente übergeben. Wir stellen uns vor, wir müssen einer Funktion zwei Argumente übergeben:

Code: Alles auswählen

function ('foo', 'bar')
oder auch

Code: Alles auswählen

foo = "i am a foo"
bar "i am a bar"
function (foo, bar)
Bis hierher kein Problem. Nun möchte ich der Übersichthalber die Argumente mittels des neuen Formates übergeben Zunächst das Grundgerüst:

Code: Alles auswählen

'{} {}'.format('foo', 'bar')
Jetzt versuche ich dieses Grundgerüst umzusetzen:

Code: Alles auswählen

foo = "i am a foo"
bar "i am a bar"
function ('{} {}'.format(foo, bar))
Und wenn ich das umsetze, bekomme ich die Fehlermeldung, dass die aufzurufende Funktion zwei Argumente erwartet, aber nur ein Argument übergeben wird. Jetzt bin ich verwirrt. Sollte nich foo und bar durch dieses Format übergeben werden?

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 21:54
von nezzcarth
Du übergibst der Funktion nur ein Argument: Den String "i am a foo i am a bar"; format ist zum formatieren von Zeichenketten gedacht, mit Argumentübergabe hat das eigentlich nichts zu tun.

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 21:58
von Sophus
Ich glaubte/dachte, man könnte mittels dieses Formates auch Argumente übergeben. Aber du hast mit deiner Anmerkung Recht, ich übergebe ein Argument, aber auch mit meiner kleinen Änderung komme ich nicht weit:

Code: Alles auswählen

foo = "i am a foo"
bar "i am a bar"
function ('{}', '{}'.format(foo, bar))

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 22:09
von nezzcarth
Sophus hat geschrieben:Ich glaubte/dachte, man könnte mittels dieses Formates auch Argumente übergeben. Aber du hast mit deiner Anmerkung Recht, ich übergebe ein Argument, aber auch mit meiner kleinen Änderung komme ich nicht weit:
Was soll denn der Vorteil dieser Variante sein?

Beispiel 2 ist übrigens syntaktisch korrekt: Es wird ein String "{}", sowie ein zweiter "i am a foo" übergeben.

Wie gesagt: Form ist (wie die ' ' ja auch schon andeuten) operiert auf Zeichenketten. Die Parameter, die format übergeben werden, werden zur Ersetzung bestimmter Platzhalter innerhalb der Zeichenkette verwendet. Format ist die neuere Alternative zur älteren Schreibweise "%s %s" % ("foo", "bar").

Mit Argumenten hat das aber wie gesagt gar nichts zu tun.

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 22:13
von Sophus
Richtig, es macht nicht das was er soll. Hier werden zwar zwei Argumente übergeben, allerdings nur die geschweiften Klammern, Das heißt, Format ersetzt die Platzhalter gar nicht. Was ich mir dabei erhoffe? Nun, ich wollte es einfach ausprobieren.

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 22:21
von nezzcarth
Sophus hat geschrieben:Richtig, es macht nicht das was er soll. Hier werden zwar zwei Argumente übergeben, allerdings nur die geschweiften Klammern, Das heißt, Format ersetzt die Platzhalter gar nicht. Was ich mir dabei erhoffe? Nun, ich wollte es einfach ausprobieren.
Format kann die Platzhalter im ersten Fall nicht ersetzen. Format ist eine Methode des jeweiligen Strings, die einen neuen String zurück gibt. (Strings sind in Python alles, was zwischen zwei " oder ' steht. Gibt mal im Interpreter dir("") ein) Die Punktnotation '{}'.format('foo') bezieht sich immer und ausschließlich auf das links von ihr stehende Objekt, aber nicht auf andere. Format ersetzt die im String vorhandenen Platzhalter durch die Parameter, die es (=Format) bekommt und gibt das Resultat als neue Zeichenkette zurück. Wenn du möchtest, dass die Formatierung auch im ersten Fall stattfindet, musst du die Methode auch dafür aufrufen; bei deinem Aufruf funktion('{}', '{}'.format(foo) hast du ja zwei separate Strings, das kann also nicht funktionieren.

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 22:27
von Sophus
Ich glaube jetzt kapiere ich es und komme dahinter.

Es müsste dann wie folgt aussehen:

Code: Alles auswählen

foo = "i am foo"
bar = "i am bar"
funtion('{}'.format(foo), '{}'.format(bar))

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 23:38
von DasIch
Was vollkommer Schwachsinn ist weil du gleich foo und bar übergeben kannst.

Re: Argumente in Form vom neuen Format übergeben

Verfasst: Montag 18. Januar 2016, 23:39
von bwbg
Wobei der Mehrwert bei weniger als Null liegt:

Code: Alles auswählen

>>> '{}'.format('i am foo') == 'i am foo'
True
So bleibt der Aufruf

Code: Alles auswählen

function('i am foo', 'i am bar')
als einzig sinnvoll übrig.