Resumo : neste tutorial, você aprenderá sobre as dicas de tipo do Python e como usar a ferramenta mypy para verificar os tipos estaticamente.
Introdução às dicas de tipo Python
Algumas linguagens de programação possuem tipagem estática, como C/C++. Isso significa que você precisa declarar antecipadamente tipos de variáveis, parâmetros e valores de retorno de uma função. Os tipos predefinidos permitem que os compiladores verifiquem o código antes de compilar e executar o programa.
Python usa tipagem dinâmica, na qual as variáveis, parâmetros e valores de retorno de uma função podem ser de qualquer tipo. Além disso, os tipos de variáveis podem mudar enquanto o programa é executado.
Geralmente, a digitação dinâmica facilita a programação e causa erros inesperados que você só pode descobrir até que o programa seja executado.
As dicas de tipo do Python fornecem digitação estática opcional para aproveitar o melhor da digitação estática e dinâmica.
O exemplo a seguir define uma função simples que aceita uma string e retorna outra string:
def say_hi(name):
return f'Hi {name}'
greeting = say_hi('John')
print(greeting)
Linguagem de código: Python ( python )
Aqui está a sintaxe para adicionar dicas de tipo a um parâmetro e valor de retorno de uma função:
parameter: type
-> type
Por exemplo, o seguinte mostra como usar dicas de tipo para o name
parâmetro e valor de retorno da say_hi()
função:
def say_hi(name: str) -> str:
return f'Hi {name}'
greeting = say_hi('John')
print(greeting)
Linguagem de código: Python ( python )
Saída:
Hi John
Linguagem de código: Python ( python )
Nesta nova sintaxe, o name
parâmetro tem o str
tipo:
name: str
Linguagem de código: Python ( python )
E o valor de retorno da say_hi()
função também tem o tipo str
:
-> str
Linguagem de código: Python ( python )
Além do str
tipo, você pode usar outros tipos integrados, como int
, float
, bool
e bytes
para dicas de tipo.
É importante observar que o interpretador Python ignora completamente as dicas de tipo. Se você passar um número para a say_hi()
função, o programa será executado sem nenhum aviso ou erro:
def say_hi(name: str) -> str:
return f'Hi {name}'
greeting = say_hi(123)
print(greeting)
Linguagem de código: Python ( python )
Saída:
Hi 123
Linguagem de código: Python ( python )
Para verificar a sintaxe das dicas de tipo, você precisa usar uma ferramenta de verificação de tipo estático.
Usando uma ferramenta de verificação de tipo estático: mypy
Python não possui uma ferramenta oficial de verificação de tipo estático. No momento, a ferramenta de terceiros mais popular é o Mypy. Como Mypy é um pacote de terceiros, você precisa instalá-lo usando o seguinte pip
comando:
pip instal mypy
Linguagem de código: Python ( python )
Uma vez instalado mypy
, você pode usá-lo para verificar o tipo antes de executar o programa usando o seguinte comando:
mypy app.py
Linguagem de código: Python ( python )
Ele mostrará a seguinte mensagem:
app.py:5: error: Argument 1 to "say_hi" has incompatible type "int"; expected "str"
Found 1 error in 1 file (checked 1 source file)
Linguagem de código: Python ( python )
O erro indica que o argumento de is say_hi
enquanto int
o tipo esperado é str
.
Se você alterar o argumento para uma string e executá-lo mypy
novamente, será exibida uma mensagem de sucesso:
Success: no issues found in 1 source file
Linguagem de código: Python ( python )
Dicas de tipo e inferência de tipo
Ao definir uma variável, você pode adicionar uma dica de tipo como esta:
name: str = 'John'
Linguagem de código: Python ( python )
O tipo de name
variável é str
. Se você atribuir um valor que não seja uma string à name
variável, o verificador de tipo estático emitirá um erro. Por exemplo:
name: str = 'Hello'
name = 100
Linguagem de código: Python ( python )
Erro:
app.py:2: error: Incompatible types in assignment (expression has type "int", variable has type "str")
Found 1 error in 1 file (checked 1 source file)
Linguagem de código: Python ( python )
Adicionar um tipo a uma variável é desnecessário porque os verificadores de tipo estático normalmente podem inferir o tipo com base no valor atribuído à variável.
Neste exemplo, o valor do nome é uma string literal para que o verificador de tipo estático inferirá o tipo da variável nome como str. Por exemplo:
name = 'Hello'
name = 100
Linguagem de código: Python ( python )
Irá emitir o mesmo erro:
app.py:2: error: Incompatible types in assignment (expression has type "int", variable has type "str")
Found 1 error in 1 file (checked 1 source file)
Linguagem de código: Python ( python )
Adicionando dicas de tipo para vários tipos
A add()
função a seguir retorna a soma de dois números:
def add(x, y):
return x + y
Linguagem de código: Python ( python )
Os números podem ser inteiros ou flutuantes. Você pode usar o módulo para definir dicas de tipo para vários tipos.
Primeiro, importe Union
do typing
módulo:
from typing import Union
Linguagem de código: Python ( python )
Segundo, use o Union
para criar um tipo de união que inclua int
e float
:
def add(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
return x + y
Linguagem de código: Python ( python )
Aqui está o código-fonte completo:
from typing import Union
def add(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
return x + y
Linguagem de código: Python ( python )
A partir do Python 3.10, você pode usar o X | Sintaxe Y para criar um tipo de união, por exemplo:
def add(x: int | float, y: int | float) -> int | float:
return x + y
Linguagem de código: Python ( python )
Aliases de tipo
Python permite atribuir um alias a um tipo e usá-lo para dicas de tipo. Por exemplo:
from typing import Union
number = Union[int, float]
def add(x: number, y: number) -> number:
return x + y
Linguagem de código: Python ( python )
Neste exemplo, atribuímos ao Union[int, float]
tipo um alias Number
e usamos o Number
alias na função add().
Adicionando dicas de tipo para listas, dicionários e conjuntos
Você pode usar os seguintes tipos integrados para definir as dicas de tipo para uma lista , um dicionário e um conjunto :
- lista
- ditar
- definir
Se você digitar dicas em uma variável como uma lista, mas posteriormente atribuir um dicionário a ela, você receberá um erro:
ratings: list = [1, 2, 3]
ratings = {1: 'Bad', 2: 'average', 3: 'Good'}
Linguagem de código: Python ( python )
Erro:
app.py:3: error: Incompatible types in assignment (expression has type "Dict[int, str]", variable has type "List[Any]")
Found 1 error in 1 file (checked 1 source file)
Linguagem de código: Python ( python )
Para especificar os tipos de valores na lista, dicionário e conjuntos, você pode usar aliases de tipo do módulo de digitação:
Digite Alias | Tipo integrado |
---|---|
Lista | lista |
Tupla | tupla |
Ditado | ditar |
Definir | definir |
Conjunto congelado | conjunto congelado |
Seqüência | Para lista, tupla e qualquer outro tipo de dados de sequência. |
Mapeamento | Para dicionário (dict), set, frozenset e qualquer outro tipo de dados de mapeamento |
ByteString | tipos bytes, bytearray e memoryview. |
Por exemplo, o seguinte define uma lista de inteiros:
from typing import List
ratings: List[int] = [1, 2, 3]
Linguagem de código: Python ( python )
Nenhum tipo
Se uma função não retornar explicitamente um valor, você poderá usar None para digitar dica do valor de retorno. Por exemplo:
def log(message: str) -> None:
print(message)
Linguagem de código: Python ( python )
Resumo
- Use dicas de tipo e ferramentas de verificação de tipo estático para tornar seu código mais robusto.