Phyton: Werte auslesen/speichern/zeichnen

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
RCB

Hallo Leute,
ich bekomme neulich plötzlich eine Fehlermeldung, die ich zuvor nicht bekam (mein Programm lief auch komplett durch).
Kurz und Knapp: Ich lese aus einer seriellen Schnittstelle Werte aus, die ich zuerst in einer TExtdatei schreibe und diese in Echtzeit zeichne. Der erste Durchlauf funktioniert auch ohne Probleme, bis diese auch zuende ist. Sobald die erste Zeichnung fertig ist kommt folgende Meldung: int object has no attribute 'writelines'.
Kann einer mir helfen?

import serial
import Gnuplot, Gnuplot.funcutils, Gnuplot.PlotItems
import sys

d = open("XY1.txt","w")
d = open("XY2.txt","w")
d = open("XY3.txt","w")
d = open("XY4.txt","w")
d = open("XY5.txt","w")
d.write("")
d.close()

ser = serial.Serial(port='COM6', baudrate=9600,\
bytesize=serial.EIGHTBITS, \
parity=serial.PARITY_NONE)

g = Gnuplot.Gnuplot(debug=1)
Gnuplot.GnuplotOpts.prefer_inline_data=1
Gnuplot.GnuplotOpts.gnuplot_command =r'C:\Programme\gnuplot\bin\gnuplot.exe'
g.title( 'ASM Kennlinie')
g.xlabel ('Drehzahl [1/min]')
g.ylabel ('Drehmoment [Nm]')
g('set xtics 0,200,3000')
g('set ytics 0,0.2,4')
g('set xrange[0:3000]' )
g('set yrange[0:4]')
g('set grid')

i=1

while 1:

kkkkk a=ord(ser.read())
kkkkkb=ord(ser.read())
kkkkk c=ord(ser.read())
kkkkk d=ord(ser.read())

kkkkkx=((b<<8|a)/100.00)
kkkkk y=((d<<8|c)/100.00)

kkkkkif x>0.450:

kkkkkkk print "X-Achse: %.3f" % float(x),
kkkkkkk print "Y-Achse: %.3f" % float(y),

kkkkkkk if i==1:
kkkkkkkkk d = open("XY1.txt","a")
kkkkkkk elif i==2:
kkkkkkkkk d = open("XY2.txt","a")
kkkkkkk elif i==3:
kkkkkkkkk d = open("XY3.txt","a")
kkkkkkk elif i==4:
kkkkkkkkk d = open("XY4.txt","a")
kkkkkkk elif i==5:
kkkkkkkkk d = open("XY5.txt","a")

kkkkkkk x=x*1000
kkkkkkk y=y
kkkkkkk dli=[[ "%.2f" %float(x),\
kkkkkkk "%.2f" %float(y)]]

kkkkkkk for element in dli:
kkkkkkk d.writelines(str(element[0])+\
kkkkkkk ";"+str(element[1])+"\n")
kkkkkkk d.close()

kkkkkkk g('set terminal windows')
kkkkkkk g('set datafile separator ";"')

kkkkkkk if i==1:
kkkkkkkk g.plot('"XY1.txt" using 1:2 with\
kkkkkkkk linespoints smooth csplines')
kkkkkkk elif i==2:
kkkkkkkk g.plot('"XY2.txt" using 1:2 with\
kkkkkkkk linespoints smooth csplines ')
kkkkkkk elif i==3:
kkkkkkkkg.plot('"XY3.txt" using 1:2 with\
kkkkkkkk linespoints smooth csplines ')
kkkkkkk elif i==4:
kkkkkkkk g.plot('"XY4.txt" using 1:2 with\
kkkkkkkk linespoints smooth csplines ')
kkkkkkk elif i==5:
kkkkkkkk g.plot('"XY5.txt" using 1:2 with\
kkkkkkkk linespoints smooth csplines')
kkkkkkkkkif x<450:
kkkkkkkkk g('set multiplot')
kkkkkkkkk g('set datafile separator ";"')
kkkkkkkkk g.plot('"XY1.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkk "XY2.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY3.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY4.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY5.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines')
kkkkkkkkk g('unset multiplot')

kkkkkkkkk g('set terminal png size 1400,600')
kkkkkkkkk g('set output "Kennlinen.png"')
kkkkkkkkk g('set multiplot')
kkkkkkkkk g('set datafile separator ";"')
kkkkkkkkk g.plot('"XY1.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY2.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY3.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY4.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines,\
kkkkkkkkk "XY5.txt" using 1:2 with\
kkkkkkkkk linespoints smooth csplines')
kkkkkkkkk g('unset multiplot')
kkkkkkkkk g('pause 0.1')
kkkkkkkkk g('replot')
kkkkkkkkk g('exit')
kkkkkkkkk sys.exit(0)

kkkkk del x
kkkkk del y


kkkkk else:

kkkkkkk i+=1

kkkkkkk if i==2:
kkkkkkkkk d = open("XY2.txt","w")
kkkkkkkkk d.write
kkkkkkkkk d.close()
kkkkkkk elif i==3:
kkkkkkkkkd = open("XY3.txt","w")
kkkkkkkkk d.write("")
kkkkkkkkk d.close()
kkkkkkk elif i==4:
kkkkkkkkk d = open("XY4.txt","w")
kkkkkkkkk d.write("")
kkkkkkkkk d.close()
kkkkkkk elif i==5:
kkkkkkkkk d = open("XY5.txt","w")
kkkkkkkkk d.write("")
kkkkkkkkk d.close()
Zuletzt geändert von RCB am Donnerstag 18. Mai 2017, 20:42, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@RCB: das kommt davon, wenn man nur einbuchstabige Variablennamen verwendet. Statt alles fünf mal zu kopieren, sollte man statt dessen passende Strukturen verwenden: Listen, for-Schleifen, etc.
Dateien sollte man auch wieder schließen, wenn man sie öffnet. sys.exit sollte ein break sein und die beiden del-Anweisungen sind überflüssig, wie fast immer.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@RCB: Wenn Du deinen Code so hereinstellst, dass man auch Einrückungen sieht, könnte man wohl etwas erkennen.
RCB

Sirius3 hat geschrieben:@RCB: das kommt davon, wenn man nur einbuchstabige Variablennamen verwendet. Statt alles fünf mal zu kopieren, sollte man statt dessen passende Strukturen verwenden: Listen, for-Schleifen, etc.
Dateien sollte man auch wieder schließen, wenn man sie öffnet. sys.exit sollte ein break sein und die beiden del-Anweisungen sind überflüssig, wie fast immer.
die del sind notwendig weil die alten werte sonst nicht überschrieben werden. So "funktioniert" es ja. Es hat ja alles funktioniert, aber plötzlich kommt so eine Meldung. Ob ich die Datei nicht nachher schließe ist hier in dem Fall egal, da es kein Probem darstellt.
Nunja die Variablen brauche ich, da ich immer wieder neue Werte auslese in Echtzeit. for schleifen bringen in meinen augen woll kaum was, da ich wie gesagt diese immer wieder neu auslese. Mit x und y krige ich meine Werte.
Zuletzt geändert von RCB am Donnerstag 18. Mai 2017, 20:55, insgesamt 3-mal geändert.
RCB

Alfons Mittelmeyer hat geschrieben:@RCB: Wenn Du deinen Code so hereinstellst, dass man auch Einrückungen sieht, könnte man wohl etwas erkennen.
ich war dabei
BlackJack

@RCB: Keine Deiner Erklärungen macht Sinn. Die ``del``-Anweisungen brauchst Du nicht. Ob Du Dateien schliesst ist nicht egal. So etwas kann Ursache für Probleme sein. Wenn Du Pech hast, hast Du Glück und es fällt nicht auf, aber man hat halt manchmal auch Glück und das wirkt sich aus. Also sauber programmieren und nicht nach dem Motto hauptsache es ”funktioniert”. Gerade hier kann so etwas nämlich zu Problemen führen wenn eine Datei noch Daten im Puffer hat die nicht auf Platte geschrieben wurden, und die dann mit Gnuplot gezeichnet wird. Dann hat Gnuplot nämlich nicht alle Daten.

Vernünftige Namen, statt der ganzen Einbuchstabigen sind übrigens die Lösung zu Deiner Fehlermeldung.

Und Schleifen bringen was wenn dadurch der Code kürzer und übersichtlicher wird und damit auch weniger fehleranfällig bei Änderungen.

Edit: Für Quelltext gibt's Tags, endweder die „Code“-Schaltfläche oder die Dropdown-Box „Code auswählen“. Bei letzterem sogar mit Syntaxhervorhebung. Ich mag gar nicht darüber nachdenken wie viel Arbeit das gemacht hat die ganzen weissen 'k's zu schreiben. :shock:
RCB

BlackJack hat geschrieben:@RCB: Keine Deiner Erklärungen macht Sinn. Die ``del``-Anweisungen brauchst Du nicht. Ob Du Dateien schliesst ist nicht egal. So etwas kann Ursache für Probleme sein. Wenn Du Pech hast, hast Du Glück und es fällt nicht auf, aber man hat halt manchmal auch Glück und das wirkt sich aus. Also sauber programmieren und nicht nach dem Motto hauptsache es ”funktioniert”. Gerade hier kann so etwas nämlich zu Problemen führen wenn eine Datei noch Daten im Puffer hat die nicht auf Platte geschrieben wurden, und die dann mit Gnuplot gezeichnet wird. Dann hat Gnuplot nämlich nicht alle Daten.

Vernünftige Namen, statt der ganzen Einbuchstabigen sind übrigens die Lösung zu Deiner Fehlermeldung.

Und Schleifen bringen was wenn dadurch der Code kürzer und übersichtlicher wird und damit auch weniger fehleranfällig bei Änderungen.

Edit: Für Quelltext gibt's Tags, endweder die „Code“-Schaltfläche oder die Dropdown-Box „Code auswählen“. Bei letzterem sogar mit Syntaxhervorhebung. Ich mag gar nicht darüber nachdenken wie viel Arbeit das gemacht hat die ganzen weissen 'k's zu schreiben. :shock:
naja del habe ich halt gebraucht weil es sonst nicht funktioniert hatte. ich hatte immer wieder die gleichen werte gehabt und mit del hatte ich dieses problem gelöst. wenn es für dich keine sinn macht tut mir leid. so hat es funktioniert.
naja bezüglcih daten schließen: diesbezüglich habe ich keine fehlermeldung und kümmere mich jetzt nicht darum weil ich möchte dass es zunächst wieder funktioniert.

ich probiere es mal mit kompletten namen. ich fände es aber komisch, weil es so funktioniert hatte.

natürlich bringen schleifen was, aber in meinen augen nicht um werte ständig auszulesen (in meinem fall) .
BlackJack

@RCB: Es kann weder sein das die mehrfache Verwendung des gleichen Namens für verschiedene Dinge vorher funktioniert hat, noch kann es sein das die beiden ``del``-Anweisungen etwas verändern. Es geht nicht darum das es für mich keinen Sinn macht, sondern das diese beiden Behauptungen ganz generell so nicht stimmen können.

Aber Du hast recht, umbenennen alleine wird nicht helfen, denn dann wird `d` zwar eine `writelines()`-Methode haben, aber es wird wahrscheinlich nicht an die richtige Datei gebunden sein. Ich weiss auch gar nicht welche das in dem Fall sein soll. Der Code ist so aber auch nicht wirklich lesbar, weil die Einrückung vielleicht stimmt, vielleicht aber auch nicht.
RCB

BlackJack hat geschrieben:@RCB: Es kann weder sein das die mehrfache Verwendung des gleichen Namens für verschiedene Dinge vorher funktioniert hat, noch kann es sein das die beiden ``del``-Anweisungen etwas verändern. Es geht nicht darum das es für mich keinen Sinn macht, sondern das diese beiden Behauptungen ganz generell so nicht stimmen können.

Aber Du hast recht, umbenennen alleine wird nicht helfen, denn dann wird `d` zwar eine `writelines()`-Methode haben, aber es wird wahrscheinlich nicht an die richtige Datei gebunden sein. Ich weiss auch gar nicht welche das in dem Fall sein soll. Der Code ist so aber auch nicht wirklich lesbar, weil die Einrückung vielleicht stimmt, vielleicht aber auch nicht.
naja dass es vorher funktioniert hatte kann ich ja besser beurteilen weil ich auch dazu ergebnisse hab hahahahahha
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was du hast ist eine falsche Vorstellung davon, was da passiert ist. Abe wenn du das besser weißt als die Experten hier - Glück auf :mrgreen:
RCB

__deets__ hat geschrieben:Was du hast ist eine falsche Vorstellung davon, was da passiert ist. Abe wenn du das besser weißt als die Experten hier - Glück auf :mrgreen:
das habe ich nicht gesagt. ich habe nur gesagt dass es vorher funktioniert hat und der kollege vorher, meinte es könnte nicht sein etc. In dem Falle weiß ich es besser, da ich die richtigen Ergebnisse hatte. Wenn ich das falsch verstanden hab sorry.
wüsste ich es besser hätte ich, dass hier nicht gepostet. ich habe diesen Fehler nach 3 Monate plötzlich bekommen, nachdem ich wieder daran gearbeitet hab.
naja typisch

und solche kommentare kannste dir schenken
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@RCB: wenn vorher irgendein andere Version Deines Codes „funktioniert“ hat, dann ist das Zufall; mir ist auch klar, warum das jetzt nicht mehr funktioniert, weil das Programm zu unstrukturiert ist, dass man das sinnvoll erweitern oder verändern könnte. Der Fehler entsteht durch mehrere Dinge die zusammenfallen; der selbe Variablenamen wird für unterschiedliche Dinge benutzt, eine Zählvariable bekommt einen zu großen Wert, ein Abbruchkriterium ist zu kompliziert, als dass nachgewiesen wäre, dass das irgendwann auftritt.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Im Gegensatz zu deiner hahahahaha-Nummer? Deren wert ist genau nochmal welcher?

Tatsache ist: dein Kram funktioniert nicht, weil du offensichtlich kaum verstehst was du da tust. Und falsche Annahmen darüber hast, warum dem so ist. Und wenn du die hier gegeben Verbesserungsvorschläge verlachst, was erwartest du was passiert? Das die Leute vor Begeisterung gleich noch ein paar oben drauf liefern? Du hast Vorstellungen ....
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Leute, nun seid mal nicht so. Ihr dürft nicht so streng sein mit einem Zwölfjährigen.

Außerdem könnte es ja sein, dass del in Phyton anders funktioniert, als in Python.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

Wie ``del`` funktioniert ist eigentlich egal. Ich habe nämlich gerade mal versucht heraus zu finden wie das ordentlich eingerückt aussehen müsste, und die beiden ``del``-Anweisungen müssen im ``if``-Zweig stehen, sonst würde das ``else`` danach ein Syntaxfehler sein. Im ``if``-Zweig stehen die ``del``\s aber direkt nach einem `sys.exit()`-Aufruf: Die werden also überhaupt gar nicht ausgeführt. So viel dazu das die wichtig sind, weil es sonst nicht funktioniert. :-)

Edit: Okay, Kommando zurück, ich bin gerade noch dabei generell das ganze ohne Syntaxfehler hinzubekommen und habe nicht bedacht, dass das `sys.exit()` nicht konventionell eingerückt ist und sogar zwei Ebenen tiefer steht als ich dachte, weil die jeweils nur mit einem Leerzeichen eingerückt sind. Lesegewohnheiten…
BlackJack

@RCB: Die `write()`-Aufrufe mit den leeren Zeichenketten machen keinen Sinn. Und da sieht man auch ganz gut das Problem mit dem kopieren von Code: Man muss immer darauf achten, dass alle Kopien gleich bleiben. An einer Stelle steht nur eine Referenzierung von der `write()`-Methode, ohne sie tatsächlich aufzurufen. Wenn der Aufruf tatsächlich einen Sinn hätte, wäre das sehr wahrscheinlich ein Fehler im Programm gewesen das bei einer von den fünf Dateien weg zu lassen.

Auch die serielle Schnittstelle sollte man wieder schliessen wenn man fertig ist. Die ``with``-Anweisung ist eine sehr praktische Sache für so etwas.

Bezüglich der Dateien sind die ``if``/``elif``-Kaskaden unsinnig weil auf Grund des Wertes von immer das gleiche gemacht wird, es unterscheidet sich nur durch ein Zeichen im Dateinamen: Und das ist immer der Wert von `i`. Also kann man den auch ganz einfach einsetzen, ohne die ganzen ``if``/``elif``\s.

Python hat einen eigenen Typ für Wahrheitswerte (`bool`) und die Werte `True` und `False`. Die sollte man verwenden statt Zahlen dafür zu missbrauchen.

`x` und `y` brauchen nicht in `float`\s umgewandelt werden — das sind bereits welche.

Beim Anhängen des `x`/`y`-Paares muss ich sagen Hut ab: Noch verwirrender und umständlicher könnte man das wahrscheinlich nicht mal machen wenn man es gezielt darauf anlegt. Die Werte werden erst in eine Liste gesteckt, die als einziges Element eine Liste mit den beiden Werten als Zeichenketten formatiert, enthät.

Über diese Liste, die garantiert immer nur ein Element hat, wird dann mit einer Schleife iteriert. In dieser Schleife werden dann die beiden Elemente aus der inneren Liste genommen, in Zeichenketten umgewandelt — wir erinnern uns: Das *sind schon* Zeichenketten — unübersichtlich mit ``+`` zu *einer* Zeichenkette zusammengebastelt und an `writelines()` übergeben. Was dazu führt das die Zeichenkette in einzelne Zeichen zerlegt wird und jeder Zeichen einzeln in die Datei geschrieben wird. Argh. Aber ich weiss — es ”funktioniert” ja. :roll:

Um's mal konkret zu machen: Das hier alles…

Code: Alles auswählen

                    x = x * 1000
                    y = y
                    dli = [['%.2f' % float(x),
                            '%.2f' % float(y)]]

                    for element in dli:
                        data_file.writelines(str(element[0]) +
                                     ";"+str(element[1])+'\n')
…sollte eigentlich nur diese eine Zeile sein:

Code: Alles auswählen

                    data_file.write('{0:.2f};{1:.2f}\n'.format(x * 1000, y))
Hier mal der Code ein wenig aufgeräumt und von den ganzen Kopien/Wiederholungen befreit. Vielleicht siehst Du ja jetzt das Problem das sich bei bestimmten `x`-Werten im Programmablauf ergibt (ungetestet):

Code: Alles auswählen

import struct

import Gnuplot
import Gnuplot.funcutils
import Gnuplot.PlotItems
from serial import Serial

GNUPLOT_BINARY_FILENAME = r'C:\Programme\gnuplot\bin\gnuplot.exe'
DATA_FILE_COUNT = 5
DATA_FILENAME_TEMPLATE = 'XY{0}.txt'
PLOT_TEMPLATE = '"{0}" using 1:2 with linespoints smooth csplines'


def main():
    # 
    # TODO This should be unnecessary except for the first file.
    #   And *that* can be solved by changing the order in which the
    #   files are emptied in the loop below.
    #   
    for i in xrange(1, DATA_FILE_COUNT + 1):
        with open(DATA_FILENAME_TEMPLATE.format(i)):
            pass

    gnuplot = Gnuplot.Gnuplot(debug=True)
    Gnuplot.GnuplotOpts.prefer_inline_data = True
    Gnuplot.GnuplotOpts.gnuplot_command = GNUPLOT_BINARY_FILENAME
    gnuplot.title('ASM Kennlinie')
    gnuplot.xlabel('Drehzahl [1/min]')
    gnuplot.ylabel('Drehmoment [Nm]')
    gnuplot('set xtics 0,200,3000')
    gnuplot('set ytics 0,0.2,4')
    gnuplot('set xrange[0:3000]')
    gnuplot('set yrange[0:4]')
    gnuplot('set grid')

    with Serial(port='COM6') as serial:
        i = 1
        while True:
            x, y = (
                value / 100.0 for value in struct.unpack('<2h', serial.read(4))
            )
            if x > 0.450:
                print 'X-Achse: {0:.3f} Y-Achse: {1:.3f}'.format(x, y)
                with open(DATA_FILENAME_TEMPLATE.format(i), 'a') as data_file:
                    data_file.write('{0:.2f};{1:.2f}\n'.format(x * 1000, y))


                gnuplot('set terminal windows')
                gnuplot('set datafile separator ";"')

                gnuplot.plot(
                    PLOT_TEMPLATE.format(DATA_FILENAME_TEMPLATE.format(i))
                )
                if i == DATA_FILE_COUNT and x < 450:
                    source = ', '.join(
                        PLOT_TEMPLATE.format(DATA_FILENAME_TEMPLATE.format(j))
                        for j in xrange(1, DATA_FILE_COUNT + 1)
                    )

                    gnuplot('set multiplot')
                    gnuplot('set datafile separator ";"')
                    gnuplot.plot(source)
                    gnuplot('unset multiplot')

                    gnuplot('set terminal png size 1400,600')
                    gnuplot('set output "Kennlinen.png"')
                    gnuplot('set multiplot')
                    gnuplot('set datafile separator ";"')
                    gnuplot.plot(source)
                    gnuplot('unset multiplot')
                    gnuplot('pause 0.1')
                    gnuplot('replot')
                    gnuplot('exit')
                    break
            else:
                i += 1
                with open(DATA_FILENAME_TEMPLATE.format(i), 'w'):
                    pass
                    

if __name__ == '__main__':
    main()

RCB

BlackJack hat geschrieben:Wie ``del`` funktioniert ist eigentlich egal. Ich habe nämlich gerade mal versucht heraus zu finden wie das ordentlich eingerückt aussehen müsste, und die beiden ``del``-Anweisungen müssen im ``if``-Zweig stehen, sonst würde das ``else`` danach ein Syntaxfehler sein. Im ``if``-Zweig stehen die ``del``\s aber direkt nach einem `sys.exit()`-Aufruf: Die werden also überhaupt gar nicht ausgeführt. So viel dazu das die wichtig sind, weil es sonst nicht funktioniert. :-)

Edit: Okay, Kommando zurück, ich bin gerade noch dabei generell das ganze ohne Syntaxfehler hinzubekommen und habe nicht bedacht, dass das `sys.exit()` nicht konventionell eingerückt ist und sogar zwei Ebenen tiefer steht als ich dachte, weil die jeweils nur mit einem Leerzeichen eingerückt sind. Lesegewohnheiten…
ich kann dir versichern dass die aufgeferufen werden. die einrückungen sehen nicht geil aus ich weiß
der sys.exit kommt erst wenn i=5 ist und wenn die andere if bedingung erfüllt ist
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@RCB: dass man den Code so hereinstellen soll, dass man auch Einrückungen sieht, war nicht so gemeint, dass man da dann irgend etwas trickst. Man kann nämlich den Code markieren und dann Code in dieser Leiste [Quote]

Code: Alles auswählen

 [List] usw[/b]. drücken. Noch schöner wird es - und so sollte man das tun, wenn man stattdessen im Feld [b][Code auswählen][/b] [color=#4040BF][b]'PY (Python[/b][/color])' nimmt.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@RCB: Das i+=1 macht irgendwann Ärger und führt zu einem undefinierten d. Weiter ist mir unklar, ob die Bedingung, die den Codeblock mit sys.exit ausführen soll, überhaupt zutreffen kann. Mit einer ordentlichen Einrückung ließe sich dies besser erkennen. Der Code ist ohne Neuformatierung praktisch nicht fehlerfrei lesbar und auch nicht mehr wartbar. Mein Rat: nimm die bisherige Hilfe an.
BlackJack

@kbr: Ich vermute mal ganz stark, dass das Beenden des Programms (`sys.exit()` beziehungsweise das ``break`` in der aufgeräumten Variante von mir) entweder an der falschen Stelle steht, oder das `i` nicht unbegrenzt wachsen soll. Was RCB an der Stelle gerne als Verhalten des Programms hätte, lässt sich nur raten.

@RCB: Ich hatte dann ja schon gesehen das die ``del``\s ausgeführt werden. Aber sie machen weiterhin keinen Sinn *und* ich sehe auch nicht wie die in irgendeiner früheren Version Sinn gemacht haben können. Denn entweder werden die Namen vor einem Zugriff dann wieder an Werte gebunden, womit das ``del`` keinen für den Programmablauf sichtbaren Effekt hätte, also einfach wegfallen könnte, *oder* der Name wird vor einer Verwendung *nicht* neu gebunden, was zu einem Programmabbruch wegen einem `NameError` führen würde. Du hattest ja aber gesagt das Programm funktionierte, also kann dieser Fall nicht eingetreten sein. Da wären wir also wieder bei: Es kann keinen Effekt gehabt haben und ist deshalb sinnlos.
Antworten