Error: object is not iterable

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
Lohifusi
User
Beiträge: 1
Registriert: Mittwoch 9. Oktober 2019, 14:18

Huhu! :D Habe soeben euer Forum entdeckt und meine, hier einen super Ort gefunden zu haben um mich auszutauschen und meine Python-Skills zu erweitern.
Aktuell sitze ich vor folgender Aufgabe: Ich möchte aus einer xml-File Objekte filtern, welche in der classification, den String ´information´ tragen. Dieses Objekt hat eine Reihe von Koordniaten, welche Punkte(Punkt) festlegen, die zusammen in einer Liste(Punktliste) die ein Objekt ergeben. Diese Objekte kommen in eine Liste namen ´StatischeObjekte´. Ist die Klassifikation nun gleich ´Noodle´, soll dem jeweiligen statischen Objekt das Boolean ´True´zugeordnet werden, damit es im späteren Verlauf in einer anderen Farbe eingezeichnet wird. Das sollte so auch alles mehr oder weniger passen! Allerdings wird mir nun durchgehend der Error: ´Hinderniss´ object is not iterable : ausgeworfen. Das liegt meinen Kenntnissen nach zu urteilen daran, dass es sich nicht um eine Liste handelt, über welche iteriert werden kann.
Allerdings weiß ich nicht so recht, wie ich das Problem umgehen kann. Hat jemand denn eine Idee, wie ich die Sache zum laufen kriege? Liebe Grüße

Code: Alles auswählen

class Hinderniss:
             def__init__(self):
             self.zeit = 0
             self.isNoodle = False
             self.punkte = []
             
           class Fenster:
             def__init__(self):
             self.zeit = 0
             self.objekte = []

def karte(args)
         objekte = []
         zeit= []
         soup = bs(args.karte, 'lxml')
         for Hindernisse in soup.findAll('Hinderniss'):
         statischesObjekt = Hinderniss()
         	for Beschreibung in Hindernisse.findAll (´Beschreibung´):
         	klassifizierung = Beschreibung.find(´Klassifizierung´).string
         	for Information in Hinderniss.findAll(Ínformation´):
         	Punktliste = []
Bis hierhin funktioniert das Ganze. Der Punkt wird definiert :

Code: Alles auswählen

Punkt = np.array(...
und der Punktliste zugeordnet.

Code: Alles auswählen

Punktliste.append(Punkt)
Der Rest in dieser Zeile funktioniert.

Code: Alles auswählen

If Klassifizierung == (´Noodle´):
	statisches Objekt.Punkte = Punktliste 
	statischesObjekt.isNoodle = True
	
         else: 
         statischesObjekt.Punkt = Punktliste
objekte.append(statischeObjekte)             

return objekte    
Nun wird die Karte transformiert:

Code: Alles auswählen

def transformieren(objekte, Zeit)
		for Objekt in Objekte:
			.......
			for Punkt in Objekte  
usw.
Der Error verweißt auf auf die letzte Zeile. Wie gehe ich nun weiter vor?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der gezeigte Code ist voll von Einrueckungsfehlern. Das kann man so nicht nachvollziehen. Bitte korrigieren. Und bitte den Fehler in gaenze als Stacktrace posten. Dann sieht man in welcher korrespondierenden Zeile das nun eigentlich passiert.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Lohifusi,

Einrückungen sind in Python syntaktisch wichtig, Code zu zeigen, bei dem die Einrückung kaputt ist, hilft nicht, ihn zu verstehen.
Eingerückt wird per Konvention immer mit 4 Leerzeichen pro Ebene, nicht 9, keine Tabs.

Nach Konvention werden Variablennamen klein_mit_unterstrich geschrieben, also `is_noodle`.
Ein Objekt sollte nach der Initialisierung mit __init__ vollständig definiert sein, eine Klasse, die keine __init__-Parameter hat, ist daher selten sinnvoll.
Benutze keine Abkürzungen, BeautifulSoup als bs abzukürzen, macht den Code nur schwer lesbar. findAll ist die alte API, weil sie sich nicht an die Namenskonvention hält, benutze statt dessen find_all.

Eine Funktion benennt man am besten nach einer Tätigkeit. `karte` ist ein Substantiv. `args` ist ein zu allgemeiner Parameter. Besser einzelne Parameter angeben, also `karte` und was sonst noch gebraucht wird.

Danach bricht Dein Code leider ab, so dass ich ihn nicht mehr nachvollziehen kann.

Aus den Bruchstücken sehe ich, dass Du `statischesObjekt` am Anfang der for-Schleife erzeugst, am Ende aber erst mit Werten belegst, wie schon geschrieben, wäre es besser, das alles an __init__ zu übergeben.

Code: Alles auswählen

objekte.append(Hindernis(Punktliste, is_noodle=Klassifizierung=='Noodle'))
Wenn Du das Hindernis-Objekt iterierbar haben möchtest, dann mußt Du magische Methoden definieren, hier __iter__.
Antworten