python / python/mypy

`dmypy recheck --update [file]` failed to detect very recent changes in [file]

Open
#12,697 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug topic-daemon
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Bug Report

Hi, I'm trying to implement an interactive type checking environment where a (deep learning-based) type inference agent needs to repeatedly make small changes to a given source file and query mypy to figure out if the changes introduce any type error. I'm using the dmypy recheck --update command to reduce the type checking time since I need these queries to be as fast as possible. However, it seems that this command would fail to detect very recent file changes and report outdated results. Is there a way to explicitly tell dmypy that it should recheck a given file?

To Reproduce

Run the following script

from pathlib import Path
import subprocess
import time

# no type error
code_1 = '''
from typing import Any
def fib(n: int) -> int:
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
'''

# incorrect return type
code_2 = '''
from typing import Any
def fib(n: int) -> str:
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
'''

# changed return type to Any, should not error
code_3 = '''
from typing import Any
def fib(n: int) -> Any:
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
'''

# this should be the dmypy path in the current virtual env
dmypy_path = '/home/jiayi/Projects/SPOT/.venv/bin/dmypy'

check_dir = Path("temp/type_check")
check_dir.mkdir(exist_ok=True, parents=True)
with open(check_dir / "code.py", "w") as f:
    f.write(code_1)
subprocess.run(['python', dmypy_path, 'restart', '--', '--follow-imports=skip'],cwd=check_dir)

print('---checking code_1---')
subprocess.run(['python', dmypy_path, 'check', '.'],cwd=check_dir)

with open(check_dir / "code.py", "w") as f:
    f.write(code_2)
print('---checking code_2---')
subprocess.run(['python', dmypy_path, 'recheck', "--update", "code.py"],cwd=check_dir)

with open(check_dir / "code.py", "w") as f:
    f.write(code_3)
print('---checking code_3---')
subprocess.run(['python', dmypy_path, 'recheck', "--update", "code.py"],cwd=check_dir)
print("test finished.")

print('---wait and check code_3 again---')
time.sleep(1.0)  # will not work if waiting time is shorter
with open(check_dir / "code.py", "w") as f:  # need this rewriting
    f.write(code_3)
subprocess.run(['python', dmypy_path, 'recheck', "--update", "code.py"],cwd=check_dir)
print("test finished.")

This produced the following result on my machine

Daemon stopped
Daemon started
---checking code_1---
Success: no issues found in 1 source file
---checking code_2---
code.py:5: error: Incompatible return value type (got "int", expected "str")
code.py:7: error: Incompatible return value type (got "int", expected "str")
Found 2 errors in 1 file (checked 2 source files)
---checking code_3---
code.py:5: error: Incompatible return value type (got "int", expected "str")
code.py:7: error: Incompatible return value type (got "int", expected "str")
Found 2 errors in 1 file (checked 2 source files)
test finished.
---wait and check code_3 again---
Success: no issues found in 2 source files
test finished.

Expected Behavior

The result for code_3 should contain no type error.

Actual Behavior

The result for code_3 without first waiting is incorrect and looks outdated (is the same as code_2).

(Write what happened.)

Your Environment

  • Mypy version used: 0.950
  • Mypy command-line flags:
  • Mypy configuration options from mypy.ini (and other config files): empty
  • Python version used: Python 3.10.4
  • Operating system and version: Ubuntu 18.04.6 LTS

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running the supplied Python reproduction with dmypy restart, check, and repeated recheck --update code.py commands. Trace how dmypy recheck --update [file] handles rapid successive writes; done means the immediate code_3 update reports no errors without requiring a delay or rewrite.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.