X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;f=gps303%2Fgps303proto.py;h=c96a6dc945312ef4b0f9df46239afa06c73f6370;hb=b84a40a485b0563d572d14e748ad324185584344;hp=da5796f988eeb281f4fa2e85c64e55e12c7e44f1;hpb=dbcd32b54fe0832a9020ab3cc32f886ad9761093;p=loctrkd.git diff --git a/gps303/gps303proto.py b/gps303/gps303proto.py index da5796f..c96a6dc 100755 --- a/gps303/gps303proto.py +++ b/gps303/gps303proto.py @@ -18,7 +18,17 @@ from datetime import datetime, timezone from enum import Enum from inspect import isclass from struct import error, pack, unpack -from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union +from typing import ( + Any, + Callable, + Dict, + List, + Optional, + Tuple, + Type, + TYPE_CHECKING, + Union, +) __all__ = ( "class_by_prefix", @@ -120,37 +130,40 @@ class MetaPkt(type): respectively. """ + if TYPE_CHECKING: + + def __getattr__(self, name: str) -> Any: + pass + + def __setattr__(self, name: str, value: Any) -> None: + pass + def __new__( - cls, name: str, bases: Tuple[type, ...], attrs: Dict[str, Any] + cls: Type["MetaPkt"], + name: str, + bases: Tuple[type, ...], + attrs: Dict[str, Any], ) -> "MetaPkt": newcls = super().__new__(cls, name, bases, attrs) - setattr( - newcls, - "In", - super().__new__( - cls, - name + ".In", - (newcls,) + bases, - { - "KWARGS": newcls.IN_KWARGS, - "decode": newcls.in_decode, - "encode": newcls.in_encode, - }, - ), + newcls.In = super().__new__( + cls, + name + ".In", + (newcls,) + bases, + { + "KWARGS": newcls.IN_KWARGS, + "decode": newcls.in_decode, + "encode": newcls.in_encode, + }, ) - setattr( - newcls, - "Out", - super().__new__( - cls, - name + ".Out", - (newcls,) + bases, - { - "KWARGS": newcls.OUT_KWARGS, - "decode": newcls.out_decode, - "encode": newcls.out_encode, - }, - ), + newcls.Out = super().__new__( + cls, + name + ".Out", + (newcls,) + bases, + { + "KWARGS": newcls.OUT_KWARGS, + "decode": newcls.out_decode, + "encode": newcls.out_encode, + }, ) return newcls @@ -170,6 +183,14 @@ class GPS303Pkt(metaclass=MetaPkt): In: Type["GPS303Pkt"] Out: Type["GPS303Pkt"] + if TYPE_CHECKING: + + def __getattr__(self, name: str) -> Any: + pass + + def __setattr__(self, name: str, value: Any) -> None: + pass + def __init__(self, *args: Any, **kwargs: Any): """ Construct the object _either_ from (length, payload), @@ -644,7 +665,9 @@ if True: # just to indent the code, sorry! PROTOS[cls.__name__] = cls.PROTO -def class_by_prefix(prefix: str) -> Union[type, List[Tuple[str, int]]]: +def class_by_prefix( + prefix: str, +) -> Union[Type[GPS303Pkt], List[Tuple[str, int]]]: lst = [ (name, proto) for name, proto in PROTOS.items()