Closed
Description
The following code will (correctly) not typecheck
from typing import TypeVar, List
class Example(object):
T = TypeVar("T")
@staticmethod
def example(t: T) -> List[T]:
x = [t] # type: List[T]
return x
test.py: note: In function "example":
test.py:6: error: Name 'T' is not defined
While it's possible to fix this by replacing the T
in List[T]
on line 6 with Example.T
, sometimes this is prohibitively long, so a user might want to alias said type. The following code (an example of the way I attempted aliasing) does not typecheck, but instead causes an internal error
from typing import TypeVar, List
class Example(object):
T = TypeVar("T")
@staticmethod
def example(t: T) -> List[T]:
# intentionally using a name other than T
# if I do use T, the result is the same
A = Example.T # line 8
x = [t] # type: List[A]
return x
test2.py: note: In function "example":
test2.py:9: error: Invalid type "A"
test2.py:8: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues
Traceback (most recent call last):
File "/usr/local/bin/mypy", line 6, in <module>
main(__file__)
File "/usr/local/lib/python3.5/dist-packages/mypy/main.py", line 41, in main
res = type_check_only(sources, bin_dir, options)
File "/usr/local/lib/python3.5/dist-packages/mypy/main.py", line 86, in type_check_only
options=options)
File "/usr/local/lib/python3.5/dist-packages/mypy/build.py", line 183, in build
dispatch(sources, manager)
File "/usr/local/lib/python3.5/dist-packages/mypy/build.py", line 1512, in dispatch
process_graph(graph, manager)
File "/usr/local/lib/python3.5/dist-packages/mypy/build.py", line 1692, in process_graph
process_stale_scc(graph, scc)
File "/usr/local/lib/python3.5/dist-packages/mypy/build.py", line 1771, in process_stale_scc
graph[id].type_check_first_pass()
File "/usr/local/lib/python3.5/dist-packages/mypy/build.py", line 1440, in type_check_first_pass
self.type_checker.check_first_pass()
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 174, in check_first_pass
self.accept(d)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 710, in accept
return visitor.visit_class_def(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 992, in visit_class_def
self.accept(defn.defs)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 771, in accept
return visitor.visit_block(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 1087, in visit_block
self.accept(s)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 597, in accept
return visitor.visit_decorator(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 1882, in visit_decorator
e.func.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 532, in accept
return visitor.visit_func_def(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 455, in visit_func_def
self.check_func_item(defn, name=defn.name())
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 518, in check_func_item
self.check_func_def(defn, typ, name)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 648, in check_func_def
self.accept(item.body)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 771, in accept
return visitor.visit_block(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 1087, in visit_block
self.accept(s)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 812, in accept
return visitor.visit_assignment_stmt(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 1095, in visit_assignment_stmt
self.check_assignment(s.lvalues[-1], s.rvalue, s.type is None, s.new_syntax)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 1161, in check_assignment
self.infer_variable_type(inferred, lvalue, self.accept(rvalue),
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 243, in accept
typ = node.accept(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/nodes.py", line 1202, in accept
return visitor.visit_member_expr(self)
File "/usr/local/lib/python3.5/dist-packages/mypy/checker.py", line 2054, in visit_member_expr
return self.expr_checker.visit_member_expr(e)
File "/usr/local/lib/python3.5/dist-packages/mypy/checkexpr.py", line 889, in visit_member_expr
result = self.analyze_ordinary_member_access(e, False)
File "/usr/local/lib/python3.5/dist-packages/mypy/checkexpr.py", line 904, in analyze_ordinary_member_access
original_type=original_type, chk=self.chk)
File "/usr/local/lib/python3.5/dist-packages/mypy/checkmember.py", line 142, in analyze_member_access
original_type=original_type)
File "/usr/local/lib/python3.5/dist-packages/mypy/checkmember.py", line 387, in analyze_class_attribute_access
return function_type(cast(FuncBase, node.node), builtin_type('builtins.function'))
File "/usr/local/lib/python3.5/dist-packages/mypy/types.py", line 1508, in function_type
if func.type:
AttributeError: 'TypeVarExpr' object has no attribute 'type'