def test_set(self): # Different reflections aty = types.Set(i16, reflected=True) bty = types.Set(i32) cty = types.Set(i32, reflected=True) self.assert_unify(aty, bty, cty) # Incompatible dtypes aty = types.Set(i16) bty = types.Set(types.Tuple([i16])) self.assert_unify_failure(aty, bty)
def generic(self, args, kws): assert not kws if args: # set(iterable) iterable, = args if isinstance(iterable, types.IterableType): dtype = iterable.iterator_type.yield_type if isinstance(dtype, types.Hashable): return signature(types.Set(dtype), iterable) else: # set() return signature(types.Set(types.undefined))
def test_sets(self): v = set([1.0, 2.0, 3.0]) self.assertEqual(typeof(v), types.Set(types.float64, reflected=True)) v = frozenset(v) with self.assertRaises(ValueError) as raises: typeof(v) self.assertIn("Cannot determine Numba type of", str(raises.exception))
def _typeof_set(val, c): if len(val) == 0: raise ValueError("Cannot type empty set") item = next(iter(val)) ty = typeof_impl(item, c) if ty is None: raise ValueError(f"Cannot type set element type {type(item)}") return types.Set(ty, reflected=True)
def _builtin_infer(self, py_type): # The type hierarchy of python typing library changes in 3.7. generic_type_check = _py_version_switch( (3, 7), lambda x: isinstance(x, py_typing._GenericAlias), lambda _: True, ) if not generic_type_check(py_type): return list_origin = _py_version_switch((3, 7), list, py_typing.List) dict_origin = _py_version_switch((3, 7), dict, py_typing.Dict) set_origin = _py_version_switch((3, 7), set, py_typing.Set) tuple_origin = _py_version_switch((3, 7), tuple, py_typing.Tuple) if getattr(py_type, "__origin__", None) is py_typing.Union: if len(py_type.__args__) != 2: raise errors.TypingError( "Cannot type Union of more than two types") (arg_1_py, arg_2_py) = py_type.__args__ if arg_2_py is type(None): # noqa: E721 return types.Optional(self.infer(arg_1_py)) elif arg_1_py is type(None): # noqa: E721 return types.Optional(self.infer(arg_2_py)) else: raise errors.TypingError( "Cannot type Union that is not an Optional " f"(neither type type {arg_2_py} is not NoneType") if getattr(py_type, "__origin__", None) is list_origin: (element_py, ) = py_type.__args__ return types.ListType(self.infer(element_py)) if getattr(py_type, "__origin__", None) is dict_origin: key_py, value_py = py_type.__args__ return types.DictType(self.infer(key_py), self.infer(value_py)) if getattr(py_type, "__origin__", None) is set_origin: (element_py, ) = py_type.__args__ return types.Set(self.infer(element_py)) if getattr(py_type, "__origin__", None) is tuple_origin: tys = tuple(map(self.infer, py_type.__args__)) return types.BaseTuple.from_types(tys)
def test_nested_containers(self): IntList = py_typing.List[int] self.assertEqual( as_numba_type(py_typing.List[IntList]), types.ListType(types.ListType(self.int_nb_type)), ) self.assertEqual( as_numba_type(py_typing.List[py_typing.Dict[float, bool]]), types.ListType( types.DictType(self.float_nb_type, self.bool_nb_type)), ) self.assertEqual( as_numba_type( py_typing.Set[py_typing.Tuple[py_typing.Optional[int], float]]), types.Set( types.Tuple( [types.Optional(self.int_nb_type), self.float_nb_type])), )
def test_single_containers(self): self.assertEqual( as_numba_type(py_typing.List[float]), types.ListType(self.float_nb_type), ) self.assertEqual( as_numba_type(py_typing.Dict[float, str]), types.DictType(self.float_nb_type, self.str_nb_type), ) self.assertEqual( as_numba_type(py_typing.Set[complex]), types.Set(self.complex_nb_type), ) self.assertEqual( as_numba_type(py_typing.Tuple[float, float]), types.Tuple([self.float_nb_type, self.float_nb_type]), ) self.assertEqual( as_numba_type(py_typing.Tuple[float, complex]), types.Tuple([self.float_nb_type, self.complex_nb_type]), )
def test_disallow_set(self): self.assert_disallow_key(types.Set(types.intp)) self.assert_disallow_value(types.Set(types.intp))
def _typeof_set(val, c): if len(val) == 0: raise ValueError("Cannot type empty set") item = next(iter(val)) ty = typeof_impl(item, c) return types.Set(ty, reflected=True)
def test_sets(self): v = set([1.0, 2.0, 3.0]) self.assertEqual(typeof(v), types.Set(types.float64, reflected=True)) v = frozenset(v) with self.assertRaises(ValueError): typeof(v)