Lanzamiento del lenguaje de programación Python 3.9

Después de un año de desarrollo presentado lanzamiento significativo del lenguaje de programación 3.9 Python. Python 3.9 fue el primer lanzamiento después transición proyecto en nuevo ciclo preparación y soporte de lanzamientos. Ahora se generarán nuevas versiones importantes una vez al año y las actualizaciones correctivas se publicarán cada dos meses. Cada rama importante recibirá soporte durante un año y medio, después del cual se desarrollarán otros tres años y medio para corregir vulnerabilidades.

El trabajo en una nueva sucursal comienza ahora cinco meses antes del lanzamiento de la próxima sucursal, es decir. coincidiendo con el lanzamiento de Python 3.9 comenzado Prueba alfa de la rama Python 3.10. La rama Python 3.10 estará en versión alfa durante siete meses, durante los cuales se agregarán nuevas funciones y se corregirán errores. Después de esto, las versiones beta se probarán durante tres meses, durante los cuales se prohibirá agregar nuevas funciones y se prestará toda la atención a corregir errores. Los dos últimos meses antes de la liberación, la sucursal estará en la etapa de candidato a liberación, en la que se realizará la estabilización final.

entre agregado innovaciones en Python 3.9:

  • En diccionarios definidos usando la clase dict incorporada, apareció soporte para operadores de fusión "|" y actualizaciones "|=", que complementan los métodos {**d1, **d2} y dict.update propuestos previamente para fusionar diccionarios.

    >>> x = {"clave1": "valor1 de x", "clave2": "valor2 de x"}
    >>> y = {"clave2": "valor2 de y", "clave3": "valor3 de y"}

    >>> x | y
    {'clave1': 'valor1 de x', 'clave2': 'valor2 de y', 'clave3': 'valor3 de y'}

    >>> y | X
    {'clave2': 'valor2 de x', 'clave3': 'valor3 de y', 'clave1': 'valor1 de x'}

  • La colección integrada de tipos incluye lista, dict y tupla, que se pueden usar como tipos base sin importar desde el módulo de escritura. Aquellos. en lugar de escribir.List, escribir.Dict y escribir.Tuple, ahora puedes especificar
    simplemente enumera, dicta y tupla:

    def saludar_all(nombres: lista[cadena]) -> Ninguno:
    para nombre en nombres:
    imprimir("Hola", nombre)

  • Están provistos Herramientas flexibles para anotar funciones y variables. Para adjuntar anotaciones, se agregó un nuevo tipo Anotado al módulo de escritura, ampliando los tipos existentes con metadatos adicionales que se pueden usar para análisis estático o para optimizaciones en tiempo de ejecución. Para acceder a los metadatos desde el código, se agregó el parámetro include_extras al método tiping.get_type_hints().

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

  • Atenuado Requisitos gramaticales para decoradores: cualquier expresión adecuada para su uso en bloques if y while ahora se puede utilizar como decorador. El cambio mejoró significativamente la legibilidad del código PyQt5 y simplificó el mantenimiento de este módulo:

    Fue
    button_0 = botones[0] @button_0.clicked.connect

    Ahora puedes escribir:
    @botones[0].clic.conectar

  • A la biblioteca estándar adicional módulo zonainfo, que incluye información de la base de datos de zonas horarias de la IANA.

    >>> desde infozona importar ZoneInfo
    >>> desde fecha y hora importar fecha y hora, timedelta
    >>> # horario de verano
    >>> dt = fechahora(2020, 10, 31, 12, tzinfo=ZoneInfo("América/Los_Angeles"))
    >>> imprimir(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tznombre()
    'PDT'

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

    >>> imprimir(dt.tznombre())
    PST

  • Se agregó el módulo Graphlib, en el que implementado soporte para la clasificación topológica de gráficos.
  • Propuesto Nuevos métodos para eliminar prefijos y finales de línea: str.removeprefix(prefijo) y str.removesuffix(sufijo). Se han agregado métodos a los objetos str, bytes, bytearray y collections.UserString.

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

  • Involucrado nuevo analizador PEG (Gramática de expresión de análisis), que reemplazó al analizador LL (1). El uso del nuevo analizador hizo posible deshacerse de algunos de los "trucos" utilizados para eludir las restricciones en LL(1) y redujo significativamente los costos laborales para mantener el analizador. En términos de rendimiento, el nuevo analizador está aproximadamente al mismo nivel que el anterior, pero está significativamente por delante en términos de flexibilidad, lo que le permite sentirse más libre al diseñar nuevas funciones del lenguaje. El antiguo código del analizador se conserva por ahora y se puede devolver utilizando el indicador "-X oldparser" o la variable de entorno "PYTHONOLDPARSER=1", pero se eliminará en la versión 3.10.
  • Proporcionado por la capacidad de los métodos de extensión C para acceder al estado de los módulos en los que están definidos utilizando la desreferencia directa del puntero en lugar de buscar el estado del módulo utilizando la función PyState_FindModule. El cambio le permite aumentar el rendimiento de los módulos C al reducir o eliminar por completo la sobrecarga de verificar el estado del módulo. Para asociar un módulo a una clase se propone la función C PyType_FromModuleAndSpec(), para obtener el módulo y su estado se proponen las funciones C PyType_GetModule() y PyType_GetModuleState() y proporcionar un método con acceso a la clase en el que se define, se proponen la función C PyCMethod y el flag METH_METHOD.
  • Recolector de basura entregado de bloquear colecciones que contienen objetos reanimados que permanecen accesibles externamente después de que se ejecuta el finalizador.
  • Método agregado os.pidfd_open, que permite utilizar el subsistema del kernel de Linux "pidfd" para manejar la situación de reutilización de PID (pidfd está asociado con un proceso específico y no cambia, mientras que un PID puede asociarse con otro proceso después de que finaliza el proceso actual asociado con ese PID). ).
  • La compatibilidad con la especificación Unicode se actualizó a la versión 13.0.0.
  • eliminado pérdida de memoria al reinicializar el intérprete de Python en el mismo proceso.
  • Se ha optimizado el rendimiento de los tipos integrados range, tuple, set, frozenset, list y dict. implementado mediante el uso del protocolo de acceso directo Vectorcall para un acceso más rápido a objetos escritos en lenguaje C.
  • Los módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, Resource, time y _weakref se cargan desde inicialización en varias etapas.
  • Los módulos de biblioteca estándar audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios y zlib se han convertido para uso restringido. ITB estable, que resuelve el problema de la operatividad de ensamblajes de módulos de extensión para diferentes versiones de Python (al actualizar la versión, no es necesario reconstruir los módulos de extensión y los módulos compilados para 3.9 podrán funcionar en la rama 3.10).
  • El módulo asyncio ha dejado de admitir el parámetro reuse_address debido a posibles problemas de seguridad (el uso de SO_REUSEADDR para UDP en Linux permite que diferentes procesos conecten sockets de escucha a un puerto UDP).
  • Se han agregado nuevas optimizaciones, por ejemplo, un rendimiento mejorado de los manejadores de señales en aplicaciones multiproceso, una mayor velocidad del módulo de subproceso en el entorno FreeBSD y una asignación más rápida de variables temporales (asignando una variable en la expresión "for y in [expr ]” ahora tiene tanto rendimiento como la expresión “y = expr” "). En general, la mayoría de las pruebas mostrar Disminución del rendimiento en comparación con la rama 3.8 (la aceleración se observa solo en las pruebas write_local y write_deque):

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

    Acceso de lectura de variables y atributos:
    lectura_local 7.1 7.1 5.4 5.1 3.9 4.0
    lectura_no local 7.1 8.1 5.8 5.4 4.4 4.8
    lectura_global 15.5 19.0 14.3 13.6 7.6 7.7
    lectura_incorporada 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_encuadernado 37.6 37.9 29.6 26.9 27.7 45.9

    Acceso de escritura de variables y atributos:
    escribir_local 8.7 9.3 5.5 5.3 4.3 4.2
    escritura_no 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
    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

    Acceso de lectura a la estructura de datos:
    lista_lectura 24.2 24.5 20.8 20.8 19.0 21.1
    lectura_deque 24.7 25.5 20.2 20.6 19.8 21.6
    leer_dict 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 a la estructura de datos:
    lista_escritura 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_dict 31.4 33.3 29.3 29.2 24.7 27.8
    escribir_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operaciones de pila (o cola):
    lista_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

    Bucle de tiempo:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Eliminado muchas funciones y métodos de Python 2.7 que anteriormente estaban en desuso y dieron lugar a una advertencia de desuso en la versión anterior, incluido el método unescape() en html.parser.HTMLParser,
    tostring() y fromstring() en array.array, isAlive() en threading.Thread, getchildren() y getiterator() en ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() y base64.decodestring().

Fuente: opennet.ru

Añadir un comentario