Python typing.get_type_hints() Examples
The following are 30
code examples of typing.get_type_hints().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
typing
, or try the search function
.
Example #1
Source File: _type_validation.py From attrs-strict with Apache License 2.0 | 7 votes |
def resolve_types(cls, global_ns=None, local_ns=None): """ Resolve any strings and forward annotations in type annotations. :param type cls: Class to resolve. :param globalns: Dictionary containing global variables, if needed. :param localns: Dictionary containing local variables, if needed. :raise TypeError: If *cls* is not a class. :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` class. :raise NameError: If types cannot be resolved because of missing variables. """ hints = typing.get_type_hints(cls, globalns=global_ns, localns=local_ns) for field in attr.fields(cls): if field.name in hints: # Since fields have been frozen we must work around it. object.__setattr__(field, "type", hints[field.name])
Example #2
Source File: type_util.py From pytypes with Apache License 2.0 | 6 votes |
def _has_type_hints(func0, func_class = None, nesting = None): actual_func = util._actualfunc(func0) func = as_stub_func_if_any(actual_func, func0, func_class, nesting) stub_func = func func = util._actualfunc(func) tpHints = _tpHints_from_annotations(func0, actual_func, stub_func, func) if not tpHints is None: return True try: tpHints = typing.get_type_hints(func) except NameError: # Some typehint caused this NameError, so typhints are present in some form return True except TypeError: # func seems to be not suitable to have type hints return False except AttributeError: # func seems to be not suitable to have type hints return False try: tpStr = _get_typestrings(func, False) return not ((tpStr is None or tpStr[0] is None) and (tpHints is None or not tpHints)) except TypeError: return False
Example #3
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 6 votes |
def test_meta_no_type_check(self): @no_type_check_decorator def magic_decorator(deco): return deco self.assertEqual(magic_decorator.__name__, 'magic_decorator') @magic_decorator def foo(a: 'whatevers') -> {}: pass @magic_decorator class C: def foo(a: 'whatevers') -> {}: pass self.assertEqual(foo.__name__, 'foo') th = get_type_hints(foo) self.assertEqual(th, {}) cth = get_type_hints(C.foo) self.assertEqual(cth, {}) ith = get_type_hints(C().foo) self.assertEqual(ith, {})
Example #4
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 6 votes |
def test_parameterized_slots(self): T = TypeVar('T') class C(Generic[T]): __slots__ = ('potato',) c = C() c_int = C[int]() self.assertEqual(C.__slots__, C[str].__slots__) c.potato = 0 c_int.potato = 0 with self.assertRaises(AttributeError): c.tomato = 0 with self.assertRaises(AttributeError): c_int.tomato = 0 def foo(x: C['C']): ... self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C]) self.assertEqual(get_type_hints(foo, globals(), locals())['x'].__slots__, C.__slots__) self.assertEqual(copy(C[int]), deepcopy(C[int]))
Example #5
Source File: type_util.py From pytypes with Apache License 2.0 | 6 votes |
def _get_type_hints(func, args = None, res = None, infer_defaults = None): """Helper for get_type_hints. """ if args is None or res is None: args2, res2 = _get_types(func, util.is_classmethod(func), util.is_method(func), unspecified_type = type(NotImplemented), infer_defaults = infer_defaults) if args is None: args = args2 if res is None: res = res2 slf = 1 if util.is_method(func) else 0 argNames = util.getargnames(util.getargspecs(util._actualfunc(func))) result = {} if not args is Any: prms = get_Tuple_params(args) for i in range(slf, len(argNames)): if not prms[i-slf] is type(NotImplemented): result[argNames[i]] = prms[i-slf] result['return'] = res return result
Example #6
Source File: defopt.py From defopt with MIT License | 6 votes |
def _get_type_from_hint(hint): if _is_list_like(hint): [type_] = _ti_get_args(hint) return List[type_] elif _ti_get_origin(hint) is Union: # Flatten Union[type, NoneType] (== Optional[type]) to type. # get_type_hints also appends NoneType to unions for parameters # defaulting to None. args = [arg for arg in _ti_get_args(hint) if arg is not type(None)] if len(args) > 1: if any(_is_list_like(subtype) for subtype in args): raise ValueError( 'unsupported union including container type: {}' .format(hint)) return Union[tuple(args)] else: return args[0] return hint
Example #7
Source File: structreader.py From MHWorldData with MIT License | 6 votes |
def read(self, reader: StructReader): result = copy.copy(self) # Use the typehints to guide reading hints = get_type_hints(self.__class__) for name, readable in hints.items(): # As typehints are at the class level, we need to copy them if its a readable if isinstance(readable, Readable): readable = copy.copy(readable) try: value = reader.read_struct(readable) setattr(result, name, value) except Exception as ex: classname = type(self).__name__ raise Exception(f"Failed to read prop {name} in {classname}") from ex return result
Example #8
Source File: resolver.py From async-worker with MIT License | 6 votes |
def _coro_executor(self, coro_ref: Callable[..., Coroutine]): params: Dict[str, Any] = {} unresolved_params = [] coro_arguments = inspect.signature(coro_ref).parameters type_annotations = typing.get_type_hints(coro_ref) type_annotations.pop("return", None) if coro_arguments: if not type_annotations: raise MissingTypeAnnotationError( f"{coro_ref} has no type annotation" ) for param_name, param_type in type_annotations.items(): param_value = self.resolve_param(param_type, param_name) if param_value is not None: params[param_name] = param_value else: unresolved_params.append((param_name, param_type)) if unresolved_params: raise TypeError( f"Unresolved params for coroutine {coro_ref}: {unresolved_params}" ) return await coro_ref(**params)
Example #9
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_tuple_forward(self): def foo(a: Tuple['T']): pass self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Tuple[T]})
Example #10
Source File: public.py From clgen with GNU General Public License v3.0 | 5 votes |
def dataset_preprocessor(func: PreprocessorFunction) -> PreprocessorFunction: """A decorator which marks a function as a dataset preproceessor. A preprocessor is accessible using GetPreprocessFunction(), and is a function which accepts a single parameter 'text', and returns a string. Type hinting is used to ensure that any function wrapped with this decorator has the appropriate argument and return type. If the function does not, an InternalError is raised at the time that the module containing the function is imported. Args: func: The preprocessor function to decorate. Returns: The decorated preprocessor function. Raises: InternalError: If the function being wrapped does not have the signature 'def func(text: str) -> str:'. """ expected_type_hints = { "import_root": pathlib.Path, "file_relpath": str, "all_file_relpaths": typing.List[str], "text": str, "return": typing.List[str], } if typing.get_type_hints(func) != expected_type_hints: return_type = expected_type_hints.pop("return").__name__ expected_args = ", ".join( [f"{k}: {v.__name__}" for k, v in expected_type_hints.items()] ) raise TypeError( f"Preprocessor {func.__name__} does not have signature " f'"def {func.__name__}({expected_args}) -> {return_type}".' ) func.__dict__["is_dataset_preprocessor"] = True return func
Example #11
Source File: __init__.py From punq with MIT License | 5 votes |
def _get_needs_for_ctor(self, cls): try: return get_type_hints(cls.__init__, None, self._localns) except NameError as e: raise InvalidForwardReferenceException(str(e))
Example #12
Source File: utils.py From forte with Apache License 2.0 | 5 votes |
def validate_input(func, **kwargs): hints = get_type_hints(func) # iterate all type hints for attr_name, attr_type in hints.items(): if attr_name == 'return': continue if not isinstance(kwargs[attr_name], attr_type): raise TypeError( f'{attr_name} should be of type {attr_type}, ' f'got type {type(kwargs[attr_name])}' )
Example #13
Source File: public.py From clgen with GNU General Public License v3.0 | 5 votes |
def clgen_preprocessor(func: PreprocessorFunction) -> PreprocessorFunction: """A decorator which marks a function as a CLgen preprocessor. A CLgen preprocessor is accessible using GetPreprocessFunction(), and is a function which accepts a single parameter 'text', and returns a string. Type hinting is used to ensure that any function wrapped with this decorator has the appropriate argument and return type. If the function does not, an InternalError is raised at the time that the module containing the function is imported. Args: func: The preprocessor function to decorate. Returns: The decorated preprocessor function. Raises: InternalError: If the function being wrapped does not have the signature 'def func(text: str) -> str:'. """ type_hints = typing.get_type_hints(func) if not type_hints == {"text": str, "return": str}: raise errors.InternalError( f"Preprocessor {func.__name__} does not have signature " f'"def {func.__name__}(text: str) -> str".' ) func.__dict__["is_clgen_preprocessor"] = True return func
Example #14
Source File: metaprogramming.py From mashumaro with Apache License 2.0 | 5 votes |
def __get_fields(self, recursive=True): fields = {} for fname, ftype in typing.get_type_hints(self.cls).items(): if is_class_var(ftype) or is_init_var(ftype): continue if recursive or fname in self.annotations: fields[fname] = ftype return fields
Example #15
Source File: language_utils.py From Ocean-Data-Map-Project with GNU General Public License v3.0 | 5 votes |
def return_type(f): try: return get_type_hints(f).get('return', Any) except TypeError: return Any
Example #16
Source File: structreader.py From MHWorldData with MIT License | 5 votes |
def __init__(self): self.fields = [] hints = get_type_hints(self.__class__) for name, readable in hints.items(): self.fields.append(name)
Example #17
Source File: decorators.py From async-worker with MIT License | 5 votes |
def parse_path(handler): handler_types_args = typing.get_type_hints(handler) handler_args_names = list(handler_types_args.keys()) async def _wrap(wrapper: RequestWrapper): req = wrapper.http_request for param_name in handler_args_names: if param_name in req.match_info: try: value = handler_types_args[param_name]( req.match_info[param_name] ) wrapper.types_registry.set(value, param_name=param_name) except ValueError: await logger.exception( { "event": "incompatible-types-handler-arg", "arg-type": handler_types_args[param_name], "arg-value": req.match_info[param_name], } ) raise return await call_http_handler(req, handler) return _wrap
Example #18
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_delayed_syntax_error(self): def foo(a: 'Node[T'): pass with self.assertRaises(SyntaxError): get_type_hints(foo)
Example #19
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_callable_with_ellipsis_forward(self): def foo(a: 'Callable[..., T]'): pass self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Callable[..., T]})
Example #20
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_callable_forward(self): def foo(a: Callable[['T'], 'T']): pass self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Callable[[T], T]})
Example #21
Source File: defopt.py From defopt with MIT License | 5 votes |
def _get_type(func, name): """ Retrieve a type from either documentation or annotations. If both are specified, they must agree exactly. """ doc = _parse_docstring(inspect.getdoc(func)) doc_type = doc.params.get(name, _Param(None, None)).type if doc_type is not None: doc_type = _get_type_from_doc(doc_type, func.__globals__) hints = typing.get_type_hints(func) try: hint = hints[name] except KeyError: hint_type = None else: hint_type = _get_type_from_hint(hint) chosen = [x is not None for x in [doc_type, hint_type]] if not any(chosen): raise ValueError('no type found for parameter {}'.format(name)) if all(chosen) and doc_type != hint_type: raise ValueError('conflicting types found for parameter {}: {}, {}' .format(name, doc.params[name].type, hint.__name__)) return doc_type or hint_type
Example #22
Source File: _unpack.py From undictify with MIT License | 5 votes |
def _get_signature(func: WrappedOrFunc[TypeT]) -> inspect.Signature: if hasattr(func, '__annotations__'): # https://stackoverflow.com/questions/53450624/hasattr-telling-lies-attributeerror-method-object-has-no-attribute-annot try: func.__annotations__ = get_type_hints(func) return inspect.signature(func) except AttributeError: return inspect.signature(func) return inspect.signature(func)
Example #23
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_basics(self): class Node(Generic[T]): def __init__(self, label: T): self.label = label self.left = self.right = None def add_both(self, left: 'Optional[Node[T]]', right: 'Node[T]' = None, stuff: int = None, blah=None): self.left = left self.right = right def add_left(self, node: Optional['Node[T]']): self.add_both(node, None) def add_right(self, node: 'Node[T]' = None): self.add_both(None, node) t = Node[int] both_hints = get_type_hints(t.add_both, globals(), locals()) self.assertEqual(both_hints['left'], Optional[Node[T]]) self.assertEqual(both_hints['right'], Optional[Node[T]]) self.assertEqual(both_hints['left'], both_hints['right']) self.assertEqual(both_hints['stuff'], Optional[int]) self.assertNotIn('blah', both_hints) left_hints = get_type_hints(t.add_left, globals(), locals()) self.assertEqual(left_hints['node'], Optional[Node[T]]) right_hints = get_type_hints(t.add_right, globals(), locals()) self.assertEqual(right_hints['node'], Optional[Node[T]])
Example #24
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_no_type_check_class(self): @no_type_check class C: def foo(a: 'whatevers') -> {}: pass cth = get_type_hints(C.foo) self.assertEqual(cth, {}) ith = get_type_hints(C().foo) self.assertEqual(ith, {})
Example #25
Source File: base.py From gs-quant with Apache License 2.0 | 5 votes |
def prop_type(cls, prop: str, additional: Optional[list] = None) -> type: return_hints = get_type_hints(getattr(cls, prop).fget).get('return') if hasattr(return_hints, '__origin__'): prop_type = return_hints.__origin__ else: prop_type = return_hints if prop_type == Union: prop_type = next((a for a in return_hints.__args__ if issubclass(a, (Base, EnumBase))), None) if prop_type is None: for typ in (dt.datetime, dt.date): if typ in return_hints.__args__: prop_type = typ if additional is not None: additional.extend([a for a in return_hints.__args__ if a != prop_type]) break if prop_type is None: prop_type = return_hints.__args__[-1] additional.extend(return_hints.__args__[:-1]) if prop_type is InstrumentBase: # TODO Fix this from .instrument import Instrument prop_type = Instrument return prop_type
Example #26
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_generic_forward_ref(self): def foobar(x: List[List['CC']]): ... class CC: ... self.assertEqual( get_type_hints(foobar, globals(), locals()), {'x': List[List[CC]]} ) T = TypeVar('T') AT = Tuple[T, ...] def barfoo(x: AT): ... self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT) CT = Callable[..., List[T]] def barfoo2(x: CT): ... self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
Example #27
Source File: base.py From gs-quant with Apache License 2.0 | 5 votes |
def prop_item_type(cls, prop: str) -> type: return_hints = get_type_hints(getattr(cls, prop).fget).get('return') item_type = return_hints.__args__[0] item_args = [i for i in getattr(item_type, '__args__', ()) if isinstance(i, type)] if item_args: item_type = next((a for a in item_args if issubclass(a, (Base, EnumBase))), item_args[-1]) return item_type
Example #28
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_callable_with_ellipsis(self): def foo(a: Callable[..., T]): pass self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': Callable[..., T]})
Example #29
Source File: test_typing.py From Project-New-Reign---Nemesis-Main with GNU General Public License v3.0 | 5 votes |
def test_no_eval_union(self): u = Union[int, str] def f(x: u): ... self.assertIs(get_type_hints(f)['x'], u)
Example #30
Source File: register.py From cats-blender-plugin with MIT License | 5 votes |
def iter_register_deps(cls): for value in typing.get_type_hints(cls, {}, {}).values(): dependency = get_dependency_from_annotation(value) if dependency is not None: yield dependency