forked from VimPlug/jedi
pep0484 return type support
This commit is contained in:
@@ -6,7 +6,7 @@ as annotations in future python versions.
|
|||||||
|
|
||||||
The (initial / probably incomplete) implementation todo list for pep-0484:
|
The (initial / probably incomplete) implementation todo list for pep-0484:
|
||||||
v Function parameter annotations with builtin/custom type classes
|
v Function parameter annotations with builtin/custom type classes
|
||||||
x Function returntype annotations with builtin/custom type classes
|
v Function returntype annotations with builtin/custom type classes
|
||||||
x Function parameter annotations with strings (forward reference)
|
x Function parameter annotations with strings (forward reference)
|
||||||
x Function return type annotations with strings (forward reference)
|
x Function return type annotations with strings (forward reference)
|
||||||
x Local variable type hints
|
x Local variable type hints
|
||||||
|
|||||||
@@ -580,6 +580,21 @@ class Function(use_metaclass(CachedMetaClass, Wrapper)):
|
|||||||
else:
|
else:
|
||||||
return FunctionExecution(self._evaluator, self, params).get_return_types()
|
return FunctionExecution(self._evaluator, self, params).get_return_types()
|
||||||
|
|
||||||
|
@memoize_default()
|
||||||
|
def py__annotations__(self):
|
||||||
|
parser_func = self.base
|
||||||
|
return_annotation = parser_func.annotation()
|
||||||
|
if return_annotation:
|
||||||
|
dct = {'return': self._evaluator.eval_element(return_annotation)}
|
||||||
|
else:
|
||||||
|
dct = {}
|
||||||
|
for function_param in parser_func.params:
|
||||||
|
param_annotation = function_param.annotation()
|
||||||
|
if param_annotation:
|
||||||
|
dct[function_param.name.value] = \
|
||||||
|
self._evaluator.eval_element(param_annotation)
|
||||||
|
return dct
|
||||||
|
|
||||||
def py__class__(self):
|
def py__class__(self):
|
||||||
return compiled.get_special_object(self._evaluator, 'FUNCTION_CLASS')
|
return compiled.get_special_object(self._evaluator, 'FUNCTION_CLASS')
|
||||||
|
|
||||||
@@ -639,6 +654,9 @@ class FunctionExecution(Executed):
|
|||||||
else:
|
else:
|
||||||
returns = self.returns
|
returns = self.returns
|
||||||
types = set(docstrings.find_return_types(self._evaluator, func))
|
types = set(docstrings.find_return_types(self._evaluator, func))
|
||||||
|
annotations = func.py__annotations__().get("return", [])
|
||||||
|
types |= set(chain.from_iterable(
|
||||||
|
self._evaluator.execute(d) for d in annotations))
|
||||||
|
|
||||||
for r in returns:
|
for r in returns:
|
||||||
check = flow_analysis.break_check(self._evaluator, self, r)
|
check = flow_analysis.break_check(self._evaluator, self, r)
|
||||||
|
|||||||
@@ -866,7 +866,9 @@ class Function(ClassOrFunc):
|
|||||||
|
|
||||||
def annotation(self):
|
def annotation(self):
|
||||||
try:
|
try:
|
||||||
return self.children[6] # 6th element: def foo(...) -> bar
|
if self.children[3] == "->":
|
||||||
|
return self.children[4]
|
||||||
|
assert self.children[3] == ":"
|
||||||
except IndexError:
|
except IndexError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,69 @@
|
|||||||
|
|
||||||
# python >= 3.2
|
# python >= 3.2
|
||||||
|
|
||||||
# -----------------
|
|
||||||
# simple classes
|
class A():
|
||||||
# -----------------
|
pass
|
||||||
|
|
||||||
|
|
||||||
def typehints(a, b: str, c: int, d: int=4):
|
def function_parameters(a: A, b, c: str, d: int=4):
|
||||||
#?
|
#? A()
|
||||||
a
|
a
|
||||||
#? str()
|
#?
|
||||||
b
|
b
|
||||||
#? int()
|
#? str()
|
||||||
c
|
c
|
||||||
#? int()
|
#? int()
|
||||||
d
|
d
|
||||||
|
|
||||||
|
|
||||||
|
def return_unspecified():
|
||||||
|
pass
|
||||||
|
|
||||||
|
#?
|
||||||
|
return_unspecified()
|
||||||
|
|
||||||
|
|
||||||
|
def return_none() -> None:
|
||||||
|
"""
|
||||||
|
Return type None means the same as no return type as far as jedi
|
||||||
|
is concerned
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
#?
|
||||||
|
return_none()
|
||||||
|
|
||||||
|
|
||||||
|
def return_str() -> str:
|
||||||
|
pass
|
||||||
|
|
||||||
|
#? str()
|
||||||
|
return_str()
|
||||||
|
|
||||||
|
|
||||||
|
def return_custom_class() -> A:
|
||||||
|
pass
|
||||||
|
|
||||||
|
#? A()
|
||||||
|
return_custom_class()
|
||||||
|
|
||||||
|
|
||||||
|
def return_annotation_and_docstring() -> str:
|
||||||
|
"""
|
||||||
|
:rtype: int
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
#? str() int()
|
||||||
|
return_annotation_and_docstring()
|
||||||
|
|
||||||
|
|
||||||
|
def return_annotation_and_docstring_different() -> str:
|
||||||
|
"""
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
#? str()
|
||||||
|
return_annotation_and_docstring_different()
|
||||||
|
|||||||
Reference in New Issue
Block a user