Skip to content

Commit b0d2153

Browse files
committed
*args and **kwargs in find_argname, doc and style fixes, changelog
* find_argname now works when requesting vararg or kwargs. * Fixed some annotations in code and documentation. * Added changelog.
1 parent de7d819 commit b0d2153

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ What's New in astroid 3.0.0?
66
=============================
77
Release date: TBA
88

9+
* Return all existing arguments when calling ``Arguments.arguments()``. This also means ``find_argname`` will now
10+
use the whole list of arguments for its search.
11+
12+
Closes #2213
13+
914
* Add support for Python 3.12, including PEP 695 type parameter syntax.
1015

1116
Closes #2201

astroid/arguments.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,13 @@ def infer_argument(
181181

182182
positional = self.positional_arguments[: len(funcnode.args.args)]
183183
vararg = self.positional_arguments[len(funcnode.args.args) :]
184-
argindex = funcnode.args.find_argname(name)[0]
184+
185+
# preserving previous behavior, when vararg and kwarg were not included in find_argname results
186+
if name in [funcnode.args.vararg, funcnode.args.kwarg]:
187+
argindex = None
188+
else:
189+
argindex = funcnode.args.find_argname(name)[0]
190+
185191
kwonlyargs = {arg.name for arg in funcnode.args.kwonlyargs}
186192
kwargs = {
187193
key: value

astroid/nodes/node_classes.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -706,19 +706,19 @@ class Arguments(
706706
kwargannotation: NodeNG | None
707707
"""The type annotation for the variable length keyword arguments."""
708708

709-
vararg_node: NodeNG | None
709+
vararg_node: AssignName | None
710710
"""The node for variable length arguments"""
711711

712-
kwarg_node: NodeNG | None
713-
"""The node for keyword arguments"""
712+
kwarg_node: AssignName | None
713+
"""The node for variable keyword arguments"""
714714

715715
def __init__(
716716
self,
717717
vararg: str | None,
718718
kwarg: str | None,
719719
parent: NodeNG,
720-
vararg_node: NodeNG | None = None,
721-
kwarg_node: NodeNG | None = None,
720+
vararg_node: AssignName | None = None,
721+
kwarg_node: AssignName | None = None,
722722
) -> None:
723723
"""Almost all attributes can be None for living objects where introspection failed."""
724724
super().__init__(
@@ -803,7 +803,7 @@ def arguments(self):
803803
* Positional arguments
804804
* Keyword arguments
805805
* Variable arguments (.e.g *args)
806-
* Keyword only arguments (e.g **kwargs)
806+
* Variable keyword arguments (e.g **kwargs)
807807
"""
808808
retval = list(itertools.chain((self.posonlyargs or ()), (self.args or ())))
809809
if self.vararg_node:
@@ -970,11 +970,7 @@ def is_argument(self, name) -> bool:
970970
return True
971971
if name == self.kwarg:
972972
return True
973-
return (
974-
self.find_argname(name)[1] is not None
975-
or self.kwonlyargs
976-
and _find_arg(name, self.kwonlyargs)[1] is not None
977-
)
973+
return self.find_argname(name)[1] is not None
978974

979975
def find_argname(self, argname, rec=DEPRECATED_ARGUMENT_DEFAULT):
980976
"""Get the index and :class:`AssignName` node for given name.
@@ -993,7 +989,7 @@ def find_argname(self, argname, rec=DEPRECATED_ARGUMENT_DEFAULT):
993989
)
994990
if self.arguments:
995991
index, argument = _find_arg(argname, self.arguments)
996-
if argument and argument.name not in [self.vararg, self.kwarg]:
992+
if argument:
997993
return index, argument
998994
return None, None
999995

0 commit comments

Comments
 (0)