python / python/mypy

Feature proposal: an option --any-as-object to avoid false negatives

Open
#12,856 6 comments 5 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

feature topic-configuration topic-disallow-any
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

Feature

Mypy would have an option to consider any occurrence of Any as being object in order to issue a warning or error when Any is used as if it were any type more specific than object.

Related https://github.com/python/mypy/issues/3194

Pitch

It turned out that the typeshed will rather "err on the side of convenience" and use Any to avoid causing annoyance in existing codebases.
This opens the door to potential type errors at run time without ever getting so much as a warning from mypy.
This option would allow to turn the problem on its head for those who wish to do so, giving an option to err on the side of caution rather than convenience — the benefit of ensuring no runtime type errors, at the cost of more hoops to jump through.

When using the WSGI protocol for example, using --disallow-any-expr, this ended in utter confusion due to different standards seemingly applied to my code on the one hand, and the libraries on the other:

from wsgiref.types import WSGIEnvironment, StartResponse, InputStream
from typing import Iterable

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

def wsgi_callable(environ: WSGIEnvironment, start_response: StartResponse) -> Iterable[bytes]:
	# No error:
	content_length1 = f(environ['CONTENT_LENGTH'])

	# error: Expression has type "Any":
	content_length2 = f("0" if environ['CONTENT_LENGTH'] == "" else environ['CONTENT_LENGTH'])

	return []

To have an error in one case and not the other was completely confusing to begin with, since in all logic, both expressions have the same type (str in this case). Therefore, the intuition was that they should either be both valid or both wrong.
Looking further, I discovered that in the first case, I was actually not protected against a runtime type error due to Any: https://github.com/python/cpython/blob/main/Lib/wsgiref/types.py#L29

I understand that the typeshed uses Any to avoid creating too many errors in existing code bases, but since I'm getting started from scratch I would actually like to get the "annoyance" over potential runtime type errors.
It is for the same reason that mypy already has various 'strictness' options, for users who have an approach where they value guarantees that actually hold, more than being spared to go the final mile.

The option proposed here would elegantly convert cases with potential for false negatives to cases with potential for false positives.

Thanks to jinsun on the official #python IRC for the original concept of Any → object.

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 by reading related issue #3194 and reviewing mypy’s existing strictness options, especially the behavior described for --disallow-any-expr. Define the intended Any-to-object checking semantics and acceptance criteria for cases such as the WSGI example; the issue names no implementation files or tests.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.