Lanzamento da linguaxe de programación Python 3.9

Despois dun ano de desenvolvemento presentado versión significativa da linguaxe de programación python 3.9. Python 3.9 foi a primeira versión posterior transición proxecto en novo ciclo preparación e soporte de lanzamentos. Agora xeraranse novos lanzamentos importantes unha vez ao ano e as actualizacións correctoras publicaranse cada dous meses. Cada rama significativa terá soporte durante un ano e medio, despois de que se desenvolverán outros tres anos e medio para que corrixa as vulnerabilidades.

Os traballos nunha nova sucursal comezan agora cinco meses antes do lanzamento da seguinte rama, é dicir. coincidindo co lanzamento de Python 3.9 comezou probas alfa da rama Python 3.10. A rama de Python 3.10 estará en versión alfa durante sete meses, durante os cales engadiranse novas funcións e corrixiranse erros. Despois disto, probaranse as versións beta durante tres meses, durante os cales prohibirase engadir novas funcións e prestarase toda a atención á resolución de erros. Os dous últimos meses antes do lanzamento, a sucursal estará na fase de candidato á liberación, na que se realizará a estabilización final.

entre engadido innovacións en Python 3.9:

  • Nos dicionarios definidos mediante a clase dict integrada, apareceu soporte para operadores de combinación "|" e as actualizacións "|=", que complementan os métodos {**d1, **d2} e dict.update propostos anteriormente para combinar dicionarios.

    >>> x = {"key1": "valor 1 de x", "key2": "valor 2 de x"}
    >>> y = {"key2": "valor 2 de y", "key3": "valor 3 de y"}

    >>> x | y
    {'clave1': 'valor 1 de x', 'clave2': 'valor 2 de y', 'clave3': 'valor 3 de y'}

    >>> e | x
    {'key2': 'valor2 de x', 'key3': 'valor3 de y', 'key1': 'valor 1 de x'}

  • A colección integrada de tipos inclúe lista, dict e tupla, que se poden usar como tipos base sen importar desde o módulo de escritura. Eses. en vez de escribir.Lista, escribir.Dict e escribir.Agora podes especificar tupla
    só lista, dict e tupla:

    def greet_all(nomes: lista[str]) -> Ningún:
    para os nomes nos nomes:
    print("Ola", nome)

  • Se proporcionan ferramentas flexibles para anotar funcións e variables. Para anexar anotacións, engadiuse un novo tipo Anotado ao módulo de escritura, ampliando os tipos existentes con metadatos adicionais que se poden usar para análises estáticas ou para optimizacións de tempo de execución. Para acceder aos metadatos do código, engadiuse o parámetro include_extras ao método typing.get_type_hints().

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

  • Atenuado Requisitos gramaticais para os decoradores: calquera expresión adecuada para usar en bloques if e while agora pode usarse como decorador. O cambio mellorou significativamente a lexibilidade do código PyQt5 e simplificou o mantemento deste módulo:

    Foi:
    button_0 = buttons[0] @button_0.clicked.connect

    Agora podes escribir:
    @buttons[0].clicked.connect

  • Á biblioteca estándar engadido módulo zona info, que inclúe información da base de datos da zona horaria da IANA.

    >>> desde zoneinfo importar ZoneInfo
    >>> de datetime importar datahora, timedelta
    >>> # Tempo de verán
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> imprimir (dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Hora estándar
    >>> dt += timedelta(días=7)
    >>> imprimir (dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Engadiuse o módulo graphlib, no que implementado soporte para a ordenación topolóxica de gráficos.
  • Proposto novos métodos para eliminar prefixos e finais de liña: str.removeprefix(prefixo) e str.removesuffix(sufixo). Engadíronse métodos aos obxectos str, bytes, bytearray e collections.UserString.

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

  • Implicados novo analizador Peg (Parsing Expression Grammar), que substituíu o analizador LL (1). O uso do novo analizador permitiu desfacerse dalgúns dos "hacks" utilizados para evitar as restricións en LL(1) e reduciu significativamente os custos laborais para manter o analizador. En canto ao rendemento, o novo analizador está aproximadamente ao mesmo nivel que o anterior, pero está moi por diante en canto a flexibilidade, o que che permite sentirte máis libre ao deseñar novas funcións lingüísticas. O código do analizador antigo consérvase polo momento e pódese devolver usando a marca "-X oldparser" ou a variable de ambiente "PYTHONOLDPARSER=1", pero eliminarase na versión 3.10.
  • Fornecido a capacidade dos métodos de extensión C para acceder ao estado dos módulos nos que se definen mediante a desreferencia directa do punteiro en lugar de buscar o estado do módulo mediante a función PyState_FindModule. O cambio permítelle aumentar o rendemento dos módulos C reducindo ou eliminando completamente a sobrecarga de comprobar o estado do módulo. Para asociar un módulo a unha clase, proponse a función C PyType_FromModuleAndSpec(), para obter o módulo e o seu estado proponse as funcións C PyType_GetModule() e PyType_GetModuleState(), e para proporcionar un método con acceso á clase na que se define, proponse a función C PyCMethod e a bandeira METH_METHOD. .
  • Recolector de lixo entregado de bloqueo de coleccións que conteñan obxectos reanimados que permanecen accesibles externamente despois de que se execute o finalizador.
  • Método engadido os.pidfd_open, que permite que o subsistema do núcleo de Linux "pidfd" se use para xestionar a situación de reutilización do PID (pidfd está asociado a un proceso específico e non cambia, mentres que un PID pode asociarse a outro proceso despois de que o proceso actual asociado con ese PID remate ).
  • Actualizouse a compatibilidade coa especificación Unicode á versión 13.0.0.
  • Eliminado fuga de memoria ao reiniciar o intérprete de Python no mesmo proceso.
  • Optimizouse o rendemento do rango de tipos integrados, tupla, conxunto, conxunto conxelado, lista e dict. implementado mediante o uso do protocolo de atallo Vectorcall para un acceso máis rápido a obxectos escritos en linguaxe C.
  • Os módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time e _weakref movéronse para cargar desde inicialización en varias etapas.
  • Os módulos da biblioteca estándar audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib convertéronse para usar restrinxido ABI estable, que resolve o problema da operatividade dos conxuntos de módulos de extensión para diferentes versións de Python (ao actualizar a versión, non hai que reconstruír os módulos de extensión, e os módulos compilados para 3.9 poderán funcionar na rama 3.10).
  • O módulo asyncio deixou de admitir o parámetro reuse_address debido a posibles problemas de seguranza (o uso de SO_REUSEADDR para UDP en Linux permite que diferentes procesos conecten sockets de escoita a un porto UDP).
  • Engadíronse novas optimizacións, por exemplo, o rendemento mellorado dos controladores de sinal en aplicacións multiproceso, o aumento da velocidade do módulo de subprocesos no ambiente FreeBSD e unha asignación máis rápida de variables temporais (asignando unha variable na expresión "for y in [expr ]" agora é tan eficaz como a expresión "y = expr" "). En xeral, a maioría das probas espectáculo diminución do rendemento en comparación coa rama 3.8 (a aceleración só se observa nas probas write_local e write_deque):

    Versión de Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————————————

    Acceso de lectura a variables e atributos:
    read_local 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
    read_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_built 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
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Acceso de escritura a variables e atributos:
    escribir_local 8.7 9.3 5.5 5.3 4.3 4.2
    escribir_non local 10.5 11.1 5.6 5.5 4.7 4.9
    escribir_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
    escribir_instanciavar 44.6 45.8 40.0 38.9 35.5 40.7
    intervalos_de_instancia_de_escritura 35.6 36.1 27.3 26.6 25.7 27.7

    Acceso de lectura á estrutura de datos:
    ler_lista 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    ler_dicto 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Acceso de escritura á estrutura de datos:
    escribir_lista 27.1 28.5 22.5 21.6 20.0 21.6
    escribir_deque 28.7 30.1 22.7 21.8 23.5 23.2
    escribir_dicto 31.4 33.3 29.3 29.2 24.7 27.8
    escribir_dicto 28.4 29.9 27.5 25.2 23.1 29.8

    Operacións de pila (ou cola):
    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 temporización:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Eliminado moitas funcións e métodos de Python 2.7 que quedaron en desuso anteriormente e que orixinaron unha advertencia de desaprobación na versión anterior, incluído o método unescape() en html.parser.HTMLParser,
    tostring() e fromstring() en array.array, isAlive() en threading.Thread, getchildren() e getiterator() en ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() e base64.decodestring().

Fonte: opennet.ru

Engadir un comentario