Nachdem Eli Bendersky den Artikel zu lesen on implementing state machines via Python coroutines Ich wollte ...Proper Typenannotation von Python-Funktionen mit Ertrag
- sehen sein Beispiel laufen unter Python3
- und auch die entsprechenden Typenannotationen für die Generatoren hinzufügen
Es ist mir gelungen, den ersten Teil () zu machen, aber ohne async def
s oder yield from
s zu verwenden, habe ich im Grunde nur den Code portiert - also sind alle Verbesserungen dort willkommen).
Aber ich brauche Hilfe bei den Typenannotationen der Koroutinen:
#!/usr/bin/env python3
from typing import Callable, Generator
def unwrap_protocol(header: int=0x61,
footer: int=0x62,
dle: int=0xAB,
after_dle_func: Callable[[int], int]=lambda x: x,
target: Generator=None) -> Generator:
""" Simplified protocol unwrapping co-routine."""
#
# Outer loop looking for a frame header
#
while True:
byte = (yield)
frame = [] # type: List[int]
if byte == header:
#
# Capture the full frame
#
while True:
byte = (yield)
if byte == footer:
target.send(frame)
break
elif byte == dle:
byte = (yield)
frame.append(after_dle_func(byte))
else:
frame.append(byte)
def frame_receiver() -> Generator:
""" A simple co-routine "sink" for receiving full frames."""
while True:
frame = (yield)
print('Got frame:', ''.join('%02x' % x for x in frame))
bytestream = bytes(
bytearray((0x70, 0x24,
0x61, 0x99, 0xAF, 0xD1, 0x62,
0x56, 0x62,
0x61, 0xAB, 0xAB, 0x14, 0x62,
0x7)))
frame_consumer = frame_receiver()
next(frame_consumer) # Get to the yield
unwrapper = unwrap_protocol(target=frame_consumer)
next(unwrapper) # Get to the yield
for byte in bytestream:
unwrapper.send(byte)
Dieser richtig läuft ...
$ ./decoder.py
Got frame: 99afd1
Got frame: ab14
... und auch typechecks:
$ mypy --disallow-untyped-defs decoder.py
$
Aber ich bin mir ziemlich sicher, dass ich besser tun kann, als nur die Generator
Basisklasse in den Typspezifikationen zu verwenden (nur wie ich für die Callable
). Ich weiß, dass es 3 Typparameter benötigt (Generator[A,B,C]
), aber ich bin nicht sicher, wie genau sie hier spezifiziert würden.
Jede Hilfe sehr willkommen.
In Bezug auf 'async def' und Freunde - sie werden derzeit nicht von mypy unterstützt, sind aber in der aktiven Entwicklung/sollten in naher Zukunft bereit sein! Siehe https: // github.com/python/mypy/pull/1808 und https://github.com/python/mypy/issues/1886 für weitere Details. – Michael0x2a
Nur als ein FYI, mypy 0.4.4 (die experimentelle Unterstützung für async/wartet) [wurde gerade veröffentlicht] (http://mypy-lang.blogspot.com/2016/08/mypy-044-released.html) . Weitere Informationen zum Eintippen von Coroutinen und async/aware finden Sie im Allgemeinen in der [mypy docs] (http://mypy.readthedocs.io/en/latest/kinds_of_types.html#typing-async- wait). Momentan denke ich nicht, dass die Dokumente für das Typisierungsmodul selbst Dinge erwähnen, die mit async/await in Verbindung stehen, aber das wird wahrscheinlich irgendwann in den nächsten Tagen behoben werden. – Michael0x2a
Danke, Michael - werde es überprüfen. – ttsiodras