Skip to content

Generic typeddict may corrupt the cache #14638

Closed

Description

@Synss

Bug Report

Using a generic TypedDict in another module may corrupt the cache. The cache doesn't recover and must be deleted.

To Reproduce

In module a, define a generic TypedDict,

# a.py
from typing import TypedDict, Generic, TypeVar

TValue = TypeVar("TValue")


class Dict(TypedDict, Generic[TValue]):
    value: TValue

in another module (say b) use this definition. The easiest way to trigger the bug is to have at least one typing error in the file (here g()).

# b.py
from a import Dict, TValue

def f(d: Dict[TValue]) -> TValue:
    return d["value"]


def g(d: Dict[TValue]) -> TValue:
    return d["x"]  # error

Now, type check b

$ mypy b.py
b.py:8: error: TypedDict "a.Dict[TValue]" has no key "x"  [typeddict-item]
Found 1 error in 1 file (checked 1 source file)

as expected.

However, running mypy b.py a second time reports an extra [type-arg] and a few more related errors as well,

$ mypy b.py
b.py:3: error: "Dict" expects no type arguments, but 1 given  [type-arg]
b.py:3: error: A function returning TypeVar should receive at least one argument containing the same TypeVar  [type-var]
b.py:4: error: Incompatible return value type (got "TValue", expected "TValue")  [return-value]
b.py:7: error: "Dict" expects no type arguments, but 1 given  [type-arg]
b.py:7: error: A function returning TypeVar should receive at least one argument containing the same TypeVar  [type-var]
b.py:8: error: TypedDict "a.Dict[TValue]" has no key "x"  [typeddict-item]
Found 6 errors in 1 file (checked 1 source file)

from then on, the only way to get rid of the [type-arg] error is to run with --no-increment or delete the cache. Here, I removed g(), leaving

# b.py [edited: deleted definition of g()]
from a import Dict, TValue

def f(d: Dict[TValue]) -> TValue:
    return d["value"]

and

$ mypy b.py
b.py:3: error: "Dict" expects no type arguments, but 1 given  [type-arg]
b.py:3: error: A function returning TypeVar should receive at least one argument containing the same TypeVar  [type-var]
b.py:4: error: Incompatible return value type (got "TValue", expected "TValue")  [return-value]
Found 3 errors in 1 file (checked 1 source file)

but

$ mypy --no-increment b.py
Success: no issues found in 1 source file

Expected Behavior

No difference between mypy, mypy --no-increment and the generic TypedDict do not corrupt the cache.

Actual Behavior

mypy reports false positives

b.py:3: error: "Dict" expects no type arguments, but 1 given  [type-arg]
b.py:3: error: A function returning TypeVar should receive at least one argument containing the same TypeVar  [type-var]
b.py:4: error: Incompatible return value type (got "TValue", expected "TValue")  [return-value]

Your Environment

  • Mypy version used: 0.991, 1.0.0, master
  • Mypy command-line flags: mypy vs. mypy --no-increment
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.11 or importing TypedDict from mypy_extensions on Python 3.10.

I could also reproduce that under Linux (Ubuntu 22.04) and MacOS (M1---Python installed via MacPorts).

Activity

  1. added
    bugmypy got something wrong
    on Feb 7, 2023
  2. added a commit that references this issue on Feb 14, 2023
    ec511c6
  3. added a commit that references this issue on Feb 14, 2023
    510d717
  4. added a commit that references this issue on Feb 23, 2023
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