summaryrefslogtreecommitdiff
path: root/node_classes.py
diff options
context:
space:
mode:
authorJulien Cristau <julien.cristau@logilab.fr>2013-07-18 22:57:13 +0200
committerJulien Cristau <julien.cristau@logilab.fr>2013-07-18 22:57:13 +0200
commitba2393d46474b72bb04b50dce629a9fa2bd6c7c5 (patch)
tree499d0d7df051006e30b85fff4cc9eae87e0a0294 /node_classes.py
parent5b0746a34b39a9c8d0fb00a1277fd844666a247d (diff)
downloadastroid-git-ba2393d46474b72bb04b50dce629a9fa2bd6c7c5.tar.gz
Add support for py3k's keyword only arguments
PEP 3102
Diffstat (limited to 'node_classes.py')
-rw-r--r--node_classes.py20
1 files changed, 18 insertions, 2 deletions
diff --git a/node_classes.py b/node_classes.py
index 8c6ad8aa..97bd9079 100644
--- a/node_classes.py
+++ b/node_classes.py
@@ -253,9 +253,11 @@ class Name(LookupMixIn, NodeNG):
class Arguments(NodeNG, AssignTypeMixin):
"""class representing an Arguments node"""
- _astroid_fields = ('args', 'defaults')
+ _astroid_fields = ('args', 'defaults', 'kwonlyargs', 'kw_defaults')
args = None
defaults = None
+ kwonlyargs = None
+ kw_defaults = None
def __init__(self, vararg=None, kwarg=None):
self.vararg = vararg
@@ -275,6 +277,10 @@ class Arguments(NodeNG, AssignTypeMixin):
result.append('*%s' % self.vararg)
if self.kwarg:
result.append('**%s' % self.kwarg)
+ if self.kwonlyargs:
+ if not self.vararg:
+ result.append('*')
+ result.append(_format_args(self.kwonlyargs, self.kw_defaults))
return ', '.join(result)
def default_value(self, argname):
@@ -287,6 +293,9 @@ class Arguments(NodeNG, AssignTypeMixin):
idx = i - (len(self.args) - len(self.defaults))
if idx >= 0:
return self.defaults[idx]
+ i = _find_arg(argname, self.kwonlyargs)[0]
+ if i is not None and self.kw_defaults[i] is not None:
+ return self.kw_defaults[i]
raise NoDefault()
def is_argument(self, name):
@@ -303,6 +312,12 @@ class Arguments(NodeNG, AssignTypeMixin):
return _find_arg(argname, self.args, rec)
return None, None
+ def get_children(self):
+ """override get_children to skip over None elements in kw_defaults"""
+ for child in super(Arguments, self).get_children():
+ if child is not None:
+ yield child
+
def _find_arg(argname, args, rec=False):
for i, arg in enumerate(args):
@@ -328,7 +343,8 @@ def _format_args(args, defaults=None):
else:
values.append(arg.name)
if defaults is not None and i >= default_offset:
- values[-1] += '=' + defaults[i-default_offset].as_string()
+ if defaults[i-default_offset] is not None:
+ values[-1] += '=' + defaults[i-default_offset].as_string()
return ', '.join(values)