Skip to content

TypeError: mypy.types.Type or None object expected; got str #2753

@BMourguesFieldbox

Description

@BMourguesFieldbox

Bug report

Repo to reproduce here : https://github.com/BMourguesFieldbox/mypy_bug
Install dependencies, and run mypy --config-file mypy.ini mre/views.py from the mypy_bug directory.

Files of interest:

Custom manager in models.py
Annotation defined in annotations.py
and usage in views.py

What's wrong

Mypy django plugin raises when using WithAnnotations on a custom manager.

Traceback from MRE:

bug_report/mypy_bug/mypy_bug
└─$ mypy --config-file mypy.ini mre/views.py
mypy_bug/settings.py:28: error: Need type annotation for "ALLOWED_HOSTS" (hint: "ALLOWED_HOSTS: list[<type>] = ...")  [var-annotated]
mre/models.py:27: error: Incompatible types in assignment (expression has type "ManagerFromMyModelQueryset[Any]", variable has type "MyModelQueryset")  [assignment]
mre/views.py:3: error: INTERNAL ERROR -- Please try using mypy master on GitHub:
https://mypy.readthedocs.io/en/stable/common_issues.html#using-a-development-mypy-build
Please report a bug at https://github.com/python/mypy/issues
version: 1.17.0
Traceback (most recent call last):
  File "mypy/checkexpr.py", line 5960, in accept
  File "mypy/nodes.py", line 1952, in accept
  File "mypy/checkexpr.py", line 3326, in visit_member_expr
  File "mypy/checkexpr.py", line 3356, in analyze_ordinary_member_access
  File "mypy/checkmember.py", line 225, in analyze_member_access
  File "mypy/checkmember.py", line 242, in _analyze_member_access
  File "mypy/checkmember.py", line 382, in analyze_instance_member_access
  File "mypy/checkmember.py", line 564, in analyze_member_var_access
  File "mypy/checkmember.py", line 928, in analyze_var
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 294, in resolve_manager_method
    return resolve_manager_method_from_instance(instance=ctx.type, method_name=method_name, ctx=ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 267, in resolve_manager_method_from_instance
    method_type = get_method_type_from_dynamic_manager(api, method_name, instance)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 103, in get_method_type_from_dynamic_manager
    _process_dynamic_method(
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 155, in _process_dynamic_method
    ret_type = _replace_type_var(ret_type, base_that_has_method.self_type.fullname, queryset_instance)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 253, in _replace_type_var
    ret_type.args = tuple(_replace_type_var(item, to_replace, replace_by) for item in ret_type.args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 253, in <genexpr>
    ret_type.args = tuple(_replace_type_var(item, to_replace, replace_by) for item in ret_type.args)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 253, in _replace_type_var
    ret_type.args = tuple(_replace_type_var(item, to_replace, replace_by) for item in ret_type.args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 253, in <genexpr>
    ret_type.args = tuple(_replace_type_var(item, to_replace, replace_by) for item in ret_type.args)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 261, in _replace_type_var
    ret_type.items = [_replace_type_var(item, to_replace, replace_by) for item in ret_type.items]
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/bmourgues/Documents/Perso/bug_report/mypy_bug/.venv/lib/python3.12/site-packages/mypy_django_plugin/transformers/managers.py", line 249, in _replace_type_var
    ret_type = copy_type(get_proper_type(ret_type))
                         ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "mypy/types.py", line 3202, in get_proper_type
TypeError: mypy.types.Type or None object expected; got str
mre/views.py:3: : note: use --pdb to drop into pdb

How is that should be

I'd expect mypy to validate the type without error.

System information

  • OS: Ubuntu 22
  • python version: 3.12
  • django version: 5.2
  • mypy version: 1.16.1
  • django-stubs version: 5.2.2
  • django-stubs-ext version: 5.2.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions