Argumente in Form vom neuen Format übergeben

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
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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?
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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))
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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.
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

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))
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Was vollkommer Schwachsinn ist weil du gleich foo und bar übergeben kannst.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten