def _process_argument_signature(value, arg_names, static_env):
arg_types = []
if isinstance(value, ast.Dict):
keys, values = value.keys, value.values
n_keys = len(keys)
n_args = len(arg_names)
if n_keys != n_args:
raise _errors.TyError(
"Function specifies {0} arguments, "
"but function signature specifies {1} arguments."
.format(n_args, n_keys), value)
for key, value, arg_name in zip(keys, values, arg_names):
if not isinstance(key, ast.Name):
raise _errors.TyError(
"Argument name must be an identiifer.", key)
sig_arg_name = key.id
if sig_arg_name != arg_name:
raise _errors.TyError(
"Function specifies argument name {0}, but function "
"signature specifies argument name {1}."
.format(arg_name, key), key)
arg_types.append(static_env.eval_expr_ast(value))
elif isinstance(value, ast.Set):
elts = value.elts
n_elts = len(elts)
n_args = len(arg_names)
if n_elts != n_args:
raise _errors.TyError(
"Function specifies {0} arguments, but function"
"signature specifies {1} arguments."
.format(n_args, n_elts), value)
for elt in elts:
arg_types.append(static_env.eval_expr_ast(elt))
else:
raise _errors.TyError(
"Argument signature must have the form of either a set "
"or dict literal.", value)
return tuple(arg_types)
评论列表
文章目录