diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 666482e7..054d287e 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -163,7 +163,8 @@ class Script(object): # Allow access on _definition here, because it's a # public API and we don't want to make the internal # Name object public. - completions.append((p._definition.get_name(), p)) + if p._definition.stars == 0: # no *args/**kwargs + completions.append((p._definition.get_name(), p)) if not path and not isinstance(user_stmt, pr.Import): # add keywords diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 0fe5a14b..8225d859 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -567,7 +567,9 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)): if isinstance(d, pr.Param): try: return unicode(d.expression_list()[0].name) - except IndexError: + except (IndexError, AttributeError): + # IndexError for syntax error params + # AttributeError for *args/**kwargs pass return None elif isinstance(d, iterable.Generator): diff --git a/jedi/parser/representation.py b/jedi/parser/representation.py index 16e228b7..653b5d55 100644 --- a/jedi/parser/representation.py +++ b/jedi/parser/representation.py @@ -1181,6 +1181,13 @@ class Param(Statement): debug.warning("Multiple param names (%s).", n) return n[0] + @property + def stars(self): + exp = self.expression_list() + if exp and isinstance(exp[0], Operator): + return exp[0].string.count('*') + return 0 + class StatementElement(Simple): __slots__ = ('parent', 'next', 'execution') diff --git a/test/completion/named_param.py b/test/completion/named_param.py index 0ef351f9..571bb076 100644 --- a/test/completion/named_param.py +++ b/test/completion/named_param.py @@ -1,7 +1,8 @@ -""" named params: +""" +Named Params: >>> def a(abc): pass ... ->>> a(abc=3) # <- this stuff +>>> a(abc=3) # <- this stuff (abc) """ def a(abc): @@ -18,4 +19,4 @@ def a(*some_args, **some_kwargs): a(some_args) #? 13 [] -a(some_kwargs +a(some_kwargs)