diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 92b01e90..2aed05b0 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -347,7 +347,10 @@ class BaseDefinition(object): # Just take the first one here, not optimal, but currently # there's no better solution. inferred = names[0].infer() - return get_param_names(next(iter(inferred))) + param_names = get_param_names(next(iter(inferred))) + if isinstance(context, er.ClassContext): + param_names = param_names[1:] + return param_names elif isinstance(context, compiled.CompiledObject): return context.get_param_names() return param_names diff --git a/test/test_api/test_call_signatures.py b/test/test_api/test_call_signatures.py index 9cba90f1..6f91bbd0 100644 --- a/test/test_api/test_call_signatures.py +++ b/test/test_api/test_call_signatures.py @@ -386,3 +386,37 @@ def test_lambda_params(): assert sig.index == 0 assert sig.name == '' assert [p.name for p in sig.params] == ['x'] + + +def test_class_creation(): + code = dedent('''\ + class X(): + def __init__(self, foo, bar): + self.foo = foo + ''') + sig, = Script(code + 'X(').call_signatures() + assert sig.index == 0 + assert sig.name == 'X' + assert [p.name for p in sig.params] == ['foo', 'bar'] + + sig, = Script(code + 'X.__init__(').call_signatures() + assert [p.name for p in sig.params] == ['self', 'foo', 'bar'] + sig, = Script(code + 'X().__init__(').call_signatures() + assert [p.name for p in sig.params] == ['foo', 'bar'] + + +def test_call_magic_method(): + code = dedent('''\ + class X(): + def __call__(self, baz): + pass + ''') + sig, = Script(code + 'X()(').call_signatures() + assert sig.index == 0 + assert sig.name == 'X' + assert [p.name for p in sig.params] == ['baz'] + + sig, = Script(code + 'X.__call__(').call_signatures() + assert [p.name for p in sig.params] == ['self', 'baz'] + sig, = Script(code + 'X().__call__(').call_signatures() + assert [p.name for p in sig.params] == ['baz']