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).
import sys
if sys.version_info >= (3, 7):
x: int = 'a'
Since MyPy on Python 3.7 raises an error for it (actually because of the error in typeshed) I need to add # type: ignore:
import sys
if sys.version_info >= (3, 7):
x: int = 'a' # type: ignore
But now I will get an error unused 'type: ignore' comment when run MyPy with warn_unused_ignores = True on 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.
As a workaround for this issue, you can use cast
It does not help in my particular issue.
The problem is that MyPy skips some parts of the code and complains about unused type: ignore in 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 file
Looking 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 use
sys.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.
I think we need a way to silence unused type ignore messages for individual type ignores short of disabling the warning.
I'm running into a by-platform equivalent of this. If I try to import epoll from the select module on macOS, I get an [attr-defined] error, but on Linux, that's fine. Conversely, on Linux, one can't import KQ_FILTER_READ from select.
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…?
Note the select issue I mention above appears to be new between Mypy 0.770 and 0.782.
@wsanchez That is different. Are you using the right syntax for the platform check? Please ask on Gitter.
@gvanrossum Oh, OK, I didn't realize that Mypy could be told to do platform-specific things. I'll read more. https://github.com/twisted/twisted/pull/1416#issuecomment-702425277 describes the issue in a bit more detail.
Most helpful comment
I think we need a way to silence unused type ignore messages for individual type ignores short of disabling the warning.