mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-06 22:14:27 +08:00
reorder var_args if named arguments are in front of *args.
This commit is contained in:
@@ -197,7 +197,7 @@ def _unpack_var_args(evaluator, var_args, func):
|
||||
argument_list.append((None, [helpers.FakeStatement([func.instance])]))
|
||||
|
||||
# `var_args` is typically an Array, and not a list.
|
||||
for stmt in var_args:
|
||||
for stmt in _reorder_var_args(var_args):
|
||||
if not isinstance(stmt, pr.Statement):
|
||||
if stmt is None:
|
||||
argument_list.append((None, []))
|
||||
@@ -260,6 +260,28 @@ def _unpack_var_args(evaluator, var_args, func):
|
||||
return argument_list
|
||||
|
||||
|
||||
def _reorder_var_args(var_args):
|
||||
"""
|
||||
Reordering var_args is necessary, because star args sometimes appear after
|
||||
named argument, but in the actual order it's prepended.
|
||||
"""
|
||||
named_index = None
|
||||
new_args = []
|
||||
for i, stmt in enumerate(var_args):
|
||||
if named_index is None and stmt.assignment_details:
|
||||
named_index = i
|
||||
|
||||
if named_index is not None:
|
||||
expression_list = stmt.expression_list()
|
||||
if expression_list and expression_list[0] == '*':
|
||||
new_args.insert(named_index, stmt)
|
||||
named_index += 1
|
||||
continue
|
||||
|
||||
new_args.append(stmt)
|
||||
return new_args
|
||||
|
||||
|
||||
def _iterate_star_args(evaluator, array, expression_list, func):
|
||||
from jedi.evaluate.representation import Instance
|
||||
if isinstance(array, iterable.Array):
|
||||
|
||||
@@ -32,6 +32,12 @@ nested_twice(2)
|
||||
#! 19 type-error-too-many-arguments
|
||||
nested_twice(2, 3, 4)
|
||||
|
||||
|
||||
# A named argument can be located before *args.
|
||||
def star_args_with_named(*args):
|
||||
return simple2(c='', *args)
|
||||
|
||||
star_args_with_named(1, 2)
|
||||
# -----------------
|
||||
# **kwargs
|
||||
# -----------------
|
||||
|
||||
Reference in New Issue
Block a user