Seite 1 von 1

Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 11:20
von TomBombadil
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!

Re: Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 11:36
von __deets__
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.

Re: Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 12:09
von TomBombadil
__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?

Re: Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 12:22
von __deets__
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.

Re: Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 12:34
von TomBombadil
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. :?

Re: Recht triviale Frage

Verfasst: Sonntag 29. April 2018, 16:34
von Sirius3
@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