Skip to content

Forward References under attrs classes extending Generic breaks mypy #5864

Closed
@tombo315

Description

@tombo315

System information:

$ python3 --version
Python 3.7.0
$ mypy --version
mypy 0.650+dev.0b61e5476520c6e2b8d0136fab645cb3414e412f

Minimal[-ish] example:

# mypy_break.py
import typing
from typing import Generic, Mapping, Union

import attr

T = typing.TypeVar('T', str, int)

@attr.s
class Klass(Generic[T], object):
    modified = attr.ib(type=Mapping[T, 'UnionAlias'])


UnionAlias = Union[str, int]
$ mypy mypy_break.py --show-traceback
mypy_break.py:7: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.650+dev.0b61e5476520c6e2b8d0136fab645cb3414e412f
Traceback (most recent call last):
  File "/usr/local/bin/mypy", line 11, in <module>
    sys.exit(console_entry())
  File "/usr/local/lib/python3.7/site-packages/mypy/__main__.py", line 7, in console_entry
    main(None)
  File "/usr/local/lib/python3.7/site-packages/mypy/main.py", line 92, in main
    res = build.build(sources, options, None, flush_errors, fscache)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 155, in build
    result = _build(sources, options, alt_lib_path, flush_errors, fscache)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 204, in _build
    graph = dispatch(sources, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2172, in dispatch
    process_graph(graph, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2469, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2592, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 1730, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 282, in check_first_pass
    self.accept(d)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 393, in accept
    stmt.accept(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/nodes.py", line 845, in accept
    return visitor.visit_class_def(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 1536, in visit_class_def
    self.accept(defn.defs)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 393, in accept
    stmt.accept(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/nodes.py", line 910, in accept
    return visitor.visit_block(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 1688, in visit_block
    self.accept(s)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 393, in accept
    stmt.accept(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/nodes.py", line 608, in accept
    return visitor.visit_func_def(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 704, in visit_func_def
    self._visit_func_def(defn)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 708, in _visit_func_def
    self.check_func_item(defn, name=defn.name())
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 770, in check_func_item
    self.check_func_def(defn, typ, name)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 787, in check_func_def
    for item, typ in self.expand_typevars(defn, typ):
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 1280, in expand_typevars
    result.append((expand_func(defn, mapping), expanded))
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 3931, in expand_func
    ret = defn.accept(visitor)
  File "/usr/local/lib/python3.7/site-packages/mypy/nodes.py", line 608, in accept
    return visitor.visit_func_def(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/treetransform.py", line 106, in visit_func_def
    [self.copy_argument(arg) for arg in node.arguments],
  File "/usr/local/lib/python3.7/site-packages/mypy/treetransform.py", line 106, in <listcomp>
    [self.copy_argument(arg) for arg in node.arguments],
  File "/usr/local/lib/python3.7/site-packages/mypy/treetransform.py", line 80, in copy_argument
    self.visit_var(argument.variable),
  File "/usr/local/lib/python3.7/site-packages/mypy/treetransform.py", line 199, in visit_var
    new = Var(node.name(), self.optional_type(node.type))
  File "/usr/local/lib/python3.7/site-packages/mypy/treetransform.py", line 584, in optional_type
    return self.type(type)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 3942, in type
    return expand_type(type, self.map)
  File "/usr/local/lib/python3.7/site-packages/mypy/expandtype.py", line 16, in expand_type
    return typ.accept(ExpandTypeVisitor(env))
  File "/usr/local/lib/python3.7/site-packages/mypy/types.py", line 524, in accept
    return visitor.visit_instance(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/expandtype.py", line 83, in visit_instance
    args = self.expand_types(t.args)
  File "/usr/local/lib/python3.7/site-packages/mypy/expandtype.py", line 132, in expand_types
    a.append(t.accept(self))
  File "/usr/local/lib/python3.7/site-packages/mypy/types.py", line 1532, in accept
    return visitor.visit_forwardref_type(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/type_visitor.py", line 101, in visit_forwardref_type
    raise RuntimeError('Internal error: unresolved forward reference')
RuntimeError: Internal error: unresolved forward reference
mypy_break.py:7: : note: use --pdb to drop into pdb

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions