If then Abfrage

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.
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Aha, danke.
Es hat funktioniert und lief viele Zeilen weiter...

Code: Alles auswählen

def make_interpreter(model_file):
  model_file, *device = model_file.split('@')
  try:
    return tflite.Interpreter(
        model_path=model_file,
        experimental_delegates=[
            tflite.load_delegate(EDGETPU_SHARED_LIB,
                                 {'device': device[0]} if device else {})
        #except ValueError:
        #print("Coral Acculator nicht angesteckt, bitte Auffruf ändern") 
        ])

  except ValueError:
    print("Coral Acculator nicht angesteckt, bitte Auffruf ändern") 
    #break
.. bis zum nächsten Fehler in einer viel späteren Anweisung. (AttributeError: 'NoneType' object has no attribute 'allocate_tensors')
Dies ist mir nicht nachvollziehbar, weil beim auskommentieren der "experimental_delegates=["-Zeile kein Fehler mehr auftrat.

Aber egal, Teilziel erreicht: Es kommt der Hinweis per print().
Wie breche ich an dieser Stelle aber das Skript ab?
Egal, wo ich das break platziere, es kommt ein "SyntaxError: 'break' outside loop" oder "IndentationError: unexpected indent" ?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die Funktion gibt aber so None zurück, wenn es in den except Block geht, hoffe das hast du bedacht.

Wo tritt denn der Fehler auf? Kannst du deinen kompletten Code einmal posten? Mit der gesamten Fehlermeldung.

In der Regel hat man in der main() Funktion eine Schleife, die dann mit break verlassen wird wenn das Programm zu Ende sein soll. Man beendet das nicht in einer Funktion.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@joernius: warum denkst Du denn, dass Du break brauchst?
Eine Fehlerbehandlung ist nur dort sinnvoll, wo man danach weiterarbeiten kann, bei Dir geht das nicht, weil Du keinen sinnvollen Rückgabewert im Fehlerfall hast. Das bedeutet, an der Stelle entweder, Du baust im Except-Teil eine sinnvolle Behandlung ein, oder Du kannst den Fehler in dieser Funktion gar nicht behandeln und läßt in in die nächst höhere Ebene fallen. Im Zweifel kann der Fehler gar nicht behandelt werden und das Programm bricht ganz ab. So wie ich das jetzt verstanden habe, willst Du das ja.
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Ja, ich will es nach dem print-Hinweis abbrechen, aber die Fehlermeldungen später folgenden Anweisungen sind eben unschön .

Update
OK, gelöst. Ein exit() an dieser Stelle brachte den gewünschten Effekt.

Exit darf also.... dann hat wohl break in Python eine andere Bedeutung.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, ein exit an dieser Stelle hat ist nicht gut. exit sollte wirklich nur dann vorkommen, wenn man das auch erwartet, also eigentlich nur in der main-Funktion.
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Hmmm, in meiner Welt darf ich das und kann die exit-Werte auch noch mit Ziffern bestücken, um damit die Ausgangs-Wege zu markieren, bzw. Fehlercodes zu definieren.

Ist den sys.exit() eine bessere Lösung?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

exit und sys.exit sind das gleiche. Daher gelten dafür auch die gleichen Erwägungen.

Und der Raum des möglichen ist immer größer als der des sinnvollen. Du *kannst* dir ein Loch ins Knie bohren. Eine gute Idee ist es immer noch nicht. Und so verhält es sich auch hier. Denn es ist überraschend. Und Überraschungen sind super in Eiern, nicht so gut beim Programmieren. Denn sie führen zu langwierigen Fehlersuchen.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die sinnvolle Fehlerbehandlung an der Stelle wäre den Interpreter ohne den Edge-TPU-Kram zu erstellen und zurückzugeben. Das war doch eigentlich auch der Plan wenn ich mich recht erinnere.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Ohne dem Edge-TPU-Krams gibt es aber auch keine keine Fehlermeldung.
Aber mein damaliger Gedanke ist kaum zu verwirklichen, jedenfalls nicht von mir, weil der Aufrufes dieses Skriptes auch das dafür entsprechende Model mit ausruft. Ich werde nun das machen, was ich kann :-) : Den Aufruf in Abhängigkeit vom eingesteckten USB-Gerät auszuhandeln. Per Bash-Skript und Unix-Tools.

Ich bedanke mich für die Diskussionsteilnahme.
Antworten