Skip to content

Commit 08ace25

Browse files
committed
Fix Arguments.arguments so it actually returns all arguments
Closes #2213. Arguments.arguments() has been modified so that it returns all arguments as it should (according to its own doc). A test case was also added to verify this.
1 parent a7ab088 commit 08ace25

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

astroid/nodes/node_classes.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,21 @@ def fromlineno(self) -> int:
780780
@cached_property
781781
def arguments(self):
782782
"""Get all the arguments for this node, including positional only and positional and keyword"""
783-
return list(itertools.chain((self.posonlyargs or ()), self.args or ()))
783+
retval = list(
784+
itertools.chain(
785+
(self.posonlyargs or ()), (self.args or ()), (self.kwonlyargs or ())
786+
)
787+
)
788+
if self.vararg:
789+
retval.append(
790+
Name(self.vararg, -1, -1, self, end_lineno=None, end_col_offset=None)
791+
)
792+
if self.kwarg:
793+
retval.append(
794+
Name(self.kwarg, -1, -1, self, end_lineno=None, end_col_offset=None)
795+
)
796+
797+
return retval
784798

785799
def format_args(self, *, skippable_names: set[str] | None = None) -> str:
786800
"""Get the arguments formatted as string.

tests/test_nodes.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
Uninferable,
2323
bases,
2424
builder,
25+
extract_node,
2526
nodes,
2627
parse,
2728
test_utils,
@@ -1943,3 +1944,28 @@ def test_str_repr_no_warnings(node):
19431944
test_node = node(**args)
19441945
str(test_node)
19451946
repr(test_node)
1947+
1948+
1949+
def test_arguments_contains_all():
1950+
"""Ensure Arguments.arguments actually returns all available arguments"""
1951+
1952+
def manually_get_args(arg_node) -> set:
1953+
names = set()
1954+
if arg_node.args.vararg:
1955+
names.add(arg_node.args.vararg)
1956+
if arg_node.args.kwarg:
1957+
names.add(arg_node.args.kwarg)
1958+
1959+
names.update([x.name for x in arg_node.args.args])
1960+
names.update([x.name for x in arg_node.args.kwonlyargs])
1961+
1962+
return names
1963+
1964+
node = extract_node("""def a(fruit: str, *args, b=None, c=None, **kwargs): ...""")
1965+
assert manually_get_args(node) == {x.name for x in node.args.arguments}
1966+
1967+
node = extract_node("""def a(mango: int, b="banana", c=None, **kwargs): ...""")
1968+
assert manually_get_args(node) == {x.name for x in node.args.arguments}
1969+
1970+
node = extract_node("""def a(self, num = 10, *args): ...""")
1971+
assert manually_get_args(node) == {x.name for x in node.args.arguments}

0 commit comments

Comments
 (0)