Coverage for src/incant/_compat.py: 100%
25 statements
« prev ^ index » next coverage.py v7.0.1, created at 2023-06-27 02:25 +0200
« prev ^ index » next coverage.py v7.0.1, created at 2023-06-27 02:25 +0200
1import sys
3from functools import partial
4from inspect import Parameter
5from inspect import signature as sig
6from typing import Any, Optional
8from attr import frozen
11NO_OVERRIDE = object()
14@frozen
15class Override:
16 name: Optional[str] = None
17 annotation: Any = NO_OVERRIDE
20if sys.version_info >= (3, 9):
21 from typing import _AnnotatedAlias # type: ignore
23else:
24 from typing_extensions import _AnnotatedAlias
26if sys.version_info >= (3, 10):
27 signature = partial(sig, eval_str=True)
29else:
30 signature = sig
33def get_annotated_override(p: Parameter) -> Parameter:
34 if p.annotation.__class__ is _AnnotatedAlias:
35 for arg in p.annotation.__metadata__:
36 if isinstance(arg, Override):
37 name = arg.name if arg.name is not None else p.name
38 an = (
39 arg.annotation
40 if arg.annotation is not NO_OVERRIDE
41 else p.annotation
42 )
43 return Parameter(name, p.kind, default=p.default, annotation=an)
44 return p