Lançamento da linguagem de programação Python 3.9

Após um ano de desenvolvimento apresentado lançamento significativo de linguagem de programação Python 3.9. Python 3.9 foi o primeiro lançamento depois перехода projeto em novo ciclo preparação e suporte de lançamentos. Agora, novos lançamentos principais serão gerados uma vez por ano e atualizações corretivas serão lançadas a cada dois meses. Cada filial significativa terá suporte por um ano e meio, após o qual serão desenvolvidos mais três anos e meio para corrigir vulnerabilidades.

O trabalho em uma nova filial agora começa cinco meses antes do lançamento da próxima filial, ou seja, coincidindo com o lançamento do Python 3.9 começou teste alfa do branch Python 3.10. O branch Python 3.10 estará em versão alfa por sete meses, durante os quais novos recursos serão adicionados e bugs corrigidos. Depois disso, as versões beta serão testadas por três meses, durante os quais será proibida a adição de novos recursos e toda atenção será dada à correção de bugs. Nos últimos dois meses antes do lançamento, a filial estará na fase de release candidate, na qual será realizada a estabilização final.

Entre os adicionado inovações em Python 3.9:

  • Em dicionários definidos usando a classe dict integrada, apareceu suporte para operadores de mesclagem "|" e atualizações "|=", que complementam os métodos {**d1, **d2} e dict.update propostos anteriormente para mesclar dicionários.

    >>> x = {"chave1": "valor1 de x", "chave2": "valor2 de x"}
    >>> y = {"chave2": "valor2 de y", "chave3": "valor3 de y"}

    >>> x | sim
    {'chave1': 'valor1 de x', 'chave2': 'valor2 de y', 'chave3': 'valor3 de y'}

    >>> e | x
    {'chave2': 'valor2 de x', 'chave3': 'valor3 de y', 'chave1': 'valor1 de x'}

  • A coleção interna de tipos inclui list, dict e tuple, que podem ser usados ​​como tipos base sem importar do módulo de digitação. Aqueles. em vez de digitação.List, digitação.Dict e digitação.Tuple agora você pode especificar
    apenas listar, ditar e tupla:

    def greet_all(nomes: lista[str]) -> Nenhum:
    para nome em nomes:
    print("Olá", nome)

  • São fornecidos ferramentas flexíveis para anotar funções e variáveis. Para anexar anotações, um novo tipo Anotado foi adicionado ao módulo de digitação, estendendo os tipos existentes com metadados adicionais que podem ser usados ​​para análise estática ou para otimizações em tempo de execução. Para acessar metadados do código, o parâmetro include_extras foi adicionado ao método tipagem.get_type_hints().

    charType = Anotado[int, ctype("char")] UnsignedShort = Anotado[int, struct2.ctype('H')]

  • Atenuado requisitos gramaticais para decoradores - qualquer expressão adequada para uso em blocos if e while agora pode ser usada como decorador. A mudança melhorou significativamente a legibilidade do código PyQt5 e simplificou a manutenção deste módulo:

    Foi:
    button_0 = botões[0] @button_0.clicked.connect

    Agora você pode escrever:
    @buttons[0].clicked.connect

  • Para a biblioteca padrão adicionado módulo Zoneinfo, que inclui informações do banco de dados de fuso horário da IANA.

    >>> de zoneinfo importar ZoneInfo
    >>> de importação de data e hora data e hora, timedelta
    >>> # Horário de verão
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("América/Los_Angeles"))
    >>> imprimir(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Horário padrão
    >>> dt += timedelta(dias=7)
    >>> imprimir(dt)
    2020-11-07 12:00:00-08:00

    >>> imprimir(dt.tzname())
    PST

  • Adicionado módulo graphlib, no qual implementado suporte para classificação topológica de gráficos.
  • Proposto novos métodos para remover prefixos e finais de linha - str.removeprefix(prefix) e str.removesuffix(suffix). Métodos foram adicionados aos objetos str, bytes, bytearray e Collections.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'Bar'

  • Envolvido novo analisador PEG (Parsing Expression Grammar), que substituiu o analisador LL (1). A utilização do novo analisador permitiu eliminar alguns dos “hacks” utilizados para contornar as restrições do LL(1) e reduziu significativamente os custos de mão-de-obra para manutenção do analisador. Em termos de desempenho, o novo analisador está aproximadamente no mesmo nível do anterior, mas está significativamente à frente dele em termos de flexibilidade, o que permite que você se sinta mais livre ao projetar novos recursos de linguagem. O código antigo do analisador é mantido por enquanto e pode ser retornado usando o sinalizador "-X oldparser" ou a variável de ambiente "PYTHONOLDPARSER=1", mas será removido na versão 3.10.
  • Fornecido por a capacidade dos métodos de extensão C acessarem o estado dos módulos nos quais são definidos usando desreferência direta do ponteiro em vez de procurar o estado do módulo usando a função PyState_FindModule. A alteração permite aumentar o desempenho dos módulos C, reduzindo ou eliminando completamente a sobrecarga de verificação do estado do módulo. Para associar um módulo a uma classe, é proposta a função C PyType_FromModuleAndSpec(), para obter o módulo e seu estado, são propostas as funções C PyType_GetModule() e PyType_GetModuleState(), e para fornecer um método com acesso à classe no qual é definido, são propostas a função C PyCMethod e a flag METH_METHOD.
  • Coletor de lixo entregue de bloquear coleções contendo objetos reanimados que permanecem acessíveis externamente após a execução do finalizador.
  • Método adicionado os.pidfd_open, que permite que o subsistema do kernel Linux "pidfd" seja usado para lidar com a situação de reutilização do PID (o pidfd está associado a um processo específico e não muda, enquanto um PID pode ser associado a outro processo após o processo atual associado a esse PID terminar ).
  • O suporte para a especificação Unicode foi atualizado para a versão 13.0.0.
  • Eliminado vazamento de memória ao reinicializar o interpretador Python no mesmo processo.
  • O desempenho dos tipos integrados range, tuple, set, frozenset, list e dict foi otimizado. implementado através do uso do protocolo de atalho Vectorcall para acesso mais rápido a objetos escritos na linguagem C.
  • Os módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operador, recurso, tempo e _weakref foram movidos para carregamento de inicialização em vários estágios.
  • Os módulos da biblioteca padrão audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib foram convertidos para uso restrito ABI estável, que resolve o problema da operabilidade de montagens de módulos de extensão para diferentes versões do Python (ao atualizar a versão, não há necessidade de reconstruir os módulos de extensão, e os módulos compilados para 3.9 poderão funcionar no branch 3.10).
  • O módulo asyncio tem suporte obsoleto para o parâmetro reuse_address devido a possíveis problemas de segurança (usar SO_REUSEADDR para UDP no Linux permite que diferentes processos conectem soquetes de escuta a uma porta UDP).
  • Novas otimizações foram adicionadas, por exemplo, melhor desempenho de manipuladores de sinal em aplicações multi-threaded, maior velocidade do módulo de subprocesso no ambiente FreeBSD e atribuição mais rápida de variáveis ​​temporárias (atribuindo uma variável na expressão “for y in [expr ]” agora tem o mesmo desempenho que a expressão “y = expr” "). Em geral, a maioria dos testes mostrar diminuição de desempenho em comparação com o branch 3.8 (a aceleração é observada apenas nos testes write_local e write_deque):

    Versão Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — —

    Acesso de leitura de variáveis ​​e atributos:
    leitura_local 7.1 7.1 5.4 5.1 3.9 4.0
    leitura_nãolocal 7.1 8.1 5.8 5.4 4.4 4.8
    leitura_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    método de leitura_bound 37.6 37.9 29.6 26.9 27.7 45.9

    Acesso de gravação de variáveis ​​e atributos:
    gravação_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Acesso de leitura da estrutura de dados:
    lista_leitura 24.2 24.5 20.8 20.8 19.0 21.1
    leitura_deque 24.7 25.5 20.2 20.6 19.8 21.6
    leitura_dict 24.3 25.7 22.3 23.0 21.0 22.5
    leitura_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Acesso de gravação à estrutura de dados:
    lista_de_gravação 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    escrever_dict 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operações de pilha (ou fila):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Ciclo de tempo:
    sobrecarga_de_loop 0.5 0.6 0.4 0.3 0.3 0.3

  • Removido muitas funções e métodos do Python 2.7 que foram obsoletos anteriormente e resultaram em um DeprecationWarning na versão anterior, incluindo o método unescape() em html.parser.HTMLParser,
    tostring() e fromstring() em array.array, isAlive() em threading.Thread, getchildren() e getiterator() em ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() e base64.decodestring().

Fonte: opennet.ru

Adicionar um comentário