def build_positional_args(self, candidate, callsite):
"""Attempt to convert the positional and keyword args supplied at
the given callsite to the positional args expected by the candidate
funcdef.
Return a list of ast.Node instances, or raise ValueError if it
can't be done.
"""
if len(callsite.args) > len(candidate.args.args):
raise ValueError('too many positional arguments')
slots = {}
for idx, arg in enumerate(callsite.args):
slots[idx] = arg
for actual_kwarg in get_keywords(callsite):
idx = locate_kwarg(candidate, actual_kwarg.arg)
if idx in slots:
raise ValueError('positional slot %i already filled' % idx)
slots[idx] = actual_kwarg.value
actual_pos_args = []
for idx in range(len(candidate.args.args)):
if idx not in slots:
raise ValueError('argument %i not filled' % idx)
actual_pos_args.append(slots[idx])
return actual_pos_args
评论列表
文章目录