Auswertung von String Python2 vs Python3

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
roliver
User
Beiträge: 10
Registriert: Mittwoch 4. September 2019, 14:52

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann Vergleich doch mal genau, was sich in deiner Zeile von den anderen unterscheidet.
roliver
User
Beiträge: 10
Registriert: Mittwoch 4. September 2019, 14:52

was heist das jetzt? mache ich doch oder?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
roliver
User
Beiträge: 10
Registriert: Mittwoch 4. September 2019, 14:52

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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......
Benutzeravatar
__blackjack__
User
Beiträge: 13236
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wenn man topic decodieren möchte, dann macht man das ein mal und speichert das Ergebnis in einer Variable.
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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":
    ...
Antworten