def check(self, var): """Return True if the variable matches this type, and False otherwise.""" if not isinstance(var, dict): return False if any(key not in self._types for key in var): return False for key, ktype in viewitems(self._types): val = var.get(key, None) if not _check_type(val, ktype): return False return True
def _check_type(var, vtype): """ Return True if the variable is of the specified type, and False otherwise. :param var: variable to check :param vtype: expected variable's type """ if vtype is None: return var is None if isinstance(vtype, _primitive_type): return var == vtype if vtype is str: return isinstance(var, _str_type) if vtype is int: return isinstance(var, _int_type) if vtype is numeric: return isinstance(var, _num_type) if isinstance(vtype, MagicType): return vtype.check(var) if isinstance(vtype, type): # ``vtype`` is a name of the class, or a built-in type such as "list", "tuple", etc return isinstance(var, vtype) if isinstance(vtype, list): # ``vtype`` is a list literal elem_type = U(*vtype) return isinstance(var, list) and all( _check_type(item, elem_type) for item in var) if isinstance(vtype, set): # ``vtype`` is a set literal elem_type = U(*vtype) return isinstance(var, set) and all( _check_type(item, elem_type) for item in var) if isinstance(vtype, tuple): # ``vtype`` is a tuple literal return (isinstance(var, tuple) and len(vtype) == len(var) and all(_check_type(var[i], vtype[i]) for i in range(len(vtype)))) if isinstance(vtype, dict): # ``vtype`` is a dict literal ttkv = U(*viewitems(vtype)) return isinstance(var, dict) and all( _check_type(kv, ttkv) for kv in viewitems(var)) if isinstance(vtype, (FunctionType, BuiltinFunctionType)): return vtype(var) raise RuntimeError("Ivalid type %r in _check_type()" % vtype)
def _get_type_name(vtype, dump=None): """ Return the name of the provided type. _get_type_name(int) == "integer" _get_type_name(str) == "string" _get_type_name(tuple) == "tuple" _get_type_name(Exception) == "Exception" _get_type_name(U(int, float, bool)) == "integer|float|bool" _get_type_name(U(H2O4GPUFrame, None)) == "?H2O4GPUFrame" """ if vtype is None: return "None" if vtype is str: return "string" if vtype is int: return "integer" if vtype is numeric: return "numeric" if is_type(vtype, str): return '"%s"' % repr(vtype)[1:-1] if is_type(vtype, int): return str(vtype) if isinstance(vtype, MagicType): return vtype.name(dump) if isinstance(vtype, type): return vtype.__name__ if isinstance(vtype, list): return "list(%s)" % _get_type_name(U(*vtype), dump) if isinstance(vtype, set): return "set(%s)" % _get_type_name(U(*vtype), dump) if isinstance(vtype, tuple): return "(%s)" % ", ".join(_get_type_name(item, dump) for item in vtype) if isinstance(vtype, dict): return "dict(%s)" % ", ".join("%s: %s" % (_get_type_name(tk, dump), _get_type_name(tv, dump)) for tk, tv in viewitems(vtype)) if isinstance(vtype, (FunctionType, BuiltinFunctionType)): if vtype.__name__ == "<lambda>": return _get_lambda_source_code(vtype, dump) else: return vtype.__name__ raise RuntimeError("Unexpected `vtype`: %r" % vtype)
def name(self, src=None): """Return string representing the name of this type.""" return "{%s}" % ", ".join("%s: %s" % (key, _get_type_name(ktype, src)) for key, ktype in viewitems(self._types))