Skip to content

Mypy crashes on @classmethod #4575

Closed
Closed

Description

@efimerdlerkravitz

Hello,

While running mypy it crashed, I'm attaching all details.

Code that crashes:

from dateutil.parser import parse
from utils.general_utils import verify_meta
from io import StringIO
...

class Details(NamedTuple):
    token: Optional[str] = None
    version: Optional[str] = None
    last1: Optional[datetime.datetime] = None
    loc1: Optional[Decimal] = None
    loc2: Optional[Decimal] = None
    last2: Optional[datetime] = None

    @classmethod <-- Crashes here --------------------------
    def from_stream(cls, stream: StringIO) -> 'Details':
        details_json = json.load(stream)
        verify_meta(details_json)

        token = details_json.get('token', None)
        version = details_json.get('version', None)
        last1 = details_json.get('last1', None)
        loc1 = details_json.get('loc1', None)
        loc2 = details_json.get('loc2', None)
        last2 = details_json.get('last2', None)

        return DeviceDetailsMessage(token, version, last1,
                                    Decimal(loc1) if loc1 else None,
                                    Decimal(loc2) if loc2 else None,
                                    parse(last2) if last2 else None)
  • What are the versions of mypy and Python you are using?
    mypy - 0.56, Python - 3.6

  • What are the mypy flags you are using? (For example --strict-optional)
    mypy --show-traceback --ignore-missing-imports --python-version 3.6 .

  • If mypy crashed with a traceback, please paste
    the full traceback below.

13:01 $ mypy --show-traceback --ignore-missing-imports --python-version 3.6 .
./profiles/file_process.py:29: error: INTERNAL ERROR -- please report a bug at https://github.com/python/mypy/issues version: 0.560
Traceback (most recent call last):
  File "/Users/code/source/env_env/bin/mypy", line 11, in <module>
    sys.exit(console_entry())
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/__main__.py", line 7, in console_entry
    main(None)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/main.py", line 66, in main
    res = type_check_only(sources, bin_dir, options)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/main.py", line 119, in type_check_only
    options=options)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/build.py", line 218, in build
    graph = dispatch(sources, manager)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/build.py", line 1997, in dispatch
    process_graph(graph, manager)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/build.py", line 2299, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/build.py", line 2467, in process_stale_scc
    graph[id].semantic_analysis()
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/build.py", line 1855, in semantic_analysis
    self.manager.semantic_analyzer.visit_file(self.tree, self.xpath, self.options, patches)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 287, in visit_file
    self.accept(d)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 3861, in accept
    node.accept(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/nodes.py", line 696, in accept
    return visitor.visit_class_def(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 666, in visit_class_def
    defn.defs.accept(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/nodes.py", line 756, in accept
    return visitor.visit_block(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 1610, in visit_block
    self.accept(s)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 3861, in accept
    node.accept(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/nodes.py", line 573, in accept
    return visitor.visit_decorator(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 2933, in visit_decorator
    dec.func.accept(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/nodes.py", line 497, in accept
    return visitor.visit_func_def(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 386, in visit_func_def
    self.prepare_method_signature(defn, self.type)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 438, in prepare_method_signature
    leading_type = self.class_type(info)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/semanal.py", line 1234, in class_type
    leading_type = checkmember.type_object_type(info, self.builtin_type)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/checkmember.py", line 543, in type_object_type
    return type_object_type_from_function(init_method, info, fallback)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/checkmember.py", line 548, in type_object_type_from_function
    signature = bind_self(function_type(init_or_new, fallback))
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/checkmember.py", line 682, in bind_self
    arg_types = [expand(x) for x in func.arg_types[1:]]
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/checkmember.py", line 682, in <listcomp>
    arg_types = [expand(x) for x in func.arg_types[1:]]
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/checkmember.py", line 680, in expand
    return expand_type(target, {func.variables[0].id: typearg})
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/expandtype.py", line 16, in expand_type
    return typ.accept(ExpandTypeVisitor(env))
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/types.py", line 1230, in accept
    return visitor.visit_union_type(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/expandtype.py", line 117, in visit_union_type
    return UnionType.make_simplified_union(self.expand_types(t.items), t.line, t.column)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/expandtype.py", line 132, in expand_types
    a.append(t.accept(self))
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/types.py", line 1415, in accept
    return visitor.visit_forwardref_type(self)
  File "/Users/code/source/env_env/lib/python3.6/site-packages/mypy/types.py", line 1500, in visit_forwardref_type
    raise RuntimeError('Internal error: unresolved forward reference')
RuntimeError: Internal error: unresolved forward reference
./profiles/file_process.py:29: : note: use --pdb to drop into pdb

Activity

  1. efimerdlerkravitz commented on Feb 15, 2018

    @efimerdlerkravitz
    Author

    Found out why
    last2: Optional[datetime] = None datetime is not the class, but the module, it should have been
    last2: Optional[datetime.datetime] = None

    In this case I believe you should't crash, but it's less critical.

  2. emmatyping commented on Feb 15, 2018

    @emmatyping
    Member

    Hm, it appears you didn't import datetime either? Or was that omitted accidentally?

  3. self-assigned this
    on Feb 15, 2018
  4. ilevkivskyi commented on Feb 15, 2018

    @ilevkivskyi
    Member

    Hm, actually it looks like a fault in separation of concerns between semantic analysis and type checking. The checkmember functions should not be called in semanal.py.

  5. removed their assignment
    on Feb 15, 2018
  6. efimerdlerkravitz commented on Feb 15, 2018

    @efimerdlerkravitz
    Author

    @ethanhs that was omitted accidentally

  7. changed the title [-]Mypy crahses on @classmethod[/-] [+]Mypy crashes on @classmethod[/+] on Mar 21, 2018
  8. msullivan commented on Sep 19, 2018

    @msullivan
    Collaborator

    This appears to be fixed by 0.630.
    (The checkmember calls in semanal are still there, but I'm about to put up a PR that removes that.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions