I noticed Python 3.5 and Python 3.6 added a lot of features about static type checking, so I tried with the following code (in python 3.6, stable version).
from typing import List a: List[str] = [] a.append('a') a.append(1) print(a)
What surprised me was that, Python didn't give me an error or warning, although 1
was appended to a list
which should only contain strings. Pycharm
detected the type error and gave me a warning about it, but it was not obvious and it was not shown in the output console, I was afraid sometimes I might miss it. I would like the following effects:
Is that possible? Maybe mypy
could do it, but I'd prefer to use Python-3.6-style type checking (like a: List[str]
) instead of the comment-style (like # type List[str]
) used in mypy
. And I'm curious if there's a switch in native python 3.6 to achieve the two points I said above.
This module supports type hints as specified by PEP 484 and PEP 526. The most fundamental support consists of the types Any , Union , Tuple , Callable , TypeVar , and Generic . For full specification please see PEP 484. For a simplified introduction to type hints see PEP 483.
Here's how you can add type hints to our function: Add a colon and a data type after each function parameter. Add an arrow ( -> ) and a data type after the function to specify the return data type.
Type hints help you build and maintain a cleaner architecture. The act of writing type hints forces you to think about the types in your program. While the dynamic nature of Python is one of its great assets, being conscious about relying on duck typing, overloaded methods, or multiple return types is a good thing.
Unlike how types work in most other statically typed languages, type hints by themselves don't cause Python to enforce types. As the name says, type hints just suggest types.
Type hints are entirely meant to be ignored by the Python runtime, and are checked only by 3rd party tools like mypy and Pycharm's integrated checker. There are also a variety of lesser known 3rd party tools that do typechecking at either compile time or runtime using type annotations, but most people use mypy or Pycharm's integrated checker AFAIK.
In fact, I actually doubt that typechecking will ever be integrated into Python proper in the foreseable future -- see the 'non-goals' section of PEP 484 (which introduced type annotations) and PEP 526 (which introduced variable annotations), as well as Guido's comments here.
I'd personally be happy with type checking being more strongly integrated with Python, but it doesn't seem the Python community at large is ready or willing for such a change.
The latest version of mypy should understand both the Python 3.6 variable annotation syntax and the comment-style syntax. In fact, variable annotations were basically Guido's idea in the first place (Guido is currently a part of the mypy team) -- basically, support for type annotations in mypy and in Python was developed pretty much simultaneously.
Is that possible? Maybe mypy could do it, but I'd prefer to use Python-3.6-style type checking (like
a: List[str]
) instead of the comment-style (like# type: List[str]
) used in mypy. And I'm curious if there's a switch in native python 3.6 to achieve the two points I said above.
There's no way Python will do this for you; you can use mypy
to get type checking (and PyCharms built-in checker should do it too). In addition to that, mypy
also doesn't restrict you to only type comments # type List[str]
, you can use variable annotations as you do in Python 3.6 so a: List[str]
works equally well.
With mypy
as is, because the release is fresh, you'll need to install typed_ast
and execute mypy
with --fast-parser
and --python-version 3.6
as documented in mypy's docs. This will probably change soon but for now you'll need them to get it running smoothly
Update: --fast-parser
and --python-version 3.6
aren't needed now.
After you do that, mypy detects the incompatibility of the second operation on your a: List[str]
just fine. Let's say your file is called tp_check.py
with statements:
from typing import List a: List[str] = [] a.append('a') a.append(1) print(a)
Running mypy
with the aforementioned arguments (you must first pip install -U typed_ast
):
python -m mypy --fast-parser --python-version 3.6 tp_check.py
catches the error:
tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
As noted in many other answers on type hinting with Python, mypy
and PyCharm
s' type-checkers are the ones performing the validation, not Python itself. Python doesn't use this information currently, it only stores it as metadata and ignores it during execution.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With