Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/mypy_extensions.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
comparison
equal
deleted
inserted
replaced
| 4:79f47841a781 | 5:9b1c78e6ba9c |
|---|---|
| 1 """Defines experimental extensions to the standard "typing" module that are | |
| 2 supported by the mypy typechecker. | |
| 3 | |
| 4 Example usage: | |
| 5 from mypy_extensions import TypedDict | |
| 6 """ | |
| 7 | |
| 8 from typing import Any | |
| 9 | |
| 10 # NOTE: This module must support Python 2.7 in addition to Python 3.x | |
| 11 | |
| 12 import sys | |
| 13 # _type_check is NOT a part of public typing API, it is used here only to mimic | |
| 14 # the (convenient) behavior of types provided by typing module. | |
| 15 from typing import _type_check # type: ignore | |
| 16 | |
| 17 | |
| 18 def _check_fails(cls, other): | |
| 19 try: | |
| 20 if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools', 'typing']: | |
| 21 # Typed dicts are only for static structural subtyping. | |
| 22 raise TypeError('TypedDict does not support instance and class checks') | |
| 23 except (AttributeError, ValueError): | |
| 24 pass | |
| 25 return False | |
| 26 | |
| 27 | |
| 28 def _dict_new(cls, *args, **kwargs): | |
| 29 return dict(*args, **kwargs) | |
| 30 | |
| 31 | |
| 32 def _typeddict_new(cls, _typename, _fields=None, **kwargs): | |
| 33 total = kwargs.pop('total', True) | |
| 34 if _fields is None: | |
| 35 _fields = kwargs | |
| 36 elif kwargs: | |
| 37 raise TypeError("TypedDict takes either a dict or keyword arguments," | |
| 38 " but not both") | |
| 39 | |
| 40 ns = {'__annotations__': dict(_fields), '__total__': total} | |
| 41 try: | |
| 42 # Setting correct module is necessary to make typed dict classes pickleable. | |
| 43 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') | |
| 44 except (AttributeError, ValueError): | |
| 45 pass | |
| 46 | |
| 47 return _TypedDictMeta(_typename, (), ns) | |
| 48 | |
| 49 | |
| 50 class _TypedDictMeta(type): | |
| 51 def __new__(cls, name, bases, ns, total=True): | |
| 52 # Create new typed dict class object. | |
| 53 # This method is called directly when TypedDict is subclassed, | |
| 54 # or via _typeddict_new when TypedDict is instantiated. This way | |
| 55 # TypedDict supports all three syntaxes described in its docstring. | |
| 56 # Subclasses and instances of TypedDict return actual dictionaries | |
| 57 # via _dict_new. | |
| 58 ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new | |
| 59 tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) | |
| 60 | |
| 61 anns = ns.get('__annotations__', {}) | |
| 62 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" | |
| 63 anns = {n: _type_check(tp, msg) for n, tp in anns.items()} | |
| 64 for base in bases: | |
| 65 anns.update(base.__dict__.get('__annotations__', {})) | |
| 66 tp_dict.__annotations__ = anns | |
| 67 if not hasattr(tp_dict, '__total__'): | |
| 68 tp_dict.__total__ = total | |
| 69 return tp_dict | |
| 70 | |
| 71 __instancecheck__ = __subclasscheck__ = _check_fails | |
| 72 | |
| 73 | |
| 74 TypedDict = _TypedDictMeta('TypedDict', (dict,), {}) | |
| 75 TypedDict.__module__ = __name__ | |
| 76 TypedDict.__doc__ = \ | |
| 77 """A simple typed name space. At runtime it is equivalent to a plain dict. | |
| 78 | |
| 79 TypedDict creates a dictionary type that expects all of its | |
| 80 instances to have a certain set of keys, with each key | |
| 81 associated with a value of a consistent type. This expectation | |
| 82 is not checked at runtime but is only enforced by typecheckers. | |
| 83 Usage:: | |
| 84 | |
| 85 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) | |
| 86 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK | |
| 87 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check | |
| 88 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') | |
| 89 | |
| 90 The type info could be accessed via Point2D.__annotations__. TypedDict | |
| 91 supports two additional equivalent forms:: | |
| 92 | |
| 93 Point2D = TypedDict('Point2D', x=int, y=int, label=str) | |
| 94 | |
| 95 class Point2D(TypedDict): | |
| 96 x: int | |
| 97 y: int | |
| 98 label: str | |
| 99 | |
| 100 The latter syntax is only supported in Python 3.6+, while two other | |
| 101 syntax forms work for Python 2.7 and 3.2+ | |
| 102 """ | |
| 103 | |
| 104 # Argument constructors for making more-detailed Callables. These all just | |
| 105 # return their type argument, to make them complete noops in terms of the | |
| 106 # `typing` module. | |
| 107 | |
| 108 | |
| 109 def Arg(type=Any, name=None): | |
| 110 """A normal positional argument""" | |
| 111 return type | |
| 112 | |
| 113 | |
| 114 def DefaultArg(type=Any, name=None): | |
| 115 """A positional argument with a default value""" | |
| 116 return type | |
| 117 | |
| 118 | |
| 119 def NamedArg(type=Any, name=None): | |
| 120 """A keyword-only argument""" | |
| 121 return type | |
| 122 | |
| 123 | |
| 124 def DefaultNamedArg(type=Any, name=None): | |
| 125 """A keyword-only argument with a default value""" | |
| 126 return type | |
| 127 | |
| 128 | |
| 129 def VarArg(type=Any): | |
| 130 """A *args-style variadic positional argument""" | |
| 131 return type | |
| 132 | |
| 133 | |
| 134 def KwArg(type=Any): | |
| 135 """A **kwargs-style variadic keyword argument""" | |
| 136 return type | |
| 137 | |
| 138 | |
| 139 # Return type that indicates a function does not return | |
| 140 class NoReturn: pass | |
| 141 | |
| 142 | |
| 143 def trait(cls): | |
| 144 return cls | |
| 145 | |
| 146 | |
| 147 def mypyc_attr(*attrs, **kwattrs): | |
| 148 return lambda x: x | |
| 149 | |
| 150 | |
| 151 # TODO: We may want to try to properly apply this to any type | |
| 152 # variables left over... | |
| 153 class _FlexibleAliasClsApplied: | |
| 154 def __init__(self, val): | |
| 155 self.val = val | |
| 156 | |
| 157 def __getitem__(self, args): | |
| 158 return self.val | |
| 159 | |
| 160 | |
| 161 class _FlexibleAliasCls: | |
| 162 def __getitem__(self, args): | |
| 163 return _FlexibleAliasClsApplied(args[-1]) | |
| 164 | |
| 165 | |
| 166 FlexibleAlias = _FlexibleAliasCls() |
