Repository navigation
Cannot silence "unused 'type: ignore'" in version specific code #8823
Description
Activity
As a workaround for this issue, you can use
cast- addedbugmypy got something wrongmypy got something wrong
on May 14, 2020 It does not help in my particular issue.
The problem is that MyPy skips some parts of the code and complains about unused
type: ignorein this code (which would be not ignored if this code be not skipped). It is not consistent and does not have a workaround.Agree that there is an issue, but I think it can be worked around using cast, since that lets you remove the type ignore altogether:
~/delete λ cat test84.py import sys from typing import cast, Any if sys.version_info >= (3, 7): x: int = cast(Any, 'a') ~/delete λ mypy --python-version 3.6 --warn-unused-ignores --warn-redundant-casts test84.py Success: no issues found in 1 source file ~/delete λ mypy --python-version 3.7 --warn-unused-ignores --warn-redundant-casts test84.py Success: no issues found in 1 source fileLooking at the issue on typeshed, you'd need to do something like
cast(Any, sys.stdout).reconfigure(errors="replace"). It's not pretty, but it should work.x: int = 'a'was just an example. It is the simplest way that I know to trigger an error. In real code I usesys.stdout.reconfigure(errors="replace")
and I do not know how to silence an error in this case.
Oh, and thank you for your suggestion. I tried similar workaround, but made an error in the code, so it did not work. Now I see my mistake and fixed it thank to you.
Reacted by Pat MyronI think we need a way to silence unused type ignore messages for individual type ignores short of disabling the warning.
Reacted by Samuel Colvin, lemon24, James Braza, Pat Myron, Chris Tabor, Mehdi Drissi, Jiri Daněk, Antti Kaihola, Redowan Delowar, Antonín Kříž and 14 more- changed the title
[-]Cannot silence type checking in version specific code[/-][+]Cannot silence "unused 'type: ignore'" in version specific code[/+]on May 20, 2020 I'm running into a by-platform equivalent of this. If I try to import
epollfrom theselectmodule on macOS, I get an[attr-defined]error, but on Linux, that's fine. Conversely, on Linux, one can't importKQ_FILTER_READfromselect.So, depending on which platform you run
mypy, you get a different error, and I don't know how to suppress that class of error message.That might be a different ticket, but it seems similar enough that maybe mentioning it in this one will do…?
Reacted by Seppo EnarviNote the
selectissue I mention above appears to be new between Mypy0.770and0.782.@wsanchez That is different. Are you using the right syntax for the platform check? Please ask on Gitter.
Reacted by Pat Myron@gvanrossum Oh, OK, I didn't realize that Mypy could be told to do platform-specific things. I'll read more. twisted/twisted#1416 (comment) describes the issue in a bit more detail.
- added a commit that references this issue
on Oct 27, 2020 21 remaining items
- added a commit that references this issue
on Sep 8, 2022 - added a commit that references this issue
on Sep 8, 2022 - addedtopic-reachabilityDetecting unreachable codeDetecting unreachable code
on Dec 28, 2022 - added a commit that references this issue
on Jan 5, 2023 A possible workaround for the @stinovlas's import use case is to use getattr instead:
try: TestCase: Any = getattr(unittest, 'IsolatedAsyncioTestCase') except AttributeError: # pragma: no cover TestCase = getattr(asynctest, 'TestCase')
I've been struggling with this issue with try/except imports. I thought I had tried everything already, but this worked!
Reacted by Antti KaiholaI know "me too!" comments aren't especially helpful, but here's an example where the suggested workaround (using
cast) does not work.import sys from typing import cast, Callable if sys.version_info >= (3, 8): from importlib.metadata import version else: from importlib_metadata import version cast(Callable[[str], str], version) __version__ = version("my-lib")
❯ mypy --python-version 3.10 Success: no issues found in 37 source files❯ mypy --python-version 3.7 my-lib/__init__.py:12: error: Call to untyped function "version" in typed context [no-untyped-call] Found 1 error in 1 file (checked 37 source files)❯ mypy --version mypy 1.1.1 (compiled: yes)Try
version: Callable[[str], str]before yourif, or to cast in the same expression that you call e.g.cast(Callable[[str], str], version)("my-lib")Reacted by Matteo Santamaria- added a commit that references this issue
on May 2, 2023 - added a commit that references this issue
on May 2, 2023 Thanks to ilevkivskyi, in the next release of mypy
# type: ignore[unused-ignore]should work.Reacted by Alex Waygood, Matteo Santamaria, Neil Girdhar, Kevin Murphy, sigma67, Fabian Keller, Ryan Gibson, Niko Föhr and Matthias- added a commit that references this issue
on Nov 15, 2023 - added a commit that references this issue
on Nov 15, 2023 - added a commit that references this issue
on May 14, 2024 - added a commit that references this issue
on May 28, 2025
I need to execute some code only on specific Python version (it is the use of
TextIOWrapper.reconfigure()added in Python 3.7, but in following example I will use more abstract code).Since MyPy on Python 3.7 raises an error for it (actually because of the error in
typeshed) I need to add# type: ignore:But now I will get an error
unused 'type: ignore' commentwhen run MyPy withwarn_unused_ignores = Trueon Python 3.6.So I cannot use variant 1, because it is an error on 3.7, and cannot use variant 2, because it is an error on 3.6.
MyPy should not complain about unused 'type: ignore' comment in the code which it does not analyze.
MyPy version is 0.770.