Definindo tipos de variáveis e de listas. (Python, TypeHinting)

Fazer isso é bem simples e deixa seu código mais inteligível.

Contexto

Desde maio de 2015, definir tipos para as variáveis foi incluído no PEP (PEP0484: Type Hints) e implementado neste repositorio. A ideia desta atualização foi facilitar a analise do código, os processos de refatoração e possibilitar validações que só seriam possíveis durante a execução. (Quem diria que definir tipos para as variáveis seria tão útil, certo? 😉)

Isso quer dizer que o Python está virando uma linguagem “fortemente tipada”? Não. Como o próprio nome da diretiva do PEP sugere, esta definição é uma hint, ou seja, uma dica. Se você quiser ignorar o tipo sugerido, está liberado. (mas pq vc faria isso?)

O processo é bem simples e pode ser utilizado com toda a flexibilidade do Python. Vamos aos exemplos…

Definindo tipo de uma variável

foo: int = 42
bar: str = "bacon"

O código acima cria as variáveis foo, com o tipo sugerido de int e bar do tipo string (str). Caso você tente associar o valor “x” na variável foo (que foi definida como int),você vai conseguir e esta variável vai passar a ser considerada como uma string, que é o comportamento normal do Python.

A vantagem deste processo está na sua IDE. Se ela for (pelo menos) razoável, ela vai te avisar que o valor esperado para a variável foo é alguma coisa do tipo int e isso vai te ajudar a evitar bugs durante o desenvolvimento.

Você pode utilizar qualquer tipo como hint da sua variável e caso precise definir dois (ou mais) tipos possíveis para uma variável, utilize o Union (do pacote typing):

from typing impoort Union

foobar: Union[int, str] = "bar"

 

Desta forma, se você atribuir int ou str, a IDE não vai emitir um warning/erro.

 

Definindo tipo dos itens de uma lista

Seguindo a lógica do exemplo acima, voce poderia definir uma variável como list, mas isso não vai  te falar do que é esta lista.

Todavia, isso é possível. Basta importar List do pacote typing.

 

from typing import List

foo: List[int] = [1,2,3,4]
bar: List[str] = ["x", "y"]

No exemplo acima, a variável foo agora é uma lista de int e a bar é uma lista de strings. Você pode utilizar o Union também para falar que a lista pode ser mista.

 

Exemplo

Segue um exemplo mais completo deste tipo de tipagem

# -*- coding: utf-8 -*-
from datetime import datetime
from typing import List, Union


class Bar:
    _id: int
    description: str

class Foo:
    def __init__(self, _id: int, name: str, bars: List[Bar],
                 correlation_ids: List[str], created_at: Union[datetime, None] = None,
                 misc: Union[List[int], List[str]] = None):
        self._id: int = _id
        self.name: str = name
        self.created_at: Union[datetime, None] =  datetime.utcnow() if created_at is None else created_at
        self.bars: List[Bar] = bars
        self.correlation_ids: List[str] = correlation_ids
        self.misc: Union[List[int], List[str]] = misc

if __name__ == '__main__':
    f = Foo(_id=1,
            name="Foo1",
            bars=[Bar(), Bar(), Bar()],
            correlation_ids=["1", "2", "3"],
            created_at=datetime.now(),
            misc=[1, "x"])

 

Espero ter ajudado.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , , .