Closed
Description
I found two separate tracebacks playing with variations on the code from #3418:
from typing import Dict, NamedTuple
NameDict = Dict[str, 'NameInfo']
class NameInfo(NamedTuple):
ast: bool
def parse_ast(name_dict: NameDict) -> None:
if isinstance(name_dict[''], int):
pass
produces
Traceback (most recent call last):
File "/Users/jzijlstra-mpbt/py/venvs/venv36/bin/mypy", line 6, in <module>
exec(compile(open(__file__).read(), __file__, 'exec'))
File "/Users/jzijlstra-mpbt/py/mypy/scripts/mypy", line 6, in <module>
main(__file__)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 46, in main
res = type_check_only(sources, bin_dir, options)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 93, in type_check_only
options=options)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 188, in build
graph = dispatch(sources, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1595, in dispatch
process_graph(graph, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1838, in process_graph
process_stale_scc(graph, scc, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1937, in process_stale_scc
graph[id].type_check_first_pass()
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1510, in type_check_first_pass
self.type_checker.check_first_pass()
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 177, in check_first_pass
self.accept(d)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 565, in accept
return visitor.visit_func_def(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 510, in visit_func_def
self.check_func_item(defn, name=defn.name())
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 569, in check_func_item
self.check_func_def(defn, typ, name)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 718, in check_func_def
self.accept(item.body)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
return visitor.visit_block(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
self.accept(s)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 970, in accept
return visitor.visit_if_stmt(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1916, in visit_if_stmt
if_map, else_map = self.find_isinstance_check(e)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2477, in find_isinstance_check
return find_isinstance_check(n, self.type_map)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2731, in find_isinstance_check
return conditional_type_map(expr, vartype, type)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 2531, in conditional_type_map
and is_proper_subtype(current_type, proposed_type)):
File "/Users/jzijlstra-mpbt/py/mypy/mypy/subtypes.py", line 558, in is_proper_subtype
return left.accept(ProperSubtypeVisitor(right))
File "/Users/jzijlstra-mpbt/py/mypy/mypy/types.py", line 411, in accept
return visitor.visit_instance(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/subtypes.py", line 594, in visit_instance
for base in left.type.mro:
TypeError: 'NoneType' object is not iterable
typeshed_client/parser.py:9: note: use --pdb to drop into pdb
The other stack trace I haven't been able to minimize yet, but the traceback is
/Users/jzijlstra-mpbt/py/typeshed_client/typeshed_client/resolver.py:61: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.520-dev-38453c0ddfaa6660309f782b227bd40b8c4634ba-dirty
Traceback (most recent call last):
File "/Users/jzijlstra-mpbt/py/venvs/venv36/bin/mypy", line 6, in <module>
exec(compile(open(__file__).read(), __file__, 'exec'))
File "/Users/jzijlstra-mpbt/py/mypy/scripts/mypy", line 6, in <module>
main(__file__)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 46, in main
res = type_check_only(sources, bin_dir, options)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/main.py", line 93, in type_check_only
options=options)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 188, in build
graph = dispatch(sources, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1595, in dispatch
process_graph(graph, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1838, in process_graph
process_stale_scc(graph, scc, manager)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1937, in process_stale_scc
graph[id].type_check_first_pass()
File "/Users/jzijlstra-mpbt/py/mypy/mypy/build.py", line 1510, in type_check_first_pass
self.type_checker.check_first_pass()
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 177, in check_first_pass
self.accept(d)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 750, in accept
return visitor.visit_class_def(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1080, in visit_class_def
self.accept(defn.defs)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
return visitor.visit_block(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
self.accept(s)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 565, in accept
return visitor.visit_func_def(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 510, in visit_func_def
self.check_func_item(defn, name=defn.name())
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 569, in check_func_item
self.check_func_def(defn, typ, name)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 718, in check_func_def
self.accept(item.body)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 811, in accept
return visitor.visit_block(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1173, in visit_block
self.accept(s)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 264, in accept
stmt.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 970, in accept
return visitor.visit_if_stmt(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checker.py", line 1906, in visit_if_stmt
t = self.expr_checker.accept(e)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
typ = node.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1368, in accept
return visitor.visit_unary_expr(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1408, in visit_unary_expr
operand_type = self.accept(e.expr)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
typ = node.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1303, in accept
return visitor.visit_call_expr(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 201, in visit_call_expr
ret_type = self.check_call_expr_with_callee_type(callee_type, e)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 341, in check_call_expr_with_callee_type
e.arg_names, callable_node=e.callee)[0]
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 393, in check_call
callee, args, arg_kinds, formal_to_actual)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 538, in infer_arg_types_in_context2
res[ai] = self.accept(args[ai], callee.arg_types[i])
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 2058, in accept
typ = node.accept(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 1256, in accept
return visitor.visit_member_expr(self)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1012, in visit_member_expr
result = self.analyze_ordinary_member_access(e, False)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkexpr.py", line 1027, in analyze_ordinary_member_access
original_type=original_type, chk=self.chk)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 100, in analyze_member_access
original_type=original_type, chk=chk)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 222, in analyze_member_var_access
v = lookup_member_var_or_accessor(info, name, is_lvalue)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/checkmember.py", line 341, in lookup_member_var_or_accessor
node = info.get(name)
File "/Users/jzijlstra-mpbt/py/mypy/mypy/nodes.py", line 2033, in get
for cls in self.mro:
TypeError: 'NoneType' object is not iterable
/Users/jzijlstra-mpbt/py/typeshed_client/typeshed_client/resolver.py:61: note: use --pdb to drop into pdb
The crashing line is if not isinstance(info.ast, parser.ImportedName):
, where info
is a NameInfo
from the above example. I think it's likely the same underlying bug.