gepackte Arumente in Funktionen

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
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Hallöchen

Ich bin nun auf folgendes Problem gestoßen:
Ich habe mir folgende Funktion gebastelt:

Code: Alles auswählen

def select_player(state1, state2, state3, state4, k):
Diese Funktion ist in einer eigenen Pythondatei genannt Functions.py. Dort sind alle meine Funktionen definiert.

Im Hauptprogramm habe ich die Funktion mit import Funktion importiert.

Das Programm läuft nun super, jedoch möchte ich das noch etwas verschönern.
Ich möchte also die Argumente der select_player Funktion zu einem Argument zusammenfassen.
Also etwa so:

Code: Alles auswählen

state = [state1, state2, state3, state4]
Wenn ich nun im Hauptprogramm select_player(state1, state2, state3, state4, k) zu def select_player(state, state4, k) ändere, funktioniert das Programm nicht mehr.

Hab schon viel gegoogelt und eigentlch sollte es mit def select_player(*state, k) funktionieren.
Aber das geht auch nicht und vorallem kann ich dies nur im Hauptprogramm so anpassen.

Wenn ich in der Fuktionsdatei die Definition auf def select_player(*state, k) anpasse läuft noch weniger als nix.
Dann kommt folgende Fehlermeldung
missing 1 required keyword-only argument: 'k'

Wie packt und entpackt man Funktionsargumente richtig, wenn diese zusätzlich importet werden müssen?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das musst du so aufrufen:

Code: Alles auswählen

select_player(*states, k=123)
Also das k muss dabei explizit angesprochen werden.

Daher steht in der Fehlermeldung ja auch:
keyword-only argument: 'k'
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Sorry hab ich vergessen zu beschreiben.
Das k ist natürlich schon vorher definiert und soll einfach nur übernommen werden.
Also daran liegt es nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13075
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tombery: Doch daran liegt es. Und es nichts damit zu tun ob die Funktion importiert wurde oder im aktuellen Modul definiert.

Ich hoffe die Namen sind original nicht so besch…eiden. Also ein Modul das `Functions` heisst und Argumente die durchnummeriert sind, oder `k`. Wobei man bei durchnummerierten Argumenten vielleicht lieber die Signatur von der Funktion nach `select_player(states, k)` ändern sollte statt anzufangen *-”Magie” beim Aufruf zu verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Ich kann das k nicht expilzit ansprechen, da es ein Laufindex ist.
Dies hat funktionier als noch def select_player(state1, state2, state3, state4, k): geschrieben war.
Heißt das man muss die restlichen Variablen immer explizit ansprechen, wenn *Magie benutzt wird?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Tombery: Ich kann mich natürlich nur auf die Infos beziehen, die du hier angibst. Und damit funktioniert die Lösung. Wir kommen hier also nur weiter, wenn du ein Beispiel gibst, das näher am Original liegt...
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tombery hat geschrieben: Samstag 20. Juli 2019, 20:09 Ich kann das k nicht expilzit ansprechen, da es ein Laufindex ist.
Aber es ist doch keine Variable k gemeint, sondern der Funktionsparameter k. Der kann kein Laufindex sein. Also der Wert dahinter natürlich schon, aber nicht der Bezeichner an sich.

Hast du eine Schleife und willst wiederholt die beschriebene Funktion mit einem anderen Wert aufrufen oder worum geht es? Selbst wenn dem so ist, ändert das nichts am Vorgehen. Die Fehlermeldung gibt da wie gesagt auch bereits den entsprechenden Hinweis. Taucht nun eine andere Fehlermeldung auf oder woran erkennst du, dass es immer noch falsch ist?
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Es schein Fehler scheint nicht an select_player(*state, k) in der Hauptdatei zu liegen.

Das Problem entsteht in meiner Function Datei.
Dort steht noch:
def selectPlayer(state1, state2, state3, state4, k):
Dadurch fällt das Programm in eine Endlosschleife

auf def selectPlayer(state, k): kann ich das in der Function Datei nicht ändern, da sonst:
NameError: name 'state' is not defined erscheint.

Also nehme ich an, dass dort def selectPlayer(state1, state2, state3, state4, k): stehen bleiben muss, dies stört mich nicht wirklich.
In der select Player Function wird überprüft if state >= 3: dies trifft nie ein, deshalb kommt das Programm in eine Dauerschleife.
Eine Änderung zu state1+ state2+state3+state4 >= 3 bringt keine besserung.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tombery: Programmieren durch Raten funktioniert nicht. *-Magie wird benutzt, um eine Variable Anzahl an Parametern entweder zu übergeben, oder in der Funktion zu bekommen.

Man kann also sowohl auf der aufrufenden Seite als auch bei der Definition etwa ändern und es funktioniert weiterhin, wenn man es richtig macht.

Da Du aber bisher noch keinen Code gezeigt hast, der irgendetwas tut und auch nicht die Fehlermeldungen, die Du bekommst, oder warum jetzt plötzlich eine Endlosschleife ensteht, kann man hier nur wild raten.

Das einzige was man definitiv sagen kann, ist, dass Du die ganze Sache falsch angehst. *-Magie ist wirklich nur etwas, was man sparsam einsetzen sollte. Bei dem, was Du hier vermutlich tust, ist es aber der falsche Weg. Benutze eine Liste `states`. Und dazu mußt Du natürlich sowohl die Definition als auch den Programmcode drumherum ändern.
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Das Problem scheint wirklich darin zu liegen, dass in der Functions Datei noch mit den Argumenten gerechnet werden. Diese werden über die Funktion wieder an Main übergeben wobei dort der Wert wieder manipuliert wird. Diese Änderung des Wertes die im Main geschieht, geht durch das Verwenden von *-Magie oder durch das einfache reduzieren auf eine Liste verloren. Das heißt die Function bekommt von der Änderung im Main nix mit.
Ich werde es nun mit state1 + state2 + state3 + state4 lassen. Da es sowieso nur als optische Verschönerung gedacht war.
Leider bin ich nun auf einen anderen Fehler gestoßen. Als ich ihn gestern Nacht erkannte habe ich, vor Verzweiflung, nur noch den Laptop geschlossen.

Vielleicht komme ich später nochmal auf dieses Problem mit einer genaueren Beschreibung zurück.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Eine Funktion soll auch gar nichts mitbekommen, von irgendwelchen Dingen, die irgendwo außerhalb der Funktion passieren.
Wenn dem so ist, ist dein Code kaputt.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Fazit: Du hast irgendwas gemacht, was irgendwie nicht funktionierte. Dann hast du noch irgend etwas anderes gemacht, was auch nicht klappte und den Laptop zugemacht. Und alle Leser freuen sich über ihre verschwendete Lebenszeit. Hurra!
Antworten