coverage report produces too many Anys
Nobody has claimed this yet.
- 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
-
def test() -> str: value: str = getattr(test, '__name__') return value mypy --html-report . test.py- 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
- The call expression itself is processed, which first starts with the node itself. Because the result of
getattrisAnythe visitor hasAnyin itstypemapfor that node. This is arguably the onlyAnythat 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). - The callee is then visited which will be processing the node with type
def (Any, name: builtins.str, Any =) -> Any, inStatisticsVisitor.typeit callsget_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 moreAnys to the line. Now that I'm looking at it closer, if I had addedAnys to the type definition oftestthey would increase the number ofAnys on the line when visiting the arguments togetattr.
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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