Python bytearray to string

Python bytearray to string
« kdy: 23. 04. 2019, 13:49:20 »
Dobry den.

V pytone mam nieco taketo
Kód: [Vybrat]
import snap7

plc = snap7.client.Client()

plc.connect('192.168.0.1', 0, 1)
print("CON STATUS: ", plc.get_connected());

reading = plc.db_read(1, 4, 20)

reading.decode("utf-8", errors="replace")

print (reading)

plc.disconnect()

Vracia mi to ale hodnotu
bytearray(b'String no. 1\x00\x00\x00\x00\x00\x00\x00\x00')
skusal som to osetrit cez decode tak aby to vracalo len "cisty text" teda String no. 1 ale bez uspechu. Vedel by niekto poradit?


gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #1 kdy: 23. 04. 2019, 14:00:04 »
Decode vraci decodovanou hodnotu, ale nemeni puvodni hodnotu. V pythonu vetsinou plati konvence, ze funkce vracejici hodnotu nic nemeni. Funkce se side efekty vraci None.

Re:Python bytearray to string
« Odpověď #2 kdy: 23. 04. 2019, 14:12:19 »
gill ako by som mal teda postupovat tak aby to bolo koretne?

Re:Python bytearray to string
« Odpověď #3 kdy: 23. 04. 2019, 14:13:19 »
prepacte som to netoto na prvy krat

reading = reading.decode("utf-8") takto je to ok.

Re:Python bytearray to string
« Odpověď #4 kdy: 23. 04. 2019, 17:40:38 »
Já bych radil se vyvarovat tomuto přepisování proměnných. Samozřejmě, řádek reading = reading.decode("utf-8") bude fungovat, ale znesnadňuje to čtení – najednou v té proměnné mám jinou hodnotu, dokonce i jiný typ. Radši bych vytvořil novou proměnnou a napsal něco jako reading = reading_bytes.decode("utf-8").

(Nechávám stranou, jestli „reading“ je vhodný název proměnné.)


SB

  • ****
  • 347
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #5 kdy: 24. 04. 2019, 11:41:17 »
Toto je typické uvažování z typovaných jazyků - v nich není mezivýsledek v extra proměnné ani tak kvůli přehlednosti jako kvůli typu, string prostě nejde strčit do byte array, kdežto v netypovaném jazyku je to buřt.
Vzhledem k tomu, že se proměnná jmenuje "reading" (i když je to zde debilní název), i po konverzích jsou v ní pořád data ze čtení (i když v jiném formátu) - z tohoto pohledu je vše v pořádku.
Budu-li dělat 20 konverzí za sebou, mám to nechat v jedné proměnné, nebo udělat 20 proměnných? Závěr: Je to čistě věcí osobního uvážení, jak přesně chci mít obsah pojmenovaný, případně zda vůbec s jednotlivými mezivýsledky budu něco dělat.

kate

Re:Python bytearray to string
« Odpověď #6 kdy: 24. 04. 2019, 15:14:45 »
Toto je typické uvažování z typovaných jazyků
Rozhodně bych tu praktiku nevázala jen na dynamické jazyky. Třeba Rust je strong typed jazyk, ve kterém je variable shadowing nejen povolený a běžně používaný, ale v některých případech i vyloženě žádoucí (shadowing proměnné sama sebou se používá na zrušení mutability)

nula

Re:Python bytearray to string
« Odpověď #7 kdy: 24. 04. 2019, 19:09:16 »
Toto je typické uvažování z typovaných jazyků - v nich není mezivýsledek v extra proměnné ani tak kvůli přehlednosti jako kvůli typu, string prostě nejde strčit do byte array, kdežto v netypovaném jazyku je to buřt.
Vzhledem k tomu, že se proměnná jmenuje "reading" (i když je to zde debilní název), i po konverzích jsou v ní pořád data ze čtení (i když v jiném formátu) - z tohoto pohledu je vše v pořádku.
Budu-li dělat 20 konverzí za sebou, mám to nechat v jedné proměnné, nebo udělat 20 proměnných? Závěr: Je to čistě věcí osobního uvážení, jak přesně chci mít obsah pojmenovaný, případně zda vůbec s jednotlivými mezivýsledky budu něco dělat.

Jen detaily: Jazyk python je typovany jazyk. Akorat ne staticky typovany. A za druhe ..vlastne to co psala kate, to co pisete neni vzdy nutnost ani ve staticky typovanych jazycich.

qelurg

  • ****
  • 358
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #8 kdy: 24. 04. 2019, 20:57:09 »
Já bych radil se vyvarovat tomuto přepisování proměnných. Samozřejmě, řádek reading = reading.decode("utf-8") bude fungovat, ale znesnadňuje to čtení – najednou v té proměnné mám jinou hodnotu, dokonce i jiný typ. Radši bych vytvořil novou proměnnou a napsal něco jako reading = reading_bytes.decode("utf-8").

(Nechávám stranou, jestli „reading“ je vhodný název proměnné.)

Naopak, nepřehledné je mít milion různých proměnných v kterých jsou stejná data a která nepotřebujeme současně. Jedná se pořád o jedny a ty samá data, je správné mít pro ně stále stejný název. Potřeba měnit proměnné je zlozvyk ze staticky typovaných jazyků, kde je to technická nutnost, je to důsledek omezení těchto nižších jazyků, které nemají žádný přínos.

kate

Re:Python bytearray to string
« Odpověď #9 kdy: 25. 04. 2019, 07:55:57 »
kde je to technická nutnost, je to důsledek omezení těchto nižších jazyků, které nemají žádný přínos.

Technická nutnost fakt ne. Asi to usnadňuje psaní kompileru (nemám zkušenost), ale jinak je to fakt jen na libovůli tvůrce jazyka, se statickou typovostí to nemá nic moc společného. Viz třeba výše zmíněný Rust, tvrdit že je to dynamicky typovaný jazyk by bylo slušné šílenství ;-)

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #10 kdy: 25. 04. 2019, 10:21:52 »
kde je to technická nutnost, je to důsledek omezení těchto nižších jazyků, které nemají žádný přínos.

Technická nutnost fakt ne. Asi to usnadňuje psaní kompileru (nemám zkušenost), ale jinak je to fakt jen na libovůli tvůrce jazyka, se statickou typovostí to nemá nic moc společného. Viz třeba výše zmíněný Rust, tvrdit že je to dynamicky typovaný jazyk by bylo slušné šílenství ;-)

resilo se tu prirazeni hodnoty ruznych typu do jedne promenne.

kate

Re:Python bytearray to string
« Odpověď #11 kdy: 25. 04. 2019, 11:05:10 »
resilo se tu prirazeni hodnoty ruznych typu do jedne promenne.
Přičemž „jednou proměnnou“ byl nejspíš myšlen název proměnné, nebyl?
Kód: [Vybrat]
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: a = 1

In [2]: id(a)
Out[2]: 140418482099424

In [3]: a = "mrkev"

In [4]: id(a)
Out[4]: 140418212429360

Opravdu je v obou případech a stejná proměnná, navzdory odlišnému ID? Jak se to liší od téhle konstukce v Rustu, kterou třeba C++ neumožňuje?

Kód: [Vybrat]
let i = 1;
let i = "mrkev";

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #12 kdy: 25. 04. 2019, 11:22:30 »
Opravdu je v obou případech a stejná proměnná, navzdory odlišnému ID? Jak se to liší od téhle konstukce v Rustu, kterou třeba C++ neumožňuje?

Kód: [Vybrat]
let i = 1;
let i = "mrkev";

nevedel jsem, ze neco takoveho jde. omlouvam se za nedorozumneni.

kate

Re:Python bytearray to string
« Odpověď #13 kdy: 25. 04. 2019, 11:28:59 »
nevedel jsem, ze neco takoveho jde. omlouvam se za nedorozumneni.
Jak jsem psala výš, dokonce je to v Rustu často používaný postup :) A silná statická typovost jazyka shadowing navíc dost zpřehledňuje, vždy je naprosto jasné jaký datový typ se pod tím identifikátorem aktuálně skrývá.

SB

  • ****
  • 347
    • Zobrazit profil
    • E-mail
Re:Python bytearray to string
« Odpověď #14 kdy: 25. 04. 2019, 22:59:54 »
Rozhodně bych tu praktiku nevázala jen na dynamické jazyky. Třeba Rust je strong typed jazyk, ve kterém je variable shadowing nejen povolený a běžně používaný, ale v některých případech i vyloženě žádoucí (shadowing proměnné sama sebou se používá na zrušení mutability)

1. Kolik jazyků to má?
2. Není to další rovnák na ohýbák?