python / python/mypy

coverage report produces too many Anys

Open
#10,325 0 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

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

Description

Bug Report

When generating a coverage report there are too many Anys reported for lines. I've figured out how it's counting Anys and I may be able to help with a patch.

To Reproduce

  1. def test() -> str:
      value: str = getattr(test, '__name__')
      return value
    
  2. mypy --html-report . test.py
  3. View generated html/test.py.html

Expected Behavior

As mypy reported a success, I would expect no Anys, but maximally I would expect 1.

Actual Behavior

Mypy reports 4 explicit anys on the getattr line.

When stepping through the StatisticsVisitor visit I noticed this is because when visiting a call expression:

https://github.com/python/mypy/blob/d089891198ef470c8bec9bd7d7b50a02757c5b68/mypy/stats.py#L217-L225

  1. The call expression itself is processed, which first starts with the node itself. Because the result of getattr is Any the visitor has Any in its typemap for that node. This is arguably the only Any that I would expect, and it probably should still not be reported because there is an explicit type on the assignment (I do note that assignment could be wrong, and maybe this should be reported as a partial cover).
  2. The callee is then visited which will be processing the node with type def (Any, name: builtins.str, Any =) -> Any, in StatisticsVisitor.type it calls get_proper_types(collect_all_inner_types(t)) + [t] which is [Any, builtins.str, Any, Any, def (Any, name: builtins.str, Any =) -> Any] which will add 3 more Anys to the line. Now that I'm looking at it closer, if I had added Anys to the type definition of test they would increase the number of Anys on the line when visiting the arguments to getattr.

Your Environment

  • Mypy version used: mypy 0.812
  • Mypy command-line flags: --html-report .
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: Python 3.8.8
  • Operating system and version: N/A

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

Start with mypy/stats.py around the StatisticsVisitor call-expression handling referenced in the report, then reproduce the case with mypy --html-report . test.py. Trace how the call, callee, and argument types contribute to the HTML coverage report; done means the example no longer counts the nested Any types repeatedly and the reported total matches the expected behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
testing-qa, tooling
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.