Recht triviale Frage

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
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

Hallöchen,
im Moment beschäftige ich mich mit Funktionen, die wie folgt aussehen:

Code: Alles auswählen

def benutzerprofil(vorname, nachname, **zusätzliche_eigenschaften):
    """Speichert ein Benutzerprofil"""
    eigenschaften = {}
    eigenschaften['Name'] = vorname
    eigenschaften['Nachname'] = nachname
    for key, value in zusätzliche_eigenschaften.items():
        eigenschaften[key] = value
    return eigenschaften
Nehmen wir nun ein triviales Beispiel, um die Funktion aufzurufen:

Code: Alles auswählen

wörterbuch = benutzerprofil('Pyt', 'hon', Wohnort = 'Auf meinem PC')
print(wörterbuch)
Bisher ist alles in Ordnung und ich habe auch kein Problem mit der Funktionalität. Allerdings würde ich gerne wissen, weshalb ich den Schlüssel (Wohnort) nicht auch als String einspeisen muss:

Code: Alles auswählen

wörterbuch = benutzerprofil('Pyt', 'hon', 'Wohnort' = 'Auf meinem PC')
Gut, man könnte jetzt sagen, dass die Fehlermeldung, die auftritt, wenn man den Code ausführt, Antwort genug ist, aber ich würde es schon ganz gerne genau wissen :) .
Schließlich wird ein Dictionary per:

Code: Alles auswählen

Dictionary['key'] = value
erweitert.
Vielen Dank für die schnellen Antworten!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil die Syntax von Python dir Schlüsselwort-ARgumente erlaubt. Das du die in Form eines dicts bekommst wenn du die spezielle **-Syntax verwendest, hat mit der aufrufenden Seite erstmal nichts zu tun.
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

__deets__ hat geschrieben:Weil die Syntax von Python dir Schlüsselwort-ARgumente erlaubt. Das du die in Form eines dicts bekommst wenn du die spezielle **-Syntax verwendest, hat mit der aufrufenden Seite erstmal nichts zu tun.
Äh, also ist es eine Eigenheit der **-Syntax, dass ich funktion(key = 'value') nutzen kann bzw. muss?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Es ist die Definition von funktionsaufrufen. Du kannst positionale Argumente und Schlüsselwort Argumente übergeben. Letztere können nur die Form von Bezeuchnern annehmen. Denn wie willst du denn

def foo(argument, 10=None):

vernünftig weiter verarbeiten? Damit kannst du doch nicht arbeiten, dann steht da zB 10*10, und welches von den beiden ist dann der Parameter, und welches die Zahl 10?

Also sie Argumente immer bezeichner. Womit das auch das einzige ist, was du im **-dict bekommst. Denn das ist ein Feature das sich quasi an die Schlüsselwort-Geschichte ranhängt.

Wenn du da mehr Flexibilität willst, kannst du ja auch einfach ein dict übergeben, und gut ist.
TomBombadil
User
Beiträge: 14
Registriert: Sonntag 26. November 2017, 17:29

Hey, vielen Dank.
Jetzt hab ichs auch verstanden.
Ich hatte mich so auf die vermeintliche Bearbeitung des Dictionarys konzentriert und dabei Schlüsselwortargumente total ausgeblendet. :?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@TomBombadil: noch ein Hinweis, statt der for-Schleife tut's auch ein Update:

Code: Alles auswählen

def benutzerprofil(vorname, nachname, **zusätzliche_eigenschaften):
    """Speichert ein Benutzerprofil"""
    eigenschaften = {
        'Name': vorname,
        'Nachname': nachname,
    }
    eigenschaften.update(zusätzliche_eigenschaften)
    return eigenschaften
Antworten