From 3365d0763bf8c1bd1f79ae12a3e7a7345be45094 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 28 Apr 2026 02:25:18 +0200 Subject: [PATCH] Implement __new__ signatures, fixes #2073 --- jedi/inference/value/klass.py | 12 ++++++++++++ test/test_api/test_call_signatures.py | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/jedi/inference/value/klass.py b/jedi/inference/value/klass.py index 11c70fe2..5f4d690a 100644 --- a/jedi/inference/value/klass.py +++ b/jedi/inference/value/klass.py @@ -378,6 +378,18 @@ class ClassMixin: return sigs args = ValuesArguments([]) init_funcs = self.py__call__(args).py__getattribute__('__init__') + if len(init_funcs) == 1: + init = next(iter(init_funcs)) + try: + class_context = init.class_context + except AttributeError: + pass + else: + # In the case where we are on object.__init__, we try to use + # __new__. + if class_context.get_root_context().is_builtins_module() \ + and init.class_context.name.string_name == "object": + init_funcs = self.py__call__(args).py__getattribute__('__new__') dataclass_sigs = self._get_dataclass_transform_signatures() if dataclass_sigs: diff --git a/test/test_api/test_call_signatures.py b/test/test_api/test_call_signatures.py index a9a979bc..90fbc0f8 100644 --- a/test/test_api/test_call_signatures.py +++ b/test/test_api/test_call_signatures.py @@ -27,6 +27,17 @@ def test_valid_call(Script): assert_signature(Script, 'bool()', 'bool', column=5) +def test_dunder_new(Script): + # From #2073 + s = dedent("""\ + from typing import Self + class C: + def __new__(cls, b) -> Self: + pass + C( )""") + assert_signature(Script, s, 'C', 0, line=5, column=2) + + class TestSignatures(TestCase): @pytest.fixture(autouse=True) def init(self, Script):