Skip to content
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

False "type assignment error" when assigning an instance of Field class or classes extended from it. #17043

Open
Navid-Means-Promise opened this issue Mar 16, 2024 · 0 comments
Labels
bug mypy got something wrong

Comments

@Navid-Means-Promise
Copy link

Bug Report
1- As you must know, there is no standard way in python to use decorators for defining metadata for a field of a class and the only possible approach is assigning an instance of Field class from dataclass module to the field. I believe it's weird and irrational but anyway it's now the standard defined in pep 0557 so we expect mypy to follow it.

2- there was an issue that describe mypy raising a false "Incompatible types in assignment" error in the simple following code:

@dataclass
class A:
    x: Optional[List[int]] = field(default_factory=list) 

3- It seems Sometime around Oct 2023, the problem solved but unfortunately as I can see it solved just in an special condition. in the other words, just when using the field factory method.

To Reproduce
If you remove the # type: ignore[assignment] directive at the end of the following code:

@dataclass
class TerminalArgs(ArgsDataClass):
    tab_width: int = ArgField(
        cmd_name=["--tab-width"],
        type_parser=argtypes.positive_int,
        default=4,
        help="Number of spaces to use for a tab character.",
    )# type: ignore[assignment]

(Also ArgField is accessible here)

mypy will raise errors like:

terminaltexteffects/utils/terminal.py:21: error: Incompatible types in assignment (expression has type "ArgField", variable has type "int")  [assignment]
terminaltexteffects/utils/terminal.py:27: error: Incompatible types in assignment (expression has type "ArgField", variable has type "bool")  [assignment]
terminaltexteffects/utils/terminal.py:33: error: Incompatible types in assignment (expression has type "ArgField", variable has type "bool")  [assignment]
terminaltexteffects/utils/terminal.py:39: error: Incompatible types in assignment (expression has type "ArgField", variable has type "int")  [assignment]
terminaltexteffects/utils/terminal.py:45: error: Incompatible types in assignment (expression has type "ArgField", variable has type "float")  [assignment]

Expected Behavior
Allow assigning instance of Field class or instance of any class extended from it to fields of a dataclass.

Actual Behavior
Raising a false Incompatible types in assignment error

Your Environment

  • Mypy version used: mypy 1.9.0 (compiled: yes)
  • Mypy command-line flags: nothing special
  • Mypy configuration options from mypy.ini (and other config files): nothing special
  • Python version used: Python 3.11.2
@Navid-Means-Promise Navid-Means-Promise added the bug mypy got something wrong label Mar 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug mypy got something wrong
Projects
None yet
Development

No branches or pull requests

1 participant