A própria ajuda do interpretador faz a verificação de tipos em Python. Como o Python é uma linguagem dinâmica, ele não obriga você a declarar o tipo dos objetos, o que pode gerar bugs e tornar os erros mais difíceis de detectar. Para contornar isso, é possível usar Python em conjunto com outras ferramentas e implementar recursos de verificação estática de tipos, além do seu próprio duck typing.
Existem dois tipos de sistemas de tipos adotados por diferentes linguagens de programação, mostrados abaixo.
Linguagem de tipagem estática
Linguagem de tipagem dinâmica
Linguagem de tipagem estática
A verificação do tipo da variável é feita em tempo de compilação. Além disso, o sistema de tipos da linguagem exige declarar explicitamente o "tipo de dado" da variável antes do uso. Linguagens com tipagem estática incluem: Scala, Java, C++, etc. Por exemplo, a declaração de String em Scala é definida abaixo: var myCar:String = "Mercedes"; O código acima mostra que a variável 'myCar' é declarada explicitamente com o tipo de dado 'String' e o valor 'Mercedes'.
Linguagem de tipagem dinâmica
A verificação do tipo da variável é feita em tempo de execução. Além disso, o sistema de tipos da linguagem não obriga a declarar explicitamente o "tipo de dado" da variável antes do uso. Linguagens com tipagem dinâmica incluem: Python, JavaScript, Ruby, etc. Por exemplo, a String em Python é definida abaixo: myCar = "Mercedes" O código acima mostra que a variável 'myCar' não precisa ser declarada explicitamente.
'type()' e 'isinstance()' em Python
Os tipos das variáveis podem ser conhecidos usando o próprio 'type()' do Python. O 'type()' pode ser usado em tempo de execução para depuração, ajudando a identificar os tipos exatos das variáveis no programa. Vamos ver o tipo de algumas variáveis no exemplo abaixo.
O código acima exibirá 'int'. Como o tipo de dado da variável é inteiro, 'type()' identifica isso.
O 'insinstance('obj','class')' do Python pode ser usado para saber se 'obj', que é o objeto, é instância da classe ou não. O valor retornado é booleano e pode ser True ou False.
O código acima exibirá True. Como o tipo de dado da variável é string, 'isinstance()' identifica isso.
Duck typing em Python
Há um princípio popular em Python: "Se parece um pato, nada como um pato e grasna como um pato, então provavelmente é um pato." Em resumo, o princípio diz que o tipo do objeto ou da classe não importa; se o objeto tiver métodos e propriedades compatíveis, ele pode ser usado para um determinado propósito. Veja um exemplo para deixar isso mais claro.
No exemplo abaixo, existem duas classes: 'Duck' e 'Human'. Duck é uma classe que contém os métodos quack e fly. Da mesma forma, Human é uma classe com seus próprios métodos 'quack' e 'fly'. Duck e Human são classes diferentes e, portanto, objetos (tipos) diferentes. No entanto, Human contém métodos semelhantes ('fly' e 'quack') aos de Duck. Há também a função 'fly_quack', que funciona com algo que se parece mais com 'Duck' do que com 'Human' porque consegue voar e grasnar.
classDuck:defquack(self):print('Quack')deffly(self):print('Flap')classHuman:defquack(self):print('Trying to Quack like a duck')deffly(self):print('Spreading my arm to flap like a duck')deffly_quack(thing):
thing.quack()
thing.fly()Tecnologia
Vamos criar uma instância de 'Duck' como du e passar para a função 'fly_quack(du)'. Da mesma forma, uma instância de Human 'h' é criada e passada para a função 'fly_quack(h)'.
du = Duck()
fly_quack(du)
h = Human()
fly_quack(h)Tecnologia
A saída do código acima é a seguinte:
Trying to Quack like a duck
Spreading my arm to flap like a duck
Quack
Flap
Tecnologia
Embora 'Human' seja uma classe diferente de 'Duck', o Python chama a função 'fly_quack' para o humano também. Mesmo com tipos de objetos diferentes, como 'Human' tem métodos semelhantes (quack e fly), ele se comporta como o necessário e fornece os métodos requeridos.
Type hint e mypy
Há um aspecto poderoso em linguagens de tipagem dinâmica como Python: o código fica acessível e legível. Mas há desvantagens. Uma delas é encontrar erros em tempo de execução, já que Python não impõe o tipo das variáveis. Isso pode gerar erros e bugs que ficam difíceis de detectar à medida que o código cresce.
O Python implementou type hints a partir da versão 3.5. Versões mais antigas podem não oferecer suporte a type hints.
Veja um exemplo simples sem type hinting e sem mypy.
A função abaixo deveria fazer a subtração de inteiros, subtraindo dois números inteiros e retornando o valor.
A função acima precisaria aceitar dois inteiros 'x' e 'y', mas como não há regras impostas, ela pode receber qualquer tipo de dado. Além disso, o retorno pode ser qualquer coisa: aqui é retornada a 'str' ('Subtraction'), quando o esperado seria um 'int'.
Vamos ver uma implementação semelhante usando type hints e 'mypy', que ajudam a aplicar verificação estática de tipos e reduzem erros e bugs no programa com muito mais facilidade.
'mypy' é um módulo Python que ajuda na verificação estática de tipos, combinando a verificação dinâmica (duck typing) do próprio Python com type hints.
Você precisa instalar o pacote 'mypy' pip install mypy
Crie um arquivo chamado 'mypy_example.py' na sua máquina local e digite o código a seguir. O código abaixo é um programa simples que aceita dois inteiros como parâmetros e, após '->', indica o tipo de retorno, que também é um 'int'. No entanto, a função deveria retornar um int, mas retorna a string 'Subtracted two integers'.
defsub_this(x:int,y:int)->int:return'Subtracted two integers'print(sub_this(8,4))Tecnologia
Execute o código acima no terminal com o comando a seguir.
Será exibido um erro indicando que foi encontrado um valor de retorno "str" inesperado e que ele deveria ser "int".
Vamos alterar o retorno para a subtração dos dois inteiros, de modo que um inteiro seja devolvido.
defsub_this(x:int,y:int)->int:return x - y
print(sub_this(8,4))Tecnologia
Os resultados acima mostram que a mensagem de sucesso foi impressa e nenhum problema foi encontrado.
Parabéns
Parabéns, você chegou ao fim deste tutorial!
Neste tutorial, você aprendeu sobre verificação de tipos, diferentes sistemas de tipos em várias linguagens, os métodos do Python ('type()' e 'isinstance()'), além de duck typing e type hinting combinado com 'mypy'.
Neste tutorial de Python, você vai explorar conversões implícitas e explícitas de tipos de dados, tanto em estruturas primitivas quanto não primitivas, com a ajuda de exemplos de código!
Introdução às estruturas de dados do Python: saiba mais sobre tipos de dados e estruturas de dados primitivas e não primitivas, como strings, listas, pilhas etc.
Descubra como escrever funções em Python reutilizáveis e eficientes. Domine parâmetros, instruções de retorno e temas avançados como funções lambda. Organize melhor seu código com main() e outras boas práticas.
Em Python, tudo é objeto. Números, cadeias de caracteres (strings), DataFrames, e até mesmo funções são objetos. Especificamente, qualquer coisa que você usa no Python tem uma classe, um modelo associado por trás.
Mergulhe na ciência de dados com Python para analisar e visualizar seus dados de forma eficaz. Não precisa ter experiência ou conhecimento em programação.
A própria ajuda do interpretador faz a verificação de tipos em Python. Como o Python é uma linguagem dinâmica, ele não obriga você a declarar o tipo dos objetos, o que pode gerar bugs e tornar os erros mais difíceis de detectar. Para contornar isso, é possível usar Python em conjunto com outras ferramentas e implementar recursos de verificação estática de tipos, além do seu próprio duck typing.
Existem dois tipos de sistemas de tipos adotados por diferentes linguagens de programação, mostrados abaixo.
Linguagem de tipagem estática
A verificação do tipo da variável é feita em tempo de compilação. Além disso, o sistema de tipos da linguagem exige declarar explicitamente o "tipo de dado" da variável antes do uso. Linguagens com tipagem estática incluem: Scala, Java, C++, etc.
Por exemplo, a declaração de String em Scala é definida abaixo:
var myCar:String = "Mercedes";O código acima mostra que a variável 'myCar' é declarada explicitamente com o tipo de dado 'String' e o valor 'Mercedes'.
Linguagem de tipagem dinâmica
A verificação do tipo da variável é feita em tempo de execução. Além disso, o sistema de tipos da linguagem não obriga a declarar explicitamente o "tipo de dado" da variável antes do uso. Linguagens com tipagem dinâmica incluem: Python, JavaScript, Ruby, etc.
Por exemplo, a String em Python é definida abaixo:
myCar = "Mercedes"O código acima mostra que a variável 'myCar' não precisa ser declarada explicitamente.
'type()' e 'isinstance()' em Python
Os tipos das variáveis podem ser conhecidos usando o próprio 'type()' do Python. O 'type()' pode ser usado em tempo de execução para depuração, ajudando a identificar os tipos exatos das variáveis no programa. Vamos ver o tipo de algumas variáveis no exemplo abaixo.
O código acima exibirá 'int'. Como o tipo de dado da variável é inteiro, 'type()' identifica isso.
O 'insinstance('obj','class')' do Python pode ser usado para saber se 'obj', que é o objeto, é instância da classe ou não. O valor retornado é booleano e pode ser True ou False.
O código acima exibirá True. Como o tipo de dado da variável é string, 'isinstance()' identifica isso.
Duck typing em Python
Há um princípio popular em Python: "Se parece um pato, nada como um pato e grasna como um pato, então provavelmente é um pato." Em resumo, o princípio diz que o tipo do objeto ou da classe não importa; se o objeto tiver métodos e propriedades compatíveis, ele pode ser usado para um determinado propósito.
Veja um exemplo para deixar isso mais claro.
No exemplo abaixo, existem duas classes: 'Duck' e 'Human'. Duck é uma classe que contém os métodos quack e fly. Da mesma forma, Human é uma classe com seus próprios métodos 'quack' e 'fly'. Duck e Human são classes diferentes e, portanto, objetos (tipos) diferentes. No entanto, Human contém métodos semelhantes ('fly' e 'quack') aos de Duck. Há também a função 'fly_quack', que funciona com algo que se parece mais com 'Duck' do que com 'Human' porque consegue voar e grasnar.
Vamos criar uma instância de 'Duck' como du e passar para a função 'fly_quack(du)'. Da mesma forma, uma instância de Human 'h' é criada e passada para a função 'fly_quack(h)'.
A saída do código acima é a seguinte:
Embora 'Human' seja uma classe diferente de 'Duck', o Python chama a função 'fly_quack' para o humano também. Mesmo com tipos de objetos diferentes, como 'Human' tem métodos semelhantes (quack e fly), ele se comporta como o necessário e fornece os métodos requeridos.
Type hint e mypy
Há um aspecto poderoso em linguagens de tipagem dinâmica como Python: o código fica acessível e legível. Mas há desvantagens. Uma delas é encontrar erros em tempo de execução, já que Python não impõe o tipo das variáveis. Isso pode gerar erros e bugs que ficam difíceis de detectar à medida que o código cresce.
O Python implementou type hints a partir da versão 3.5. Versões mais antigas podem não oferecer suporte a type hints.
Veja um exemplo simples sem type hinting e sem mypy.
A função abaixo deveria fazer a subtração de inteiros, subtraindo dois números inteiros e retornando o valor.
A função acima precisaria aceitar dois inteiros 'x' e 'y', mas como não há regras impostas, ela pode receber qualquer tipo de dado. Além disso, o retorno pode ser qualquer coisa: aqui é retornada a 'str' ('Subtraction'), quando o esperado seria um 'int'.
Vamos ver uma implementação semelhante usando type hints e 'mypy', que ajudam a aplicar verificação estática de tipos e reduzem erros e bugs no programa com muito mais facilidade.
'mypy' é um módulo Python que ajuda na verificação estática de tipos, combinando a verificação dinâmica (duck typing) do próprio Python com type hints.
Você precisa instalar o pacote 'mypy'
pip install mypyCrie um arquivo chamado 'mypy_example.py' na sua máquina local e digite o código a seguir.
O código abaixo é um programa simples que aceita dois inteiros como parâmetros e, após '->', indica o tipo de retorno, que também é um 'int'. No entanto, a função deveria retornar um int, mas retorna a string 'Subtracted two integers'.
Execute o código acima no terminal com o comando a seguir.
Será exibido um erro indicando que foi encontrado um valor de retorno "str" inesperado e que ele deveria ser "int".
Vamos alterar o retorno para a subtração dos dois inteiros, de modo que um inteiro seja devolvido.
Os resultados acima mostram que a mensagem de sucesso foi impressa e nenhum problema foi encontrado.
Parabéns
Parabéns, você chegou ao fim deste tutorial!
Neste tutorial, você aprendeu sobre verificação de tipos, diferentes sistemas de tipos em várias linguagens, os métodos do Python ('type()' e 'isinstance()'), além de duck typing e type hinting combinado com 'mypy'.
Se você quiser aprender mais sobre Python, faça o curso Software Engineering for Data Scientists in Python da DataCamp.
Referências: