在查看谷歌API类时发现这个函数,发现有问题,先上原函数:
1 def ValidateTypes(vars_tpl): 2 """Checks that each variable in a set of variables is the correct type. 3 4 Args: 5 vars_tpl: A tuple containing a set of variables to check. 6 7 Raises: 8 ValidationError: The given object was not one of the given accepted types. 9 """ 10 for var, var_types in vars_tpl: 11 if not isinstance(var_types, tuple): 12 var_types = (var_types,) 13 for var_type in var_types: 14 if isinstance(var, var_type): 15 return 16 msg = ('The \'%s\' is of type %s, expecting one of %s.' 17 % (var, type(var), var_types)) 18 raise ValidationError(msg) 19 20 21 d = {'d':1} 22 e = (1,2,3) 23 ValidateTypes(((d, dict), (e, list)))
代码通过验证,本来e是tuple,用来验证的类是list,应该抛错才对,因为15行那里用了return返回,所以后面的验证不再进行。
修改后的函数如下:
1 def ValidateTypes(vars_tpl): 2 """Checks that each variable in a set of variables is the correct type. 3 4 Args: 5 vars_tpl: A tuple containing a set of variables to check. 6 7 Raises: 8 ValidationError: The given object was not one of the given accepted types. 9 """ 10 if not isinstance(vars_tpl, tuple): 11 raise ValidationError("vars_tpl argument must be tuple") 12 for var, var_types in vars_tpl: 13 if not isinstance(var_types, tuple): 14 var_types = (var_types,) 15 msg = ('The \'%s\' is of type %s, expecting one of %s.' 16 % (var, type(var), var_types)) 17 18 for var_type in var_types: 19 if not isinstance(var, var_type): 20 raise ValidationError(msg)
能正确地抛出异常:
这个函数非常灵活,以后项目中能用上的地方非常多,呵呵~