Python 3 e Type Hints

Tipagem Estática vs Tipagem Dinâmica

Tipagem Forte vs Tipagem Fraca

>>> “5” + 3TypeError: can only concatenate str (not “int”) to str
>>> “5” — 3TypeError: unsupported operand type(s) for -: ‘str’ and ‘int’
>>> “5” — “3”TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’
>>> “5” + 3“53”
>>> “5” — 32
>>> “5” — "3"2
Exemplos de linguagens no eixo de tipos
>>> 5 + 5.510.5

Vantagens de declarações explícitas de tipos

Começando a usar Type Hints

typehints-exemplo1.py
typehints-exemplo2.py
soma(6, 4)
soma(6, ‘6’)
soma(6, 4) + ‘Xablau’
typehints-exemplo3.py

Mypy

pipenv install mypy
pip install mypy
mypy typehints-exemplo3.py
typehints-exemplo3.py:5: error: Argument 2 to “soma” has incompatible type “str”; expected “int”typehints-exemplo3.py:6: error: Unsupported operand types for + (“int” and “str”)
typehints-exemplo4.py
mypy typehints-exemplo4.py
typehints-exemplo4.py:2: error: Incompatible return value type (got “int”, expected “str”)
typehints-exemplo5.py
mypy typehints-exemplo5.pytypehints-exemplo5.py:2: error: Incompatible types in assignment (expression has type “str”, variable has type “int”)
typehints-exemplo8.py
mypy typehints-exemplo8.pytypehints-exemplo8.py:2: error: Incompatible types in assignment (expression has type “str”, variable has type “int”)
typehints-exemplo6.py
mypy typehints-exemplo6.pytypehints-exemplo6.py:2: error: Argument 1 to “append” of “list” has incompatible type “Tuple[str, str]”; expected “Tuple[int, int]”
typehints-exemplo7.py
mypy typehints-exemplo7.pytypehints-exemplo7.py:5: error: Argument 1 to “append” of “list” has incompatible type “Tuple[str, str]”; expected “Tuple[int, int]”

Stubs (.pyi)

typehints-exemplo9.py
typehints-exemplo9.pyi

__annotations__

typehints-exemplo10.py

{‘a’: <class ‘int’>, ‘b’: <class ‘int’>, ‘return’: <class ‘int’>}
{‘x’: <class ‘str’>}

Vale lembrar que como os arquivos .pyi não são lidos pelo interpretador, o que é definido lá, não é acessível pelo atributo __annotations__

Módulo Typing

typehints-exemplo12.py
class Produto(NamedTuple)
preco: Union[Decimal, float]
def total_carrinho(produtos: List[Produto]) -> Union[Decimal, float]:
typehints-exemplo13.py
mypy typehints-exemplo13.pytypehints-exemplo13.py:19: error: Argument 1 to “total_carrinho” has incompatible type “Tuple[Produto, …]”; expected “List[Produto]”
return sum(p.preco for p in produtos)
def total_carrinho(produtos: Iterable[Produto])-> Union[Decimal, float]:
typehints-exemplo14.py
typehints-exemplo14.py:11: error: Argument 1 to “velocidade” has incompatible type “int”; expected “Metros”
typehints-exemplo14.py:12: error: Argument 1 to "velocidade" has incompatible type "Pes"; expected "Metros"

Ecossistema

typehints-exemplo11.py

Experimente!

Agradecimentos especiais pro meu querido Elias Tandel que aceitou colaborar comigo produzindo conteúdo e dando essa palestra comigo na PythonRio e PythonBrasil

--

--

www.diogommartins.com

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store