Seite 1 von 1

Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 20:16
von roliver
Hallo Forum,

ich habe ein Problem bei der Auswertung von Strings, hier mal ein Ausschnitt:

Code: Alles auswählen

if msg.topic.decode() == "linux/off":
  if msg.payload.decode() == "Hello world!":
    print("Yes!")
    mqtt.disconnect()
 if msg.topic == "linux/smart":
  print("Smart: "+msg.topic+" "+message)
  if msg.payload.decode() == "luefter aus":
   print ("steuerung")
   pout("#pF0")
  if msg.payload.decode() == "luefter an":
   print ("steuerung")
wenn ich das in Python2 starte geht alles, aber wenn ich es mit Python3 starte wird zum Beispiel

Code: Alles auswählen

if msg.topic == "linux/smart":
nicht ausgewertet warum?

Gruß

Oliver

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 20:17
von __deets__
Dann Vergleich doch mal genau, was sich in deiner Zeile von den anderen unterscheidet.

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 20:42
von roliver
was heist das jetzt? mache ich doch oder?

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 20:50
von __deets__
Nö. Du hast was vergessen zu tun. Womit du Bytes mit nem String vergleichst. Das ging in Python 2, aber (zu recht) nicht mehr in 3.

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 21:06
von __blackjack__
@roliver: Das ist sicher kein Ausschnitt aus Deinem Programm denn das ist sowohl in Python 2 als auch in Python 3 ein `SyntaxError`.

Eingerückt wird ausserdem mit vier Leerzeichen pro Ebene. Nicht mit einem oder zwei.

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 21:26
von roliver
die Einrückung ist in Original alles auf 4 Zeichen, ist beim Kopieren passiert, sorry, das Programm läuft mit V2 gut, leider habe ich das mit V3 noch nicht ganz verstanden. Wo kann ich das denn nach lesen?

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 21:38
von __deets__
Das msg topic sind Bytes. Du vergleichst mit einem String. Geht halt nicht. Und überall sonst wandelst du durch “.decode()” Bytes zu einem String. Nur an einer Stelle nicht......

Re: Auswertung von String Python2 vs Python3

Verfasst: Dienstag 17. September 2019, 22:36
von __blackjack__
Wobei ich hier auch den umgekehrten Weg gehen würde — nicht dekodieren, sondern mit Bytes-Literalen vergleichen.

Was ist hier eigentlich `mqtt`? Das müsste doch ein `Client`-Exemplar sein – da ist der `mqtt` irgendwie komisch. Und was ist `message`? Und wie unterscheidet sich das von `msg`? Was ja wohl eigentlich `message` heissen sollte. Abkz. s. doof.

Es gibt nicht nur ``if`` sondern auch ``elif`` — da gibt's hier zwei stellen an denen das sinnvoll(er) wäre. Und ``else`` gibt es auch für die Fälle wo etwas kommt mit dem man nicht gerechnet hat. Das sollte man mindestens mal protokollieren. Damit wird die Fehlersuche einfacher.

Zeichenketten und Werte mit ``+`` zusammensetzen ist eher BASIC als Python. In Python gibt es Zeichenkettenformatierung mit der `format()`-Methode. Wobei man bei dem `print()` auch einfach mehrere Argumente übergeben könnte (und Leerzeichen aus Zeichenkettenliteralen entfernen).

`pout()` ist kein guter Funktionsname, weil der so überhaupt nicht verrät was die Funktion macht.

Re: Auswertung von String Python2 vs Python3

Verfasst: Mittwoch 18. September 2019, 04:50
von Sirius3
Und wenn man topic decodieren möchte, dann macht man das ein mal und speichert das Ergebnis in einer Variable.

Re: Auswertung von String Python2 vs Python3

Verfasst: Mittwoch 18. September 2019, 07:31
von snafu
Reines ASCII würde ich aber auch eher mit Bytestrings vergleichen. Also nach dem Schema:

Code: Alles auswählen

if msg.topic == b"linux/off":
    ...