Description
Bug Report
I'm observing nondeterminism in MyPy runs on one of my programs. Sometimes, it accepts a file, sometimes it doesn't. Once it has accepted a file it seems to cache this solution, and I need to wipe .mypy_cache
to be able to reproduce the random behavior again.
To Reproduce
Download and extract the following archive (repro.tar.gz), which contains stubs from a library I am developing along with a test.py
file to be checked.
This is output from an actual run on my end:
$ mypy test.py
test.py:74: error: Incompatible types in assignment (expression has type "object", variable has type "Array3f") [assignment]
Found 1 error in 1 file (checked 1 source file)
$ mypy test.py
Success: no issues found in 1 source file
Details on setup: mypy 1.8.0 (compiled: yes), Python 3.12.2, on an Apple M1 laptop (macOS 16.6.2). The machine is and has been perfectly stable. That is to say: I don't expect cosmic rays or RAM corruption to be responsible ;).
Activity
bzoracler commentedon Mar 3, 2024
I'm not sure if this example reveals the same underlying issue, and I don't know how to simplify it further, but this is also non-deterministic across runs with
--no-incremental
; see mypy Playground.Tried on both 1.8.0 and master on the playground. The output is non-deterministically one of the following:
hauntsaninja commentedon Mar 7, 2024
Thanks for the repros! I haven't yet looked in wjakob's but bzoracler's non-determinism seems to be coming from
mypy.solve.solve_with_dependent
/mypy.solve.solve_one
. The lowers, uppers produced insolve_with_dependent
are sets. The order they are iterated insolve_one
determines which result you get.Slightly more minimised version:
hauntsaninja commentedon Mar 7, 2024
Hmm maybe issue is non-commutativity in join_types
hauntsaninja commentedon Mar 7, 2024
I think something like this could fix:
wjakob commentedon Mar 11, 2024
@hauntsaninja I applied your patch. It unfortunately does not fix the issue, the type checker fails roughly ~1/3-1/2 of the time.
hauntsaninja commentedon Mar 12, 2024
Yeah, I haven't looked at your repro yet, possibly it could be an entirely different thing from bzoracler's
Fix nondeterministic type checking involving noncommutative join
type: ignore
comment #18125hauntsaninja commentedon May 26, 2025
Okay, had some time for mypy today.
#19147 fixes wjakob issue
#18402 fixes bzoracler issue
Fix nondeterministic type checking caused by nonassociativity of joins (
wjakob commentedon May 28, 2025
Thank you!
Fix nondeterministic type checking by making join with explicit Proto…