jgdv.decorators.proto

Classes

CheckProtocols

A Class Decorator to ensure a class has no abc.abstractmethod's

Proto

Decorator to explicitly annotate a class as an implementer of a set of protocols.

Module Contents

class jgdv.decorators.proto.CheckProtocols[source]

Bases: jgdv.decorators._core._DecAnnotate_m

A Class Decorator to ensure a class has no abc.abstractmethod’s or unimplemented protocol members

pass additional protocols when making the decorator, eg:

@CheckProtocol(Proto1_p, Proto2_p, AbsClass...)
class MyClass:
pass
get_protos(target) <Unknown>[source]

Get the protocols of a type from its mro and annotations

Parameters:

target (type)

Return type:

set[Protocol]

test_method(cls, name) <Unknown>[source]

return True if the named method is abstract still

Parameters:
Return type:

bool

test_protocol(proto, cls) <Unknown>[source]

Returns a list of methods which are defined in the protocol, and nowhere else in the mro.

ie: they are unimplemented protocol requirements

Can handle type aliases, so long as they actually point to a protocol. | eg: type proto_alias = MyProtocol_p | where issubclass(MyProtocol_p, Protocol)

Parameters:

proto (Protocol)

Return type:

list[str]

validate_protocols(cls, *, protos) <Unknown>[source]
Parameters:
  • cls (type)

  • protos (jgdv.Maybe[list[Protocol]])

Return type:

type

_annotation_prefix: ClassVar[str] = '__JGDV__'
_data_key = None
_data_suffix: ClassVar[str] = 'protocols'
class jgdv.decorators.proto.Proto(*protos, check=True, mod_mro=False)[source]

Bases: jgdv.decorators._core.MonotonicDec

Decorator to explicitly annotate a class as an implementer of a set of protocols.

Protocols are annotated into cls._jgdv_protos : set[Protocol]:

class ClsName(Supers*, P1, P1..., **kwargs):...

becomes:

@Protocols(P1, P2,...)
class ClsName(Supers): ...

Protocol definition remains the usual way:

class Proto1(Protocol): ...

class ExtProto(Proto1, Protocol): ...
Parameters:
  • protos (Protocol)

  • check (bool)

  • mod_mro (bool)

_build_annotations_h(target, current) <Unknown>[source]

Given a list of the current annotation list, return its replacement

Parameters:
  • target (jgdv.decorators._interface.Decorable)

  • current (list)

Return type:

jgdv.Maybe[list]

_build_mro(cls) <Unknown>[source]
Return type:

list

_validate_target_h(
target,
form,
args=None,
) <Unknown>[source]

Abstract class for specialization. Given the original target, throw an error here if it isn’t ‘correct’ in some way

Parameters:
Return type:

None

_wrap_class_h(cls) <Unknown>[source]

Logic for inserting the protocol into the given cls.

Parameters:

cls (type)

Return type:

jgdv.Maybe[type]

static get(cls) <Unknown>[source]

Get a List of protocols the class is annotated with

Parameters:

cls (type)

Return type:

list[Protocol]

static validate_protocols(cls, *protos) <Unknown>[source]
Parameters:
  • cls (type)

  • protos (Protocol)

_check: bool
_checker: ClassVar[CheckProtocols]
_mod_mro: bool
_name_mod: str
_protos: list
needs_args = True