How can mypy ignore a single line in a source file?
Asked Answered
E

5

247

I'm using mypy in my python project for type checking. I'm also using PyYAML for reading and writing the project configuration files. Unfortunately, when using the recommended import mechanism from the PyYAML documentation this generates a spurious error in a try/except clause that attempts to import native libraries:

from yaml import load, dump
try:
    from yaml import CLoader as Loader, CDumper as Dumper
except ImportError:
    from yaml import Loader, Dumper

On my system CLoader and CDumper aren't present, which results in the errors error: Module 'yaml' has no attribute 'CLoader' and error: Module 'yaml' has no attribute 'CDumper'.

Is there a way to have mypy ignore errors on this line? I was hoping that I could do something like this to have mypy skip that line:

from yaml import load, dump
try:
    from yaml import CLoader as Loader, CDumper as Dumper  # nomypy
except ImportError:
    from yaml import Loader, Dumper
Epididymis answered 11/3, 2018 at 12:32 Comment(0)
G
352

You can ignore type errors with # type: ignore as of version 0.2 (see issue #500, Ignore specific lines):

PEP 484 uses # type: ignore for ignoring type errors on particular lines ...

Also, using # type: ignore close to the top of a file [skips] checking that file altogether.

Source: mypy#500. See also the mypy documentation.

Gardener answered 11/3, 2018 at 12:42 Comment(6)
Any idea how to put the # type: ignore on the line above?Rare
my prospector linter requires a certain lengthRare
@GregHilston ah, ouch. Unfortunately I don't know if this is possible (PEP 484 doesn't seem to list many other options), though it is possible to ignore an entire function (mypy#557).Gardener
@GregHilston you could split the line using `\` or parenthesis and write the comment to the line where the mypy error occurs.Variole
To be more specific, MyPy supports specifying the error code/s to ignore with type: ignore[code, ...]. See mypy.readthedocs.io/en/stable/…. In this case, it would be # type: ignore[attr-defined].Alvey
thanks @GinoMempin and for other cases, you can run mypy with the --show-error-codes flag to see the codesPiquet
C
43

Also # mypy: ignore-errors at the top of the file works if you want to ignore all errors in the whole file. If you are using shebang and coding lines, they should be ordered like this:

#!/usr/bin/env python 
#-*- coding: utf-8 -*-
# mypy: ignore-errors

Source: Gvanrossum comment to a related mypy issue

Cockboat answered 1/1, 2020 at 2:37 Comment(2)
Note this ignore all errors on the whole file, not just errors on a single line like what OP was asking about.Lustick
That's why I write "all", sure it is not the accepted answer like the OP wanted, but just an complement to this thread. If you want to add to the answer write an edit or another answer :)Cockboat
S
19

Note that # type: ignore will ignore all errors. If you don't want that, ignore only the specific error code.

Example:

def knows(a: int, b: int) -> bool:  # type: ignore[empty-body]
    pass

The above ignores error code empty-body for function knows. If you want to ignore a specific error for the whole file, put the following on top of the file, just after the imports:

# mypy: disable-error-code="empty-body"
Splint answered 2/8, 2023 at 6:4 Comment(0)
L
13

Of course, the answer of this question is add # type:ignore at the end of the line that want mypy to ignore it.

When I was google for how to ignore the files for django migrations,
this question was recomment to me several times.

So I post an answer about how to ignore Django migrations:

# mypy.ini
[mypy-*.migrations.*]
ignore_errors = True

And for mypy>=0.910, pyproject.toml is supported which can be set as follows:

[tool.mypy]
python_version = 3.8
ignore_missing_imports = true

[[tool.mypy.overrides]]
module = "*.migrations.*"
ignore_errors = true
Laritalariviere answered 11/11, 2020 at 13:9 Comment(1)
Note that this will ignore errors for the entire file and for all types of errors, not just for the error on a specific line (which the OP was originally asking about).Alvey
D
8

I used

# type: ignore # noqa: F401

to ignore one line that was giving me F401 error. I am sure you can expand it to other error codes

Decalogue answered 13/2, 2023 at 16:51 Comment(2)
You mean ignore mypy and Pyflakes errors?Oakland
It seems like you're ignoring mypy and flake8 errors. Also, type: ignore is going to ignore all rules, not just one, which is not as specific as ignoring F401 only.Splint

© 2022 - 2024 — McMap. All rights reserved.