From 0352c3250ae9ad69dd1de78c37fc29895f3121ed Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 30 Jul 2019 01:34:18 +0200 Subject: [PATCH] Fix signatures for __init__ calls when used with supers, fixes #1163 --- jedi/evaluate/context/klass.py | 8 ++++---- test/test_evaluate/test_signature.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate/context/klass.py b/jedi/evaluate/context/klass.py index b96e59bf..dacb1c49 100644 --- a/jedi/evaluate/context/klass.py +++ b/jedi/evaluate/context/klass.py @@ -222,6 +222,10 @@ class ClassMixin(object): next(instance_filters) yield next(instance_filters) + def get_signatures(self): + init_funcs = self.execute_evaluated().py__getattribute__('__init__') + return [sig.bind(self) for sig in init_funcs.get_signatures()] + def get_global_filter(self, until_position=None, origin_scope=None): return ParserTreeFilter( self.evaluator, @@ -314,10 +318,6 @@ class ClassContext(use_metaclass(CachedMetaClass, ClassMixin, FunctionAndClassBa )]) return ContextSet({self}) - def get_signatures(self): - init_funcs = self.py__getattribute__('__init__') - return [sig.bind(self) for sig in init_funcs.get_signatures()] - @plugin_manager.decorate() def get_metaclass_filters(self, metaclass): debug.dbg('Unprocessed metaclass %s', metaclass) diff --git a/test/test_evaluate/test_signature.py b/test/test_evaluate/test_signature.py index 3cd9cf59..76da4fee 100644 --- a/test/test_evaluate/test_signature.py +++ b/test/test_evaluate/test_signature.py @@ -108,9 +108,9 @@ def test_tree_signature(Script, environment, code, expected): ('full_redirect(1)', '*args, **kwargs'), # Classes / inheritance - ('full_redirect(C)', 'z, *c'), + ('full_redirect(C)', 'z, *, c'), ('full_redirect(C())', 'y'), - ('D', 'D(x, ly)'), + ('D', 'D(a, z, /)'), ('D()', 'D(x, y)'), ('D().foo', 'foo(a, *, bar, z, **kwargs)'), @@ -166,14 +166,14 @@ def test_nested_signatures(Script, environment, combination, expected, skip_pre_ return lambda *args, **kwargs: func1(1, 2, 3, 4, *args) + func2(a=3, x=1, y=1, **kwargs) class C: - def __init__(self, a, z, *c): ... + def __init__(self, a, z, *, c): ... def __call__(self, x, y): ... def foo(self, bar, z, **kwargs): ... class D(C): def __init__(self, *args): - super().foo(*args) + super().__init__(*args) def foo(self, a, **kwargs): super().foo(**kwargs)