| <img src="docs/source/mypy_light.svg" alt="mypy logo" width="300px"/> | |
| Mypy: Static Typing for Python | |
| ======================================= | |
| [](https://pypi.org/project/mypy/) | |
| [](https://pypistats.org/packages/mypy) | |
| [](https://github.com/python/mypy/actions) | |
| [](https://mypy.readthedocs.io/en/latest/?badge=latest) | |
| [](https://gitter.im/python/typing?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | |
| [](https://mypy-lang.org/) | |
| [](https://github.com/psf/black) | |
| [](https://github.com/astral-sh/ruff) | |
| Got a question? | |
| --------------- | |
| We are always happy to answer questions! Here are some good places to ask them: | |
| - for general questions about Python typing, try [typing discussions](https://github.com/python/typing/discussions) | |
| - for anything you're curious about, try [gitter chat](https://gitter.im/python/typing) | |
| If you're just getting started, | |
| [the documentation](https://mypy.readthedocs.io/en/stable/index.html) | |
| and [type hints cheat sheet](https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html) | |
| can also help answer questions. | |
| If you think you've found a bug: | |
| - check our [common issues page](https://mypy.readthedocs.io/en/stable/common_issues.html) | |
| - search our [issue tracker](https://github.com/python/mypy/issues) to see if | |
| it's already been reported | |
| To report a bug or request an enhancement: | |
| - report at [our issue tracker](https://github.com/python/mypy/issues) | |
| - if the issue is with a specific library or function, consider reporting it at | |
| [typeshed tracker](https://github.com/python/typeshed/issues) or the issue | |
| tracker for that library | |
| To discuss a new type system feature: | |
| - discuss at [discuss.python.org](https://discuss.python.org/c/typing/32) | |
| - there is also some historical discussion at the [typing-sig mailing list](https://mail.python.org/archives/list/typing-sig@python.org/) and the [python/typing repo](https://github.com/python/typing/issues) | |
| What is mypy? | |
| ------------- | |
| Mypy is a static type checker for Python. | |
| Type checkers help ensure that you're using variables and functions in your code | |
| correctly. With mypy, add type hints ([PEP 484](https://www.python.org/dev/peps/pep-0484/)) | |
| to your Python programs, and mypy will warn you when you use those types | |
| incorrectly. | |
| Python is a dynamic language, so usually you'll only see errors in your code | |
| when you attempt to run it. Mypy is a *static* checker, so it finds bugs | |
| in your programs without even running them! | |
| Here is a small example to whet your appetite: | |
| ```python | |
| number = input("What is your favourite number?") | |
| print("It is", number + 1) # error: Unsupported operand types for + ("str" and "int") | |
| ``` | |
| Adding type hints for mypy does not interfere with the way your program would | |
| otherwise run. Think of type hints as similar to comments! You can always use | |
| the Python interpreter to run your code, even if mypy reports errors. | |
| Mypy is designed with gradual typing in mind. This means you can add type | |
| hints to your code base slowly and that you can always fall back to dynamic | |
| typing when static typing is not convenient. | |
| Mypy has a powerful and easy-to-use type system, supporting features such as | |
| type inference, generics, callable types, tuple types, union types, | |
| structural subtyping and more. Using mypy will make your programs easier to | |
| understand, debug, and maintain. | |
| See [the documentation](https://mypy.readthedocs.io/en/stable/index.html) for | |
| more examples and information. | |
| In particular, see: | |
| - [type hints cheat sheet](https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html) | |
| - [getting started](https://mypy.readthedocs.io/en/stable/getting_started.html) | |
| - [list of error codes](https://mypy.readthedocs.io/en/stable/error_code_list.html) | |
| Quick start | |
| ----------- | |
| Mypy can be installed using pip: | |
| ```bash | |
| python3 -m pip install -U mypy | |
| ``` | |
| If you want to run the latest version of the code, you can install from the | |
| repo directly: | |
| ```bash | |
| python3 -m pip install -U git+https://github.com/python/mypy.git | |
| ``` | |
| Now you can type-check the [statically typed parts] of a program like this: | |
| ```bash | |
| mypy PROGRAM | |
| ``` | |
| You can always use the Python interpreter to run your statically typed | |
| programs, even if mypy reports type errors: | |
| ```bash | |
| python3 PROGRAM | |
| ``` | |
| If you are working with large code bases, you can run mypy in | |
| [daemon mode], that will give much faster (often sub-second) incremental updates: | |
| ```bash | |
| dmypy run -- PROGRAM | |
| ``` | |
| You can also try mypy in an [online playground](https://mypy-play.net/) (developed by | |
| Yusuke Miyazaki). | |
| [statically typed parts]: https://mypy.readthedocs.io/en/latest/getting_started.html#function-signatures-and-dynamic-vs-static-typing | |
| [daemon mode]: https://mypy.readthedocs.io/en/stable/mypy_daemon.html | |
| Integrations | |
| ------------ | |
| Mypy can be integrated into popular IDEs: | |
| - VS Code: provides [basic integration](https://code.visualstudio.com/docs/python/linting#_mypy) with mypy. | |
| - Vim: | |
| - Using [Syntastic](https://github.com/vim-syntastic/syntastic): in `~/.vimrc` add | |
| `let g:syntastic_python_checkers=['mypy']` | |
| - Using [ALE](https://github.com/dense-analysis/ale): should be enabled by default when `mypy` is installed, | |
| or can be explicitly enabled by adding `let b:ale_linters = ['mypy']` in `~/vim/ftplugin/python.vim` | |
| - Emacs: using [Flycheck](https://github.com/flycheck/) | |
| - Sublime Text: [SublimeLinter-contrib-mypy](https://github.com/fredcallaway/SublimeLinter-contrib-mypy) | |
| - PyCharm: [mypy plugin](https://github.com/dropbox/mypy-PyCharm-plugin) | |
| - IDLE: [idlemypyextension](https://github.com/CoolCat467/idlemypyextension) | |
| - pre-commit: use [pre-commit mirrors-mypy](https://github.com/pre-commit/mirrors-mypy), although | |
| note by default this will limit mypy's ability to analyse your third party dependencies. | |
| Web site and documentation | |
| -------------------------- | |
| Additional information is available at the web site: | |
| <https://www.mypy-lang.org/> | |
| Jump straight to the documentation: | |
| <https://mypy.readthedocs.io/> | |
| Follow along our changelog at: | |
| <https://mypy-lang.blogspot.com/> | |
| Contributing | |
| ------------ | |
| Help in testing, development, documentation and other tasks is | |
| highly appreciated and useful to the project. There are tasks for | |
| contributors of all experience levels. | |
| To get started with developing mypy, see [CONTRIBUTING.md](CONTRIBUTING.md). | |
| Mypyc and compiled version of mypy | |
| ---------------------------------- | |
| [Mypyc](https://github.com/mypyc/mypyc) uses Python type hints to compile Python | |
| modules to faster C extensions. Mypy is itself compiled using mypyc: this makes | |
| mypy approximately 4 times faster than if interpreted! | |
| To install an interpreted mypy instead, use: | |
| ```bash | |
| python3 -m pip install --no-binary mypy -U mypy | |
| ``` | |
| To use a compiled version of a development | |
| version of mypy, directly install a binary from | |
| <https://github.com/mypyc/mypy_mypyc-wheels/releases/latest>. | |
| To contribute to the mypyc project, check out the issue tracker at <https://github.com/mypyc/mypyc> |