python / python/mypy

Mypy fails to type check function signature after plugin pass

Open
#18,166 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug topic-plugins
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Bug Report

I wrote a plugin to replace types, but Mypy fails to typecheck after my changes. I start off trying to fix the type error in this signature with a plugin:

def almost_id(a: str) -> str:
    return int(a)

almost_id("6")

with my plugin:

def replace_str(self, ctx: FunctionSigContext) -> FunctionLike:
        api = ctx.api

        new_signature = ctx.default_signature.copy_modified(
            ret_type=api.named_type('builtins.int')
        )

        un_anal = new_signature.definition.unanalyzed_type.copy_modified(
            ret_type = api.named_type('builtins.int')
        )

        new_signature.definition.unanalyzed_type = un_anal

        typ = new_signature.definition.type.copy_modified(
            ret_type = api.named_type('builtins.int')
        )

        new_signature.definition.type = typ

        return new_signature

I have tried going through the attrs of the functionsigcontext, api and the expr_checker but can't seem to find some other functionality to either:

  • force mypy to proceed with type checking
  • modify the existing type analysis or map
  • delay type checking until the plugin mods have been completed, something like defer() in the semantic analyzer.

To Reproduce
gist: https://gist.github.com/dibrinsofor/bddcbd2eedbb233b131bb1b8d562369a

mypy tests/str_int.py

Expected Behavior

I expect mypy to pass

Actual Behavior

tests/str_int.py:2: error: Incompatible return value type (got "int", expected "str")  [return-value]

even though printing the new signature returns:

def (a: builtins.str) -> builtins.int

Your Environment

  • Mypy version used: 1.14.0+dev.8c7db13f71098a6facea66ab165b6bc3ef688bdf
  • Mypy command-line flags: --show-traceback
  • Python version used: Python 3.11.5

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Run mypy tests/str_int.py using the gist reproduction and compare the reported error with the signature printed after replace_str. Trace how the FunctionSigContext result is consumed during semantic analysis and expression checking, using the expr_checker and defer() paths mentioned in the report. Done means the plugin-modified return type is respected and the reproduction passes.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
compilers, devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.