Após um ano de desenvolvimento, uma versão significativa da linguagem de programação Python 3.10 foi lançada. Este novo ramo será mantido por um ano e meio, após o qual correções de segurança serão oferecidas por mais três anos e meio.
Simultaneamente, começou a fase de testes alpha do ramo Python 3.11 (de acordo com o novo cronograma de desenvolvimento, o trabalho em um novo ramo começa cinco meses antes do lançamento do ramo anterior, alcançando a fase de alpha até a data do próximo lançamento). O ramo Python 3.11 permanecerá em lançamentos alpha por sete meses, durante os quais novas funcionalidades serão adicionadas e correções de bugs serão realizadas. Depois disso, haverá um período de três meses de testes beta, durante o qual a adição de novas funcionalidades será proibida e toda a atenção será dedicada à correção de erros. Os últimos dois meses antes do lançamento serão dedicados aos candidatos a lançamento, momento em que será feita a estabilização final.
Entre as novidades adicionadas ao Python 3.10:
- Foram implementados os operadores «match» e «case» para correspondência com padrões, que melhoram a legibilidade do código, simplificam a correspondência de objetos Python arbitrários e aumentam a confiabilidade do código graças à possibilidade de verificação de tipos estáticos aprimorada. A implementação se assemelha muito ao operador «match» disponível nas linguagens Scala, Rust e F#, que compara o resultado da execução da expressão especificada com uma lista de padrões listados nos blocos baseados no operador «case».
def http_error(status): match status: case 400: return «Bad request» case 401|403|404: return «Not allowed» case 418: return «I’m a teapot» case _: return «Something else»
É possível desempacotar objetos, tuplas, listas e sequências arbitrárias para vincular variáveis com base nos valores disponíveis. É permitido definir modelos aninhados, usar condições adicionais "if" no modelo, aplicar máscaras ("[x, y, *rest]"), mapear pares chave/valor (por exemplo, {"bandwidth": b, "latency": l} para extrair os valores "bandwidth" e "latency" de um dicionário), extrair submodelos (operador ":=") e usar constantes nomeadas no modelo. Nas classes, é possível configurar o comportamento durante a correspondência com o método "__match__()".
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origem") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("Em outro lugar") case _: print("Não é um ponto") match point: case Point(x, y) if x == y: print(f"Y=X em {x}") case Point(x, y): print(f"Não na diagonal") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("Eu vejo vermelho!") case GREEN: print("A grama é verde") case BLUE: print("Estou sentindo blues :(")
- Foi fornecida a possibilidade de usar parênteses no operador with para distribuir a definição de coleções de gerenciadores de contexto em várias linhas. Inclusive, é permitido deixar uma vírgula após o gerenciador de contexto final no grupo: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Melhorou a informação sobre a localização no código de erros relacionados a chaves de colchete não fechadas e aspas em literais de string. Por exemplo, em vez de informar sobre um erro de sintaxe na construção seguinte devido a uma chave de colchete não fechada, o ponteiro agora destaca a chave de colchete de abertura e informa sobre a ausência do bloco de fechamento. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ' ' was never closed
Mensagens de erro de sintaxe especializadas adicionais foram adicionadas: falta do caractere ‘:’ antes de um bloco e em dicionários, não destacar tuplas entre parênteses, falta de vírgula em listas, indicação de bloco ‘try’ sem ‘except’ e ‘finally’, uso de ‘=’ em vez de ‘==’ em comparações, e indicação de expressões * nas f-strings. Além disso, agora é destacado toda a expressão problemática e não apenas seu início, além de um aviso mais claro sobre o contexto de erros relacionados à formatação incorreta de recuos. >>> def foo(): … if lel: … x = 2 File ‘’, line 3 x = 2 ^ IndentationError: expected an indented block after ‘if’ statement in line 2
Para erros causados por erros de digitação no nome de atributos e nomes de variáveis em funções, uma recomendação com o nome correto é fornecida. >>> collections.namedtoplo Traceback (most recent call last): File ‘’, line 1, in AttributeError: module ‘collections’ has no attribute ‘namedtoplo’. Did you mean: namedtuple?
- Para ferramentas de depuração e profiler, foi garantido que eventos de rastreamento indiquem os números de linha exatos do código executado.
- Foi adicionada a configuração sys.flags.warn_default_encoding para exibir um aviso sobre potenciais erros relacionados ao processamento em TextIOWrapper e na abertura de arquivos com open() em UTF-8 sem a opção explícita ‘encoding="utf-8"‘ (a codificação padrão utilizada é ASCII). Além disso, nesta nova versão, foi incluída a possibilidade de especificar o valor ‘encoding="locale"‘ para definir a codificação com base na localidade atual.
- No módulo typing, que fornece ferramentas para definir anotações de tipo, foi adicionado um novo operador que permite usar a sintaxe ‘X | Y’ para escolher um dos tipos (tipo X ou tipo Y). def square(number: int | float) -> int | float: return number ** 2 equivalente à construção suportada anteriormente: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- No módulo typing, foi adicionado o operador Concatenate e a variável ParamSpec, que permitem passar informações adicionais para a verificação estática de tipos ao usar Callable. Também foram adicionados valores especiais TypeGuard ao módulo typing para anotar funções de proteção de tipos e TypeAlias para definir explicitamente um alias de tipo. StrCache: TypeAlias = ‘Cache[str]’ # um alias de tipo
- Na função zip() foi implementado um sinalizador opcional "strict", que verifica se os argumentos iterados têm o mesmo comprimento. >>> list(zip((‘a’, ‘b’, ‘c’), (1, 2, 3), strict=True)) [(‘a’, 1), (‘b’, 2), (‘c’, 3)] >>> list(zip(range(3), [‘fee’, ‘fi’, ‘fo’, ‘fum’], strict=True)) Traceback (most recent call last): … ValueError: zip() argumento 2 é mais longo que o argumento 1
- Novas funções integradas aiter() e anext() foram propostas, implementando análogos assíncronos às funções iter() e next().
- A velocidade dos construtores str(), bytes() e bytearray() foi aumentada em 30-40% ao trabalhar com objetos pequenos.
- O número de operações de importação no módulo runpy foi reduzido. O comando "python3 -m nome_do_módulo" agora é executado em média 1,4 vezes mais rápido devido à redução dos módulos importados de 69 para 51.
- Na instrução LOAD_ATTR foi implementado um mecanismo de cache de opcodes individuais, que permitiu acelerar o trabalho com atributos comuns em até 36%, e com slots até 44%.
- Ao compilar o Python com a opção "—enable-optimizations", o modo "-fno-semantic-interposition" agora é ativado, permitindo acelerar o trabalho do interpretador em até 30% em comparação com a compilação com a opção "—enable-shared".
- Nos módulos hashlib e ssl foi adicionada a supporte para OpenSSL 3.0.0 e a suporte para versões do OpenSSL mais antigas que 1.1.1 foi descontinuada.
- O antigo parser foi removido, sendo substituído pelo parser PEG (Parsing Expression Grammar) na versão anterior. O módulo formatter foi removido. O parâmetro loop foi removido da API asyncio. Métodos anteriormente declarados obsoletos foram removidos. Funções Py_UNICODE_str*, que manipulavam strings Py_UNICODE*, foram removidas.
- O módulo distutils foi declarado obsoleto e está programado para remoção no Python 3.12. Recomenda-se o uso dos módulos setuptools, packaging, platform, shutil, subprocess e sysconfig em vez do distutils. A estrutura wstr foi incluída na lista de obsoletos e programada para remoção no PyUnicodeObject.
Fonte: opennet.ru
