diff options
author | Julien Cristau <julien.cristau@logilab.fr> | 2013-07-18 22:57:13 +0200 |
---|---|---|
committer | Julien Cristau <julien.cristau@logilab.fr> | 2013-07-18 22:57:13 +0200 |
commit | ba2393d46474b72bb04b50dce629a9fa2bd6c7c5 (patch) | |
tree | 499d0d7df051006e30b85fff4cc9eae87e0a0294 /node_classes.py | |
parent | 5b0746a34b39a9c8d0fb00a1277fd844666a247d (diff) | |
download | astroid-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.py | 20 |
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) |