Serielle Library mit Pymonad optimieren
Verfasst: Freitag 20. Oktober 2023, 18:22
Hi, ich schreibe gerade an einer kleinen Funktionslibrary für eine serielle Schnittstelle mit Pymonad, weil ich die Fehlerbehandlung gern mit Monaden machen möchte statt mit Exceptions. Mein bisheriger Code funktioniert schonmal und sieht so aus
Was wir nicht gefällt ist die Notwendigkeit der Lambdas für den ersten Parameter. In anderen Sprachen wird der Rückgabewert der vorherigen Funktion automatisch als erster Parameter in die nächste Funktion übergeben, ohne ihn angeben zu müssen. Also in etwa so.
Ich bin noch nicht ganz durchgestiegen ob und wenn ja wie das mit Pymonad machbar ist. Kennt sich von euch jemand damit besser aus und kann mir da weiterhelfen?
Code: Alles auswählen
from pymonad.either import Left, Right
import serial
def open_serial_port(port, baud_rate, timeout=1):
try:
ser = serial.Serial(port, baud_rate, timeout=timeout)
return Right((ser, 0))
except Exception as e:
return Left(e)
def close_serial_port(ser):
ser, data = ser
try:
ser.close()
return Right(data)
except Exception as e:
return Left(e)
def send_data(ser, data_to_send):
ser, data = ser
try:
ser.write(data_to_send.encode('utf-8'))
return Right((ser, data))
except Exception as e:
return Left(e)
def receive_data(ser):
ser, data = ser
try:
data = ser.readline().decode('utf-8')
return Right((ser, data))
except Exception as e:
return Left(e)
if __name__ == "__main__":
result = (
open_serial_port('com9', 115200)
.then(lambda ser: send_data(ser, '++addr\n'))
.then(lambda ser: receive_data(ser))
.then(lambda ser: close_serial_port(ser))
)
print(result.either(lambda x: f'Sorry, {x}', lambda x: x))
Code: Alles auswählen
if __name__ == "__main__":
result = (
open_serial_port('com9', 115200)
.then(send_data( '++addr\n'))
.then(receive_data())
.then(close_serial_port())
)