python / mypy

Optional static typing for Python
https://www.mypy-lang.org/
Other
18.55k stars 2.84k forks source link

Possible bug in mypy when attribute and parameter share name on same line. #17177

Open btimby opened 7 months ago

btimby commented 7 months ago

Bug Report

(A clear and concise description of what the bug is.) I receive the following error from mypy:

api/serializers.py:10: error: Incompatible types in assignment (expression has type "CharField", base class "Field" defined the type as "Callable[..., Any] | str | None") [assignment]

The line in question is:

    source = serializers.CharField(source='source_name')

If I change the name of the attribute source to anything else, the error disappears. I think the attribute and parameter are getting mixed up. The error refers to the attribute assignment but reports the type Callable[..., Any] | str | None" which is correct for the parameter.

To Reproduce I created a project to display this behavior.

https://github.com/btimby/mypy-django-issue

# Ideally, a small sample program that demonstrates the problem.
# Or even better, a reproducible playground link https://mypy-play.net/ (use the "Gist" button)

Expected Behavior I don't think I should receive and error.

Actual Behavior I get an error.

Your Environment Ubuntu linux, python 3.10.2

[mypy]
plugins =
    mypy_django_plugin.main

strict_optional = True

[mypy.plugins.django-stubs]
django_settings_module = issue.settings
JelleZijlstra commented 7 months ago

Are you sure this isn't a bug in the Django plugin? It is developed independently from mypy itself.

btimby commented 7 months ago

No I am not. I don't think the problem is with the type annotation itself. It seems systemic to me, since renaming the attribute clears the error.