Dicas de tipo Python

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 nameparâ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 JohnLinguagem de código:  Python  ( python )

Nesta nova sintaxe, o nameparâmetro tem o strtipo:

name: strLinguagem de código:  Python  ( python )

E o valor de retorno da say_hi()função também tem o tipo str:

-> strLinguagem de código:  Python  ( python )

Além do strtipo, você pode usar outros tipos integrados, como int, float, boole bytespara 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 123Linguagem 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 pipcomando:

pip instal mypyLinguagem 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.pyLinguagem 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_hienquanto into tipo esperado é str.

Se você alterar o argumento para uma string e executá-lo mypynovamente, será exibida uma mensagem de sucesso:

Success: no issues found in 1 source fileLinguagem 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 namevariável é str. Se você atribuir um valor que não seja uma string à namevariável, o verificador de tipo estático emitirá um erro. Por exemplo:

name: str = 'Hello'
name = 100Linguagem 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 = 100Linguagem 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 + yLinguagem 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 Uniondo typingmódulo:

from typing import UnionLinguagem de código:  Python  ( python )

Segundo, use o Unionpara criar um tipo de união que inclua inte float:

def add(x: Union[int, float], y: Union[int, float]) -> Union[int, float]:
    return x + yLinguagem 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 + yLinguagem 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 + yLinguagem 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 + yLinguagem de código:  Python  ( python )

Neste exemplo, atribuímos ao Union[int, float]tipo um alias Numbere usamos o Numberalias 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *