| @@ -75,12 +75,12 @@ rel_fns = { | |||
| rel_strs = { | |||
| # scalar compare | |||
| Rel.EQ: "equal to {}", | |||
| Rel.NE: "not equal to {}", | |||
| Rel.LT: "less than {}", | |||
| Rel.LE: "less or equal to {}", | |||
| Rel.GT: "greater than {}", | |||
| Rel.GE: "greater or equal to {}", | |||
| Rel.EQ: "== {}", | |||
| Rel.NE: "!= {}", | |||
| Rel.LT: "< {}", | |||
| Rel.LE: "<= {}", | |||
| Rel.GT: "> {}", | |||
| Rel.GE: ">= {}", | |||
| # scalar range check | |||
| Rel.INC_NEITHER: "({}, {})", | |||
| Rel.INC_LEFT: "[{}, {})", | |||
| @@ -102,12 +102,16 @@ def check_number(arg_value, value, rel, arg_type=int, arg_name=None, prim_name=N | |||
| rel_fn = Rel.get_fns(rel) | |||
| type_mismatch = not isinstance(arg_value, arg_type) or isinstance(arg_value, bool) | |||
| type_except = TypeError if type_mismatch else ValueError | |||
| prim_name = f'in `{prim_name}`' if prim_name else '' | |||
| arg_name = f'`{arg_name}`' if arg_name else '' | |||
| if math.isinf(arg_value) or math.isnan(arg_value) or np.isinf(arg_value) or np.isnan(arg_value): | |||
| raise ValueError(f'{arg_name} {prim_name} must be legal value, but got `{arg_value}`.') | |||
| if type_mismatch or not rel_fn(arg_value, value): | |||
| rel_str = Rel.get_strs(rel).format(value) | |||
| arg_name = arg_name if arg_name else "parameter" | |||
| msg_prefix = f'For \'{prim_name}\' the' if prim_name else "The" | |||
| raise type_except(f'{msg_prefix} `{arg_name}` should be an {arg_type} and must {rel_str}, but got `{arg_value}`' | |||
| f' with type `{type(arg_value).__name__}`.') | |||
| raise type_except(f'{arg_name} {prim_name} should be an {type(arg_type).__name__} and must {rel_str}, ' | |||
| f'but got `{arg_value}` with type `{type(arg_value).__name__}`.') | |||
| return arg_value | |||
| @@ -123,7 +127,7 @@ def check_is_number(arg_value, arg_type, arg_name=None, prim_name=None): | |||
| prim_name = f'in \'{prim_name}\'' if prim_name else '' | |||
| arg_name = f'\'{prim_name}\'' if arg_name else 'Input value' | |||
| if isinstance(arg_value, arg_type) and not isinstance(arg_value, bool): | |||
| if math.isinf(arg_value) or math.isnan(arg_value): | |||
| if math.isinf(arg_value) or math.isnan(arg_value) or np.isinf(arg_value) or np.isnan(arg_value): | |||
| raise ValueError(f'{arg_name} {prim_name} must be legal float, but got `{arg_value}`.') | |||
| return arg_value | |||
| raise TypeError(f'{arg_name} {prim_name} must be float, but got `{type(arg_value).__name__}`') | |||
| @@ -137,14 +141,15 @@ def check_number_range(arg_value, lower_limit, upper_limit, rel, value_type, arg | |||
| - number = check_number_range(number, 0.0, 1.0, Rel.INC_NEITHER, "number", float) # number in [0.0, 1.0] | |||
| - number = check_number_range(number, 0, 1, Rel.INC_NEITHER, "number", int) # number in [0, 1] | |||
| """ | |||
| rel_fn = Rel.get_fns(rel) | |||
| prim_name = f'in `{prim_name}`' if prim_name else '' | |||
| arg_name = f'`{arg_name}`' if arg_name else '' | |||
| rel_fn = Rel.get_fns(rel) | |||
| type_mismatch = not isinstance(arg_value, (np.ndarray, np.generic, value_type)) or isinstance(arg_value, bool) | |||
| excp_cls = TypeError if type_mismatch else ValueError | |||
| if type_mismatch or not rel_fn(arg_value, lower_limit, upper_limit): | |||
| if type_mismatch: | |||
| raise TypeError(f'{arg_name} {prim_name} must be `{value_type}`, but got `{type(arg_value).__name__}`.') | |||
| if not rel_fn(arg_value, lower_limit, upper_limit): | |||
| rel_str = Rel.get_strs(rel).format(lower_limit, upper_limit) | |||
| raise excp_cls("{} {} should be in range of {}, but got {:.3f} with type {}.".format( | |||
| raise ValueError("{} {} should be in range of {}, but got {:.3e} with type `{}`.".format( | |||
| arg_name, prim_name, rel_str, arg_value, type(arg_value).__name__)) | |||
| return arg_value | |||