Atualizações do Python 3.9 explicadas com exemplos práticos de código

Atualizações do Python 3.9 explicadas com exemplos práticos de código

16 de October, 2020 0 By António César de Andrade


A última versão estável do Python foi lançada!

Entusiastas de código aberto de todo o mundo têm trabalhado em recursos novos, aprimorados e obsoletos em Python no ano passado.

Embora as versões beta estejam sendo lançadas há algum tempo, o lançamento oficial do Python 3.9.0 aconteceu em 5 de outubro de 2020.

A documentação oficial contém todos os detalhes dos últimos recursos e changelog. Ao longo desta postagem, vou orientá-lo em alguns recursos interessantes que podem ser úteis em suas tarefas de programação do dia a dia.

Verificaremos o seguinte:

  • Digite dicas genéricas e funções flexíveis e anotações variáveis
  • Operadores sindicais em dicionários
  • zoneinfo – Acessando e calculando fusos horários
  • Métodos de string para remover prefixos e sufixos
  • Outros destaques do lançamento

Para me acompanhar ou experimentar os novos recursos, você deve ter o Python 3.9 instalado.

Eu usei um gerente de ambiente chamado pyenv (como alternativa, você pode usar o conda) para obter a versão mais recente instalada junto com a minha versão atual. Você também pode executá-lo usando o imagem oficial do docker.

As anotações de função existem desde o Python 3.0 e nos permitem adicionar metadados às funções do Python. Então, o que há de novo no Python 3.9?

Python 3.9 adicionado PEP 593. Ele introduziu um mecanismo para estender as anotações de tipo de PEP 484 que fornece a semântica padrão para anotações e sugere que as anotações sejam usadas para dicas de tipo.

Agora, pode haver muitos outros casos de uso para anotações além da sugestão de tipo. Então PEP 593 introduzido typing.Annotated que permite adicionar mais detalhes aos metadados.

Vamos tentar entender isso melhor por meio de um exemplo para Python 3.8 e 3.9.

Python 3.8

def currency_exchange(eur: "euros", rate: "exchange rate") -> "euro to USD":
    """Converting Euros to USD using the exchange rate"""
    return eur * rate

Esta é uma função simples que converte euros em dólares americanos usando a taxa de câmbio. Usamos as anotações para servir de documentação para o usuário.

Python 3.9

from typing import Annotated
def currency_exchange(eur: Annotated[float, "euros"], rate: Annotated[float, "exchange rate"]) -> Annotated[float, "euro to dollars"]:
    """Converting Euros to Dollars using the exchange rate"""
    return eur * rate

Aqui, estamos usando o recém-introduzido Annotated isso leva pelo menos dois argumentos. O primeiro argumento (float no exemplo) estabelece a dica de tipo e o restante dos argumentos são metadados arbitrários da função.

O usuário / desenvolvedor também pode verificar essas anotações usando o __annotations__ atributo:

Também podemos verificar o tipo usando o get_type_hint() função:

Digite Hinting Generics em coleções padrão

Tipos de dados básicos como int, str ou bool são simples de anotar.

A tipagem estática anterior foi construída incrementalmente em cima do Python runtime existente e restringida por ele. Isso levou a uma hierarquia de coleção duplicada no módulo de digitação devido aos genéricos – isto é, tínhamos ambos typing.List e a lista integrada.

Com os genéricos, temos a questão da parametrização devido à sua estrutura de armazenamento (que é um container). E por essas razões, não fomos capazes de usar list(float) ou list[float] como o tipo sugere diretamente. Em vez disso, precisávamos de um módulo de digitação para fazer isso.

Dentro Python 3.9, essa hierarquia duplicada não é mais necessária. Podemos anotá-los diretamente:

scores: list(float)

Dois dos recursos mais interessantes e úteis do Python 3.9 são os operadores de mesclagem (|) e atualização (| =) adicionados ao integrado dict classe.

As formas existentes (3.8) de fundir dois dictos têm muitas deficiências:

Python 3.8

  • A descompactação do Dict parece feia e não é facilmente detectável.

python = {2000: "2.0.1", 2008: "2.6.9", 2010: "2.7.18"}
python3 = {2008: "3.0.1", 2009: "3.1.5", 2016: "3.6.12", 2020: "3.9.0"}

##merging two dictionaries
{**python, **python3}

  • Outro método é dict.update, que modifica o dicionário original no local:

Python 3.9

PEP 584 introduziu dois novos operadores para dicionários:

  • (|) sindicato – para mesclar dois dicionários. Ele preserva os dicionários originais.
  • (| =) atualização – isso é para mesclagem de dicionários no local.

python = {2000: "2.0.1", 2008: "2.6.9", 2010: "2.7.18"}
python3 = {2008: "3.0.1", 2009: "3.1.5", 2016: "3.6.12", 2020: "3.9.0"}

##merging two dictionaries
python | python3

Dictos originais preservados:

python |= python3
python

O operador de atualização mescla os dicionários e atualiza o dicionário à esquerda do operador enquanto mantendo os últimos valores para as chaves sobrepostas nos dois dictos.

Datas e horários desempenham um papel central em muitas aplicações. Python oferece suporte abrangente por meio do datetime módulo na biblioteca padrão. Mas sempre houve uma lacuna em relação à integração de fusos horários a esses carimbos de data / hora.

Até agora, tínhamos bibliotecas de terceiros, como dateutil, para implementar essas regras específicas de fuso horário.

Mas agora o Python 3.9 adicionou um novo zoneinfo módulo que permite acessar e usar todo o banco de dados de fuso horário da Autoridade para atribuição de números da Internet (IANA).

Python 3.8

Até agora, acessamos timestamps com reconhecimento de fuso horário usando o tzinfo argumento da seguinte forma:

from datetime import datetime, timezone

datetime.now(tz=timezone.utc)

Python 3.9

Mas com a adição de zoneinfo, agora temos acesso ao Banco de dados de fuso horário IANA.

from zoneinfo import ZoneInfo

ZoneInfo("Asia/Kolkata")

Podemos fazer um monte de operações com fusos horários, e a interconversão se tornou muito fácil:

from datetime import datetime
from zoneinfo import ZoneInfo

post_date = datetime(2020, 10, 10, 18, 10, tzinfo=ZoneInfo("America/Vancouver"))

post_date.astimezone(ZoneInfo("Asia/Kolkata"))

PEP 616 introduziu novos métodos para retirar prefixos e sufixos de strings. Os novos métodos são:

  • removeprefix ()
  • removeesuffix ()

Muitos problemas recorrentes foram relatados em todos os principais fóruns (como StackOverflow) em torno do lstrip() e rstrip() métodos.

Python 3.8

Estamos removendo caracteres de ambas as extremidades da string usando o método strip () da seguinte maneira:

"Python 3.9 is out".strip(" Python")

Isso removeu a substring presente nas extremidades da string. Se você olhar com atenção, isso removeu os caracteres individuais em “python”, ou seja, “”, “p”, “y”, “t”, “h”, “o” e “n”.

Python 3.9

Para se livrar do prefixo de uma string, agora temos removeprefix():

"Python 3.9 is out".removeprefix("Python ")

Você pode verificar isso com uma série de outras permutações e combinações com o removesuffix() método também.

Além desses, vários outros recursos também foram introduzidos. Aqui está a lista junto com os IDs PEP:

  • PEP 617, CPython agora usa um novo analisador baseado em PEG – Python agora tem um novo analisador ao lado do antigo analisador LL (1). Você pode optar por executar seu programa usando qualquer um dos analisadores usando o comando:

python -X oldparser script_name.py

Os analisadores PEG são mais robustos e poderosos de acordo com a pesquisa de Guido van Rossum (ele é o criador do Python). O objetivo do analisador PEG seria produzir o mesmo árvore de sintaxe abstrata (AST) como o antigo analisador LL (1).

  • Inicialização multifásica agora está disponível para uso em vários módulos Python ( audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref)

Aqui está um exemplo de cálculo de GCD / LCM de mais de dois números usando a biblioteca matemática:

  • PEP 602 CPython agora adota um novo ciclo de lançamento anual – Eles serão mais consistentes com seus lançamentos e obterão novas versões a cada outubro.
  • PEP 614, restrições gramaticais relaxadas sobre decoradores – uma sintaxe mais flexível agora está disponível para pessoas que trabalham em estruturas de GUI como PyQT. Isso dispensa a limitação de decoradores que consistem em um nome pontilhado. Mais detalhes podem ser lidos aqui.

Para saber mais sobre os detalhes de cada um desses recursos, vá para o oficial documentação.

3.9.0 é um grande marco na jornada de desenvolvimento do Python e para a comunidade. Novos aprimoramentos estão sendo adicionados neste momento e o 3.10 também terá recursos promissores.

Por enquanto, você deve experimentar esses recursos em breve, que serão amplamente usados, introduzidos em Python 3.9.

Tente executar seus programas existentes usando Python 3.9 e veja se a atualização valeria a pena para você.

Você também deve experimentar o novo analisador, que se diz promissor. Mas só saberemos com certeza após testes consideráveis ​​em vários casos de uso.

Com este canal, estou planejando lançar alguns série cobrindo todo o espaço da ciência de dados. Aqui está porque você deve se inscrever no canal:

Sinta-se à vontade para se conectar comigo no Twitter ou LinkedIn.





Fonte

Click to rate this post!
[Total: 0 Average: 0]