|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy: Optional Static Typing for Python
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
=======================================
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
[![Build Status](https://travis-ci.org/python/mypy.svg)](https://travis-ci.org/python/mypy)
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
What is mypy?
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy is an optional static type checker for Python. You can add type
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
hints to your Python programs using the upcoming standard for type
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
annotations introduced in Python 3.5 beta 1 (PEP 484), and use mypy to
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
type check them statically. Find bugs in your programs without even
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
running them!
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
The type annotation notation has also been backported to earlier
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Python 3.x versions. Mypy programs are valid Python 3.x and you use a
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
normal Python interpreter to run them. There is essentially no
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
performance overhead when using mypy, since mypy does not introduce
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
runtime type checking.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can mix dynamic and static typing in your programs. You can always
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
fall back to dynamic typing when static typing is not convenient, such
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
as for legacy code.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Here is a small example to whet your appetite:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
```
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
from typing import Iterator
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
def fib(n: int) -> Iterator[int]:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
a, b = 0, 1
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
while a < n:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
yield a
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
a, b = b, a + b
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
```
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy is in development; some features are missing and there are bugs.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
See 'Development status' below.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Requirements
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You need Python 3.2 or later to run mypy. You can have multiple Python
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
versions (2.x and 3.x) installed on the same system without problems.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
In Ubuntu, Mint and Debian you can install Python 3 like this:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ sudo apt-get install python3 python3-pip
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
For other Linux flavors, OS X and Windows, packages are available at
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
http://www.python.org/getit/
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Quick start
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-----------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy can be installed using pip:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ pip3 install mypy-lang
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
*Note that the package name is `mypy-lang`, not `mypy`.*
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Currently, the version of mypy on PYPI is not compatible with Python 3.5.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
If you run Python 3.5 install directly form git:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ pip3 install git+git://github.com/python/mypy.git
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Now, if Python on your system is configured properly (else see
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
"Troubleshooting" below), you can type-check a program like this:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ mypy PROGRAM
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can always use a Python interpreter to run your statically typed
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
programs, even if they have type errors:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ python3 PROGRAM
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Web site and documentation
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
--------------------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Documentation and additional information is available at the web site:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
http://www.mypy-lang.org/
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Troubleshooting
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
---------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Depending on your configuration, you may have to run `pip` like
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
this:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ python3 -m pip install mypy-lang
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
If the `mypy` command isn't found after installation: After either
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
`pip3 install` or `setup.py install`, the `mypy` script and
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
dependencies, including the `typing` module, will be installed to
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
system-dependent locations. Sometimes the script directory will not
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
be in `PATH`, and you have to add the target directory to `PATH`
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
manually or create a symbolic link to the script. In particular, on
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mac OS X, the script may be installed under `/Library/Frameworks`:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
/Library/Frameworks/Python.framework/Versions/<version>/bin
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
In Windows, the script is generally installed in
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
`\PythonNN\Scripts`. So, type check a program like this (replace
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
`\Python34` with your Python installation path):
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
C:\>\Python34\python \Python34\Scripts\mypy PROGRAM
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Quick start for contributing to mypy
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
------------------------------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
If you want to contribute, first clone the mypy git repository:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ git clone --recurse-submodules https://github.com/python/mypy.git
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Run the supplied `setup.py` script to install mypy:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ python3 setup.py install
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Replace `python3` with your Python 3 interpreter. You may have to do
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
the above as root. For example, in Ubuntu and Mac OS X:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ sudo python3 setup.py install
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Now you can use the `mypy` program just as above. In case of trouble
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
see "Troubleshooting" above.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
The mypy wiki contains some useful information for contributors:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
http://www.mypy-lang.org/wiki/DeveloperGuides
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Working with the git version of mypy
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
------------------------------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
mypy contains a submodule, "typeshed". See http://github.com/python/typeshed.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
This submodule contains types for the Python standard library.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Due to the way git submodules work, you'll have to do
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
```
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
git submodule update typeshed
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
```
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
whenever you change branches, merge, rebase, or pull.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
(It's possible to automate this: Search Google for "git hook update submodule")
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Running tests and linting
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-------------------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
First install any additional dependencies needed for testing:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ pip3 install -r test-requirements.txt
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
To run all tests, run the script `runtests.py` in the mypy repository:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ ./runtests.py
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Note that some tests will be disabled for older python versions.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
This will run all tests, including integration and regression tests,
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
and will type check mypy and verify that all stubs are valid. You can also
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
run unit tests only, which run pretty quickly:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ ./runtests.py unit-test
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can run a subset of test suites by passing positive or negative
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
filters:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ ./runtests.py lex parse -x lint -x stub
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
If you want to run individual unit tests, you can run `myunit` directly, or
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
pass inferior arguments via `-a`:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ scripts/myunit -m mypy.test.testlex -v '*backslash*'
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ ./runtests.py mypy.test.testlex -a -v -a '*backslash*'
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can also run the type checker for manual testing without
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
installing anything by setting up the Python module search path suitably:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ export PYTHONPATH=$PWD:$PWD/lib-typing/3.2
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ python<version> -m mypy PROGRAM.py
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can add the entry scripts to PATH for a single python3 version:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ export PATH=$PWD/scripts
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ mypy PROGRAM.py
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
You can check a module or string instead of a file:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ mypy PROGRAM.py
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ mypy -m MODULE
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ mypy -c 'import MODULE'
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
To run the linter:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
$ ./runtests.py lint
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Development status
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
------------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy is work in progress and is not yet production quality, though
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
mypy development has been done using mypy for a while!
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Here are some of the more significant Python features not supported
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
right now (but all of these will improve):
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
- Python 2.x support needs polish and documentation
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
- properties with setters not supported
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
- limited metaclass support
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
- only a subset of Python standard library modules are supported, and some
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
only partially
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
- 3rd party module support is limited
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
The current development focus is to have a good coverage of Python
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
features and the standard library (both 3.x and 2.7).
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Issue tracker
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-------------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Please report any bugs and enhancement ideas using the mypy issue
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
tracker:
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
https://github.com/python/mypy/issues
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Feel free to also ask questions on the tracker.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Help wanted
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-----------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Any help in testing, development, documentation and other tasks is
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
highly appreciated and useful to the project. Contact the developers
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
to join the project, or just start coding and send pull requests!
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
There are tasks for contributors of all experience levels.
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
License
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
-------
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
Mypy is licensed under the terms of the MIT License (see the file
|
|
![](https://seccdn.libravatar.org/avatar/b02ef8c8d16c8ff8175040d35a7f6add060e102cc90c0cecbcb110d12eccac37?s=16&d=retro) |
a4aba9f |
LICENSE).
|