List mit Dicts an Methode ü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
Lale
User
Beiträge: 4
Registriert: Mittwoch 3. Oktober 2018, 14:40

Hallo Ihr lieben,

ich bin noch ganz frisch in der Materie. Leider hänge ich grade an einem Problem fest und komme leider auch mit Recherche im Internet nicht weiter - wobei ich nicht ausschließen würde, dass ich an der falsche Stelle suche.

Problem (klingt so einfach) :?
-> Ich würde gern eine Liste mit Dicts an eine Methode übergeben um die Einträge geschlossen verarbeiten zu können.
Ein abstaktes Beispiel mit wenig Daten:

Name = [{'Name': 'Hans', 'Alter': '30'},
{'Name': 'Petra', 'Alter': '40'},
{'Name': 'Jürgen', 'Alter': '47'}]

Person.set_data(name_list=name_list )
Ich bekomme den Fehler TypeError: set_data() got multiple values for argument 'name_list'

Ja den Fehler habe ich natürlich verstanden, aber wie übergebe ich die Liste sonst? Ich habe bereits gesehen, dass man die Liste wiederrum ein ein DICT verschalen kann - leider möchte auch das nicht so richtig funktionieren.

Ich bin über jede Hilfe dankbar! Machmal sieht man den Wald vor lauter Bäumen nicht.
Liebe Grüße
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Beispiel ist leider ein bisschen zu abstrakt. Da da auch Namen nicht existieren, und vor allem nicht bekannt ist, wie set_data aussieht. Denn eigentlich fällt mir gerade nicht ein, wie man den Fehler mit nur einem Argument bekommen sollte. Mit zweien geht’s so:

Code: Alles auswählen

>>> def foo(bar, baz=None):
...     pass
...     
>>> foo(19, bar=20)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: foo() got multiple values for argument 'bar'
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

Da der ganze wichtige Teil (die Funktion set_data, die Klasse für die Instanz Person) fehlt, und zudem die Namensschreibweise verwirrend ist, weil Person wie eine Klasse geschrieben wurde (Groß) aber ganz offensichtlich eine Instanz der Klasse ist, kann man nur spekulieren:
bei der Definition der Methode set_data fehlt das `self`.
Lale
User
Beiträge: 4
Registriert: Mittwoch 3. Oktober 2018, 14:40

Hallo und danke für die schnelle Antwort. Da habe ich im Beispiel wohl etwas übersehen:

Name_list ist bekannt und enthält als Liste die Dicts.
Name_list soll als Übergabeparameter an die Methode set_data übergeben werden
Die Instanz von "person" ist bereits gebunden.

Sollte natürlich so aussehen:

Code: Alles auswählen

namelist = [{'Name': 'Hans', 'Alter': '30'},
            {'Name': 'Petra', 'Alter': '40'}, 
            {'Name': 'Jürgen', 'Alter': '47'}]

person.set_data(name_list = name_list)
Wie würde sich der Fehler mit deiner Lösung behen lassen? Auch in deinem der Parameter kann leine Liste mit Dicts übergeben werden oder?
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, es fehlt immer noch die Definition der Klasse, und namelist ist nicht gleich name_list. Kannst Du bitte das nächste mal den gesamten Code, den Du auch verwendet hast, posten, und nicht irgendwas, was mit dem eigentlichen Problem nichts zu tun hat.
Ansonsten gilt immer noch meine Antwort.
Lale
User
Beiträge: 4
Registriert: Mittwoch 3. Oktober 2018, 14:40

Dann noch einmal mit dem Code:

Code und SQL liegen in unterschiedlichen .py-Dateien (Binden der Intanz klappt)

Code: Alles auswählen

 
from analyse.sqlite import SQL
sql = SQL()

#Datenversorung über API - hier eine verkürzte Version mit nur 4 Dicts
pricedata_list = [{'symbol': 'ETHBTC', 'id': 113, 'price': '0.03384700'}, 
                  {'symbol': 'LTCBTC', 'id': 174, 'price': '0.00887800'}, 
                  {'symbol': 'BNBBTC', 'id': 520, 'price': '0.00159980'}, 
                  {'symbol': 'NEOBTC', 'id': 211, 'price': '0.00276000'}]

sql.set_analysedata(pricedata_list = pricedata_list) 
 

Code: Alles auswählen

 
class SQL:
 def set_analysedata(pricedata_list):
  pass
Sirius3
User
Beiträge: 18267
Registriert: Sonntag 21. Oktober 2012, 17:20

Und `self` fehlt immer noch. Eingerückt wird übrigens immer mit 4 Leerzeichen pro Ebene.
Zuletzt geändert von Sirius3 am Mittwoch 3. Oktober 2018, 15:37, insgesamt 1-mal geändert.
Lale
User
Beiträge: 4
Registriert: Mittwoch 3. Oktober 2018, 14:40

und es lag am "self" in der Deklaration der Methode

Danke für den Schups :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und da sehen wir dann ja auch das Problem: deiner Methode set_analysedata fehlt das self. Das ist in Python nicht Pflicht das so zu benennen, womit es bei dir eben "pricedata_list" heisst. Wenn du jetzt also ein SQL-Objekt erzeugst, dann wird beim Aufruf der Methode set_aralysedata das erste Argument mit der Instanz selbst schon gebunden, und du probierst, da noch ein zweites, gleich benanntes Argument mit zu uebergeben - das kracht halt.

Also einfach self einfuehren in set_analysedata, und dieses Problem verschwindet.
Antworten