python / python/mypy

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

Aperta
#12,697 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug topic-daemon
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia eseguendo la riproduzione Python fornita con i comandi dmypy restart, check e recheck --update code.py ripetuti. Traccia il modo in cui dmypy recheck --update [file] gestisce scritture rapide e successive; il lavoro è completato quando l'aggiornamento immediato di code_3 non segnala errori senza richiedere un ritardo o una nuova scrittura.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
cli, tooling
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.