diff --git a/jedi/evaluate/names.py b/jedi/evaluate/names.py index e1fd83cc..22b9db79 100644 --- a/jedi/evaluate/names.py +++ b/jedi/evaluate/names.py @@ -183,6 +183,11 @@ class ParamName(ParamNameInterface, AbstractTreeName): if tree_param.star_count == 2: # **kwargs return Parameter.VAR_KEYWORD + # Params starting with __ are an equivalent to positional only + # variables in typeshed. + if tree_param.name.value.startswith('__'): + return Parameter.POSITIONAL_ONLY + parent = tree_param.parent param_appeared = False for p in parent.children: @@ -200,7 +205,12 @@ class ParamName(ParamNameInterface, AbstractTreeName): return Parameter.POSITIONAL_OR_KEYWORD def to_string(self): - output = self._kind_string() + self.string_name + name = self.string_name + if name.startswith('__'): + # Params starting with __ are an equivalent to positional only + # variables in typeshed. + name = name[2:] + output = self._kind_string() + name param_node = self._get_param_node() if param_node.annotation is not None: output += ': ' + param_node.annotation.get_code(include_prefix=False) diff --git a/test/test_evaluate/test_signature.py b/test/test_evaluate/test_signature.py index e1f16aa7..bddd9983 100644 --- a/test/test_evaluate/test_signature.py +++ b/test/test_evaluate/test_signature.py @@ -50,3 +50,13 @@ def test_tree_signature(Script, environment, code, expected): sig, = Script(code).call_signatures() assert expected == sig._signature.to_string() + + +def test_pow_signature(Script): + # See github #1357 + sigs = Script('pow(').call_signatures() + strings = {sig._signature.to_string() for sig in sigs} + assert strings == {'pow(x: float, y: float, z: float, /) -> float', + 'pow(x: float, y: float, /) -> float', + 'pow(x: int, y: int, z: int, /) -> Any', + 'pow(x: int, y: int, /) -> Any'}