Skip to content

Use of built-in open() causes crash if file named io.py #10990

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
lillekemiker opened this issue Aug 18, 2021 · 3 comments
Closed

Use of built-in open() causes crash if file named io.py #10990

lillekemiker opened this issue Aug 18, 2021 · 3 comments
Labels

Comments

@lillekemiker
Copy link

Crash Report

Running mypy on a file named io.py that uses the built-in open() function causes and internal error to occur.

Traceback

utils/io.py:2: error: INTERNAL ERROR -- Please try using mypy master on Github:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 0.910
Traceback (most recent call last):
  File "/Users/martinkristiansen/.pyenv/versions/tmp-delete/bin/mypy", line 8, in <module>
    sys.exit(console_entry())
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/__main__.py", line 11, in console_entry
    main(None, sys.stdout, sys.stderr)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/main.py", line 87, in main
    res, messages, blockers = run_build(sources, options, fscache, t0, stdout, stderr)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/main.py", line 165, in run_build
    res = build.build(sources, options, None, flush_errors, fscache, stdout, stderr)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 179, in build
    result = _build(
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 254, in _build
    graph = dispatch(sources, manager, stdout)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 2697, in dispatch
    process_graph(graph, manager)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 3021, in process_graph
    process_stale_scc(graph, scc, manager)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 3119, in process_stale_scc
    graph[id].type_check_first_pass()
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/build.py", line 2165, in type_check_first_pass
    self.type_checker().check_first_pass()
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 294, in check_first_pass
    self.accept(d)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/nodes.py", line 687, in accept
    return visitor.visit_func_def(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 726, in visit_func_def
    self._visit_func_def(defn)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 730, in _visit_func_def
    self.check_func_item(defn, name=defn.name)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 792, in check_func_item
    self.check_func_def(defn, typ, name)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 975, in check_func_def
    self.accept(item.body)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/nodes.py", line 1015, in accept
    return visitor.visit_block(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 1975, in visit_block
    self.accept(s)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 401, in accept
    stmt.accept(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/nodes.py", line 1268, in accept
    return visitor.visit_with_stmt(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 3638, in visit_with_stmt
    exit_ret_type = self.check_with_item(expr, target, s.unanalyzed_type is None)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checker.py", line 3693, in check_with_item
    ctx = echk.accept(expr)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 3911, in accept
    typ = node.accept(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/nodes.py", line 1558, in accept
    return visitor.visit_call_expr(self)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 271, in visit_call_expr
    return self.visit_call_expr_inner(e, allow_none_return=allow_none_return)
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 353, in visit_call_expr_inner
    ret_type = self.check_call_expr_with_callee_type(callee_type, e, fullname,
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 858, in check_call_expr_with_callee_type
    return self.check_call(callee_type, e.args, e.arg_kinds, e,
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 921, in check_call
    return self.check_overload_call(callee, args, arg_kinds, arg_names, callable_name,
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 1578, in check_overload_call
    inferred_result = self.infer_overload_return_type(plausible_targets, args, arg_types,
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 1721, in infer_overload_return_type
    ret_type, infer_type = self.check_call(
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 917, in check_call
    return self.check_callable_call(callee, args, arg_kinds, context, arg_names,
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 1029, in check_callable_call
    new_ret_type = self.apply_function_plugin(
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/checkexpr.py", line 729, in apply_function_plugin
    return callback(
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/plugins/default.py", line 126, in open_callback
    return _analyze_open_signature(
  File "/Users/martinkristiansen/.pyenv/versions/3.8.8/envs/tmp-delete/lib/python3.8/site-packages/mypy/plugins/default.py", line 168, in _analyze_open_signature
    assert isinstance(default_return_type, Instance)  # type: ignore
AssertionError: 
utils/io.py:2: : note: use --pdb to drop into pdb

To Reproduce

Minimal working (crashing) example:

def export_file(src: str) -> str:
    with open(src) as f:
        data = f.read()
    return data

Save above to a file named io.py and run mypy on the file.
If the file is named something else, the error goes away.

Your Environment

  • Mypy version used: 0.910 and current master (2105532)
  • Mypy command-line flags: None
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: 3.8.8
  • Operating system and version: macOS 11.4

Minimal pyenv virtual environment used:

mypy==0.910
mypy-extensions==0.4.3
toml==0.10.2
typing-extensions==3.10.0.0
@JelleZijlstra
Copy link
Member

Shadowing the standard library is often going to cause issues. Mypy shouldn't crash, though.

@lillekemiker
Copy link
Author

Just to be clear, the original issue was observed in a repo where the io.py file was placed in a sub-namespace so there was no issue with namespace collisions.

@Michael0x2a
Copy link
Collaborator

This no longer repros -- looks like the crash was fixed by #9275, according to git-bisect.

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

No branches or pull requests

3 participants