Seite 2 von 2

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 11:49
von joernius
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" ?

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 12:54
von Jankie
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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 13:27
von Sirius3
@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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 13:43
von joernius
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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 14:23
von Sirius3
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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 14:46
von joernius
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?

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 15:07
von __deets__
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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 18:52
von __blackjack__
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.

Re: If then Abfrage

Verfasst: Dienstag 12. Januar 2021, 20:39
von joernius
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.