Tipagem estática em Python e módulo mypy

O Python é uma linguagem de tipagem dinâmica, ou seja, as variáveis podem mudar de tipo durante a execução do programa. No entanto, desde a versão 3.5, a linguagem ganhou suporte a type hints (anotações de tipo) através do módulo typing. Com essas anotações, podemos usar ferramentas como mypy para verificar o código estaticamente e encontrar erros antes de executar o programa.


Benefícios da Tipagem Estática

  • Detectar erros mais cedo (sem precisar rodar o código).
  • Melhorar a legibilidade e documentação do código.
  • Auxiliar IDEs e editores (autocompletar, linting, refatoração).

1. Tipos Primitivos

Os tipos mais comuns podem ser usados sem o módulo typing:


def boas_vindas(self) -> str:
    return "Seja bem vindo(a) ao estudo de tipagem estática em Python!"

def somar(self, num1: int, num2: int) -> int:
    return num1 + num2  

def multiplicar(self, num1: float, num2: float) -> float: 
    return num1 * num2

def checar_idade(self, idade: int) -> bool: 
    if idade >= 18:
    	return True
    else:
    	return False
        

2. Union e Optional

As variáveis podem assumir mais de um tipo. É necessário o módulo typing.


from typing import Union, Optional

def dividir(self, num1: float, num2: float) -> Union[float, str]:
    if num2 == 0:
    	return f"Divisão por zero!"
    else:    
    	return num1 / num2
       
 def digite_nome(self, nome: Optional[str] = None) -> str:
     return nome or "Sem nome!"        
        

3. Tipos Compostos

O módulo typing também fornece os tipos List, Tuple e Dict.

List(Lista)


from typing import List

def media(self, notas: List[int]) -> float: 
    return sum(notas) / len(notas)  

Tuple(Tupla)


from typing import Tuple

def idades(self) -> Tuple[int, int]:
    return (44, 77) 

Dict(Dicionário)


from typing import Dict

def frutas(self) -> Dict[str, int]:
    return {"abacate": 10, "banana": 5}


4. Funções genéricas

Com TypeVar, você pode criar funções que funcionam para múltiplos tipos:


from typing import TypeVar

T = TypeVar("T")

def identidade(self, valor: T) -> T:
    return valor


5. O tipo Any

O tipo Any em Python significa que o valor pode ser qualquer coisa. Ele desativa a verificação de tipo do mypy para aquela variável ou parâmetro.


from typing import Any

def qualque_valor(self, valor: Any) -> Any:
    return valor  


Módulo mypy

Mypy é um verificador de tipos estáticos para Python que ajuda a encontrar erros no seu código antes de ele ser executado, utilizando as Type Hints (dicas de tipo) que você adiciona ao seu programa.


# Instala mypy globalmente
 pip install mypy
 
# Verifica versão global
mypy --version

# Executa globalmente
mypy nomeDoArquivo.py

# Instala mypy no poetry 
poetry add mypy --dev

# Verifica versão
poetry mypy --version

# Executa no ambiente poetry
poetry run mypy nomeDoArquivo.py

# Executa em todos os arquivos do ambiente poetry
poetry run mypy .


Conclusão

Mesmo sendo uma linguagem de tipagem dinâmica, o Python ganhou poderosos recursos de tipagem estática opcional. Usar anotações de tipo junto com ferramentas como mypy pode aumentar a confiabilidade e a legibilidade do seu projeto. Se você trabalha em sistemas maiores ou em equipe, vale a pena adotar a tipagem estática como parte do seu fluxo de desenvolvimento. Muito obrigado e até a próxima.

Observação: existem outros tipo que serão abordados em postagens futuras.

Repositório de estudo sobre tipagem estática em Python: https://github.com/jcarlossc/python-static-typing-mypy

Comentários

Postagens mais visitadas deste blog