Hallo,
ich habe ein Problem in einem etwas größerem Skript.
Der Code ist hier zu Downloaden:
http://sourceforge.net/projects/midkasim
Das Problem:
Wenn man mit app.py das Skript startet, und zwei kämpfer hinzufügt, dann auf Starten klickt, erhalte ich folgenden Fehler:
***** Kampfrunde: 1 ***** Kaempfer: 2 *******
Moegliche Ziele fuer 2 sind asg
Moegliche Ziele fuer asg sind 2
: 2 attakiert 2
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Bamba\Desktop\MidKaSim\wx_gui\midkasim.py", line 98, in Starten
kampf.start()
File "../lib\Kampf.py", line 37, in start
self.Angriff(a,v)
File "../lib\Kampf.py", line 76, in Angriff
angriff = a.Angriff+W(20)
TypeError: cannot concatenate 'str' and 'int' objects
Den Fehler finde ich leider nicht.
Kann mir da jemand von euch weiterhelfen?
Danke!
Bamba
Problem in etwas größerem Skript
Hoi,
etwas größeres Skript? Das ist ja schon fast eine ausgewachsene Anwendung
.
Allerdings sieht der Code wie Kraut & Rüben aus, wie man bei mir zu Hause sagt, also ziemlich durcheinandern (* Importe, so daß man Schwierigkeiten hat zu finden, was jetzt wo definiert ist; manche Dinge selber implementiert anstatt die Pythonmodule zu benutzen (schau Dir z. B. für W() mal die randint-Funktion an); etc.).
Beim Initialisieren der Gegener generierst Du eine Meldung(in Kampf.zielfinder()):
"Moegliche Ziele fuer 2 sind asg
Moegliche Ziele fuer asg sind 2 "
D. h. hier wird schon deutlich einer ist ein String, der andere ein Integer. Den +-Operator hast Du dafür nicht definiert, ergo: Das funktionuckelt nicht.
Ich mag mich nicht weiter mit dem Chaos beschäftigen. Am besten Du räumst bei der Fehlersuche auch etwas auf - dann wird es einfacher weitere Bugs zu finden.
Tut mir leid, ich möchte nicht so grausam klingen wie ich es jetzt tue, aber trotzdem deutlich sein. Viel Erfolg.
Gruß,
Christian
etwas größeres Skript? Das ist ja schon fast eine ausgewachsene Anwendung

Allerdings sieht der Code wie Kraut & Rüben aus, wie man bei mir zu Hause sagt, also ziemlich durcheinandern (* Importe, so daß man Schwierigkeiten hat zu finden, was jetzt wo definiert ist; manche Dinge selber implementiert anstatt die Pythonmodule zu benutzen (schau Dir z. B. für W() mal die randint-Funktion an); etc.).
Beim Initialisieren der Gegener generierst Du eine Meldung(in Kampf.zielfinder()):
"Moegliche Ziele fuer 2 sind asg
Moegliche Ziele fuer asg sind 2 "
D. h. hier wird schon deutlich einer ist ein String, der andere ein Integer. Den +-Operator hast Du dafür nicht definiert, ergo: Das funktionuckelt nicht.
Ich mag mich nicht weiter mit dem Chaos beschäftigen. Am besten Du räumst bei der Fehlersuche auch etwas auf - dann wird es einfacher weitere Bugs zu finden.
Tut mir leid, ich möchte nicht so grausam klingen wie ich es jetzt tue, aber trotzdem deutlich sein. Viel Erfolg.
Gruß,
Christian
Hmm,
gut, ich werde das mal ein bisschen aufräumen. Könntet mir nur jemand mal GENAU sagen, was genau ich alles ändern sollte? Ich habe mich an diesen Programmierstil gewöhnt und mir fällt es daher schwer etwas in diesem Code zu finden, was wie "Kraut und Rüben" sein soll;-)
Bei einer Sache muss ich CM allerdings nicht Recht geben. Die Namen der von mir definierten Kämpfer "2, und asg" sind willkürlich und nur schnell eingetippt (gehakkt). Würde ich beide zu strs oder ints machen, würde das nichts an der Fehlermeldung ändern.
Dieser Grund ist also falsch. Ich suche noch immer nach der Fehlerquelle. Bitte helft mir.
Bamba
gut, ich werde das mal ein bisschen aufräumen. Könntet mir nur jemand mal GENAU sagen, was genau ich alles ändern sollte? Ich habe mich an diesen Programmierstil gewöhnt und mir fällt es daher schwer etwas in diesem Code zu finden, was wie "Kraut und Rüben" sein soll;-)
Bei einer Sache muss ich CM allerdings nicht Recht geben. Die Namen der von mir definierten Kämpfer "2, und asg" sind willkürlich und nur schnell eingetippt (gehakkt). Würde ich beide zu strs oder ints machen, würde das nichts an der Fehlermeldung ändern.
Dieser Grund ist also falsch. Ich suche noch immer nach der Fehlerquelle. Bitte helft mir.
Bamba
Bamba
Ganz offensichtlich ist `a.Angriff` eine Zeichenkette. Jetzt musst Du nur noch zurückverfolgen warum das so ist. Wo wird das Attribut gesetzt? Nur mal so geraten: Kann es sein das der Wert über eine GUI in das Programm kommt und Du einfach nur vergessen hast aus der Zeichenkette eine Zahl zu machen?
Es scheint auch noch ein logisches Problem zu geben: Der Ausgabe nach, greift sich der Kämpfer selbst an.
Es scheint auch noch ein logisches Problem zu geben: Der Ausgabe nach, greift sich der Kämpfer selbst an.

Hoi Bamba,
PEP 8 wäre für Dich nicht nur etwas zum Aufhübschen des Codes, sondern würde Dein Augenmerk auch auf ein paar Schwachstellen lenken.
Weitere Kritikpunkte (zum Teil schon genannt):
- "import *" führt dazu, daß für Neueinsteiger in das Projekt - und auch für uns, die wir herausfinden sollen, wo ggf. ein Fehler liegt - es schwierig wird herauszufinden, welche Klasse woher kommt
- Zum Teil sind die Funktionen zu lang. Mancher Code ließe sich effizienter schreiben, insbesondere dadurch, daß Du Pythonmodule zur Problemlösung nutzen solltest. Diese sind in der Regel auch schneller als Nachbildungen in reinem Python.
Dies sind zumindest mal Punkte, wo Du anfangen könntest. Der Rest erschließt sich Dir schon nach und nach.
Gruß,
Christian
PEP 8 wäre für Dich nicht nur etwas zum Aufhübschen des Codes, sondern würde Dein Augenmerk auch auf ein paar Schwachstellen lenken.
Weitere Kritikpunkte (zum Teil schon genannt):
- "import *" führt dazu, daß für Neueinsteiger in das Projekt - und auch für uns, die wir herausfinden sollen, wo ggf. ein Fehler liegt - es schwierig wird herauszufinden, welche Klasse woher kommt
- Zum Teil sind die Funktionen zu lang. Mancher Code ließe sich effizienter schreiben, insbesondere dadurch, daß Du Pythonmodule zur Problemlösung nutzen solltest. Diese sind in der Regel auch schneller als Nachbildungen in reinem Python.
Dies sind zumindest mal Punkte, wo Du anfangen könntest. Der Rest erschließt sich Dir schon nach und nach.
Gruß,
Christian
Ok, vielen Dank. Werde ich machen.
Zu W():
Diese Funktion ist NOTWENDIG! Sie wird nötig um die MAGUS XML nachher zu integrieren.
Das erste was ich jetzt mache ist auf jeden Fall die from x import * auszumerzen - grauenhaft (;-))
Bamba
Zu W():
Diese Funktion ist NOTWENDIG! Sie wird nötig um die MAGUS XML nachher zu integrieren.
Das erste was ich jetzt mache ist auf jeden Fall die from x import * auszumerzen - grauenhaft (;-))
Bamba
Bamba
Code: Alles auswählen
def W(i):
return random.randint(1, i)

Hoi Bamba,
habe ich nicht geschrieben, stattdessen:
In Deinem Code ließen sich noch mehrere solcher Beispiele finden
.
Gruß,
Christian
habe ich nicht geschrieben, stattdessen:
Deine bisherige Funktion ist langsam, weil Du einen zusätzlichen Funtionsaufruf ( int() ) und eine Rechnung drin hast.CM hat geschrieben:(schau Dir z. B. für W() mal die randint-Funktion an)
In Deinem Code ließen sich noch mehrere solcher Beispiele finden

Gruß,
Christian