Skip to content

Mypy 0.660 crash under python 3.7 using typing.NamedTuple subclass #6221

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
emdash-ie opened this issue Jan 18, 2019 · 4 comments
Closed

Mypy 0.660 crash under python 3.7 using typing.NamedTuple subclass #6221

emdash-ie opened this issue Jan 18, 2019 · 4 comments

Comments

@emdash-ie
Copy link

I’m using mypy 0.660 with python 3.7 and it crashes on the following code. Stopping the class from inheriting from NamedTuple prevents the crash.

from typing import Any, TypeVar, Callable, Optional, Dict, NamedTuple, Type
from datetime import datetime


T = TypeVar("T", bound="Crash")

class Crash(NamedTuple):
    first: str

    @classmethod
    def from_my_json(cls: Type[T], j: Dict[str, Any]) -> T:
        return cls(
            scheduled = omap(lambda s: datetime.fromisoformat(s), j["scheduled"]),
            actual_or_prediction = omap(lambda s: datetime.fromisoformat(s), j["actual_or_prediction"]),
            service_mode = j["service_mode"],
            type = j["type"],
            direction_text = j["direction_text"],
        )

A = TypeVar("A")
B = TypeVar("B")


def omap(f: Callable[[A], B], x: Optional[A]) -> Optional[B]:
    return None if x is None else f(x)

Traceback:

crash.py:11: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.660
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 91, in main
    res = build.build(sources, options, None, flush_errors, fscache)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 157, in build
    result = _build(sources, options, alt_lib_path, flush_errors, fscache)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 212, in _build
    graph = dispatch(sources, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2246, in dispatch
    process_graph(graph, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2544, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 2659, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/usr/local/lib/python3.7/site-packages/mypy/build.py", line 1803, 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 851, 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 916, in accept
    return visitor.visit_block(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 1700, 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 694, in accept
    return visitor.visit_decorator(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 3028, in visit_decorator
    self.check_func_item(e.func, name=e.func.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 931, in check_func_def
    self.accept(item.body)
  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 916, in accept
    return visitor.visit_block(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 1700, 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 1049, in accept
    return visitor.visit_return_stmt(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 2637, in visit_return_stmt
    self.check_return_stmt(s)
  File "/usr/local/lib/python3.7/site-packages/mypy/checker.py", line 2670, in check_return_stmt
    allow_none_return=allow_none_func_call)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 3181, in accept
    typ = node.accept(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/nodes.py", line 1448, in accept
    return visitor.visit_call_expr(self)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 244, in visit_call_expr
    return self.visit_call_expr_inner(e, allow_none_return=allow_none_return)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 314, in visit_call_expr_inner
    ret_type = self.check_call_expr_with_callee_type(callee_type, e, fullname, object_type)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 658, in check_call_expr_with_callee_type
    object_type=object_type)[0]
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 717, in check_call
    callable_node, arg_messages)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 695, in check_call
    object_type)
  File "/usr/local/lib/python3.7/site-packages/mypy/checkexpr.py", line 749, in check_callable_call
    if (callee.is_type_obj() and callee.type_object().is_abstract
  File "/usr/local/lib/python3.7/site-packages/mypy/types.py", line 925, in type_object
    assert isinstance(ret, Instance)
AssertionError: 
crash.py:11: : note: use --pdb to drop into pdb
@emdash-ie
Copy link
Author

Changing from a NamedTuple subclass to a dataclass fixes the problem and provides me with a workaround.

@ilevkivskyi
Copy link
Member

This is actually a duplicate of #5996 (already high priority).

@emdash-ie
Copy link
Author

Sorry, didn’t find that when I looked for existing issues!

@ilevkivskyi
Copy link
Member

NP, thanks for reporting!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants