Skip to content

Internal error aliasing a typevar within a function #2530

Closed
@TRManderson

Description

@TRManderson

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'

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions