Descargar 3.7 Python

0 views
Skip to first unread message

Brandi Baylon

unread,
Apr 17, 2024, 1:46:12 PM4/17/24
to barkrethebo

Introducción

Python es un lenguaje de programación de alto nivel, de propósito general, dinámicamente tipado e interpretado que es ampliamente utilizado para diversas aplicaciones, como desarrollo web, análisis de datos, aprendizaje automático, automatización y más. Python es conocido por su sintaxis simple y legible, su rico conjunto de bibliotecas y módulos y su compatibilidad multiplataforma.

Python 3.7 es una versión importante del lenguaje Python que fue lanzado el 27 de junio de 2018. Presenta varias nuevas características y mejoras que hacen que Python sea más potente, expresivo y fácil de usar. Algunos de los aspectos más destacados de esta versión son:

descargar 3.7 python


Descarga https://t.co/ZcyVrOYBrY



    • Evaluación pospuesta de anotaciones: Esta característica le permite usar referencias hacia adelante y sugerencias de tipo sin importar módulos o ejecutar código en el momento de la definición.
    • Built-in breakpoint() function: Esta función facilita la depuración al permitirle insertar un punto de interrupción en su código que lanzará automáticamente un depurador cuando se ejecute.
    • Clases de datos: Esta característica simplifica la creación de clases que principalmente almacenan atributos de datos y proporcionan métodos predeterminados para la comparación, representación e inicialización.
    • Variables de contexto: Esta función le permite administrar el estado específico del contexto de una manera segura para subprocesos sin usar el almacenamiento local de subprocesos.
    • Otras mejoras en la biblioteca estándar, implementación de CPython y documentación: Estas incluyen nuevos módulos (como contextvars y dataclasses), nuevas funciones (como time.time_ns() y time.clock_gettime_ns()), nuevas características de sintaxis (como PEP 562), mejoras de rendimiento (como PEP 552), correcciones de seguridad (como PEP 476), traducciones de documentación (como PEP 545) y más.

    En este artículo, exploraremos cómo descargar e instalar Python 3.7 en su máquina, cuáles son los principales beneficios de usar esta versión y cuáles son algunos de los posibles inconvenientes o problemas de compatibilidad que podría encontrar.

    Cómo comprobar la versión actual de Python

    Antes de descargar e instalar Python 3.7, es posible que desee comprobar si ya tiene Python en su máquina y qué versión es. Para ello, puede usar una aplicación de línea de comandos, como PowerShell en Windows o Terminal en macOS o Linux.

    Para comprobar tu versión de Python en Windows, sigue estos pasos:

      • Pulse la tecla Win.
      • Escriba PowerShell.
      • Pulse Enter.
      • Escriba python --versión o py -versión en la ventana de PowerShell.
      • Pulse Enter.

      Si tienes Python instalado, deberías ver algo como esto:

      PS C: Usuarios user> python -versión Python 3.9.5 

      Si no tienes Python instalado o si tienes una versión anterior a 3.7, deberías ver algo como esto:

      PS C: Users user> python -versión python : El término 'python' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. 

      Para comprobar tu versión de Python en macOS o Linux, sigue estos pasos:

        • Abra la aplicación Terminal.
        • Escriba python -versión o python3 -versión en la ventana Terminal.
        • Pulse Enter.

        Si tienes Python instalado, deberías ver algo como esto:

        $ python -versión Python 2.7.16 $ python3 -versión Python 3.9.5 

        Si no tienes Python instalado o si tienes una versión anterior a 3.7, deberías ver algo como esto:

        $ python --version -bash: python: comando no encontrado $ python3 --version -bash: python3: comando no encontrado 

        Cómo descargar Python 3.7 desde el sitio web oficial o el Windows Store

        Hay dos formas principales de descargar Python 3.7 en su máquina: desde el sitio web oficial de Python o desde la tienda de Windows (si está usando Windows 10).

        Para descargar Python 3.7 desde el sitio web oficial, siga estos pasos:

          • Desplácese hacia abajo a la sección Archivos y elija el instalador que coincida con su sistema operativo y arquitectura (32 bits o 64 bits).
          • Haga clic en el archivo de instalación para descargarlo en su máquina.

          Para descargar Python 3.7 desde Windows Store, siga estos pasos:

            • Ir a
            • Tipo de actualización de la cerveza para actualizar Homebrew.
            • Tipo brew install python@3.7 para instalar Python 3.7 usando Homebrew.
            • Escriba brew link --overwrite python@3.7 para vincular Python 3.7 a la ruta de su sistema.

            Para instalar Python 3.7 en Linux usando el código fuente, siga estos pasos:

              • Extraiga el archivo a un directorio de su elección, como /python-3.7.9.
              • Abra la aplicación Terminal y vaya al directorio donde extrajo el archivo, como cd /python-3.7.9.
              • Escriba . /configure para configurar las opciones de compilación.
              • Escriba make para compilar el código fuente.
              • Tipo sudo make install para instalar Python 3.7 en su sistema.

              Características y beneficios de Python 3.7

              PEP 563: Evaluación pospuesta de anotaciones

              Las anotaciones son metadatos que se pueden adjuntar a variables, parámetros, funciones, clases y módulos en Python. Por lo general, se utilizan para proporcionar sugerencias de tipo, que son sugerencias opcionales para los tipos esperados de valores o argumentos. Por ejemplo, puede escribir una función como esta:

              def add(x: int, y: int) -> int:   return x + y 

              En Python 3.7, las anotaciones se evalúan en tiempo de definición, lo que significa que se ejecutan como expresiones cuando se analiza el código. Esto puede causar algunos problemas, como:

                • Sobrecarga de rendimiento: La evaluación de anotaciones puede ralentizar la carga de módulos o scripts que los utilizan ampliamente.
                • Reenviar referencias: No se puede usar un nombre que aún no está definido en una anotación, a menos que lo envuelva en una cadena. Por ejemplo, no se puede escribir una clase como esta:
                class Node:   def __init__(self, value: int, next: Node):   self.value = value self.next = next 

                Esto generará un NameError porque Node no está definido todavía cuando se evalúa la anotación. Tienes que escribirlo así:

                class Node:   def _init__(self, value: int, next: 'Node'):   self.value = value self.next = next 
                >
                • Importaciones circulares: No puede importar un módulo que importe su módulo en una anotación, a menos que use una cadena o una importación retrasada. Por ejemplo, no se puede escribir un módulo como este:
                # mod1.py from mod2 import Foo def bar(x: Foo) -> Ninguno:   pass 
                # mod2.py from mod1 import bar class Foo:   def __init_(self):   bar(self) 

                Esto levantará un ImportError porque mod1 y mod2 dependen el uno del otro. Tienes que escribirlo así:

                # mod1.py from typing import TYPE_CHECKING if if TYPE_CHECKING:   from mod2 import Foo def bar(x: 'Foo') -> Ninguno:   pass 
                # mod2.py from mod1 import bar class Foo:   def __init_(self):   bar(self) 
                from __future_ import annotations 

                Esto hará que todas las anotaciones en su módulo se almacenen como cadenas, en lugar de ser evaluadas como expresiones. Esto mejorará el rendimiento, permitirá referencias hacia adelante y evitará las importaciones circulares. Todavía puede acceder a las expresiones originales usando la función typing.get_type_hints() o el atributo __annotations__ de los objetos.

                PEP 553: Función de punto de interrupción incorporado()

                Depuración es una habilidad esencial para cualquier programador, ya que le permite encontrar y corregir errores en su código. Una de las herramientas de depuración más comunes es un punto de interrupción, que es un punto en su código donde la ejecución se detiene y le permite inspeccionar el estado de su programa.

                En Python 3.7, hay una nueva función incorporada llamada breakpoint() que facilita la inserción de puntos de interrupción en su código. Simplemente puede llamar a esta función en cualquier lugar de su código donde desee pausar la ejecución y lanzar un depurador. Por ejemplo, puedes escribir algo como esto:

                def factorial(n):   if n == 0:   return 1 else:   breakpoint()   return n * factorial(n - 1) Esto detendrá la ejecución cuando la función sea llamada con un argumento positivo y abrirá un depurador en su terminal. A continuación, puede utilizar los comandos del depurador para inspeccionar las variables, paso a través del código, evaluar expresiones, etc.

                La función breakpoint() es personalizable, ya que puede configurar qué depurador usar y cómo iniciarlo. Por defecto, usa el módulo pdb, que es el depurador estándar de Python. Sin embargo, puede cambiar esto estableciendo la variable de entorno PYTHONBREAKPOINT en el nombre de otro módulo o función de depuración. Por ejemplo, puede usar ipdb, que es una envoltura alrededor de pdb que proporciona un shell IPython interactivo. Para hacerlo, puede escribir esto en su terminal antes de ejecutar su script:

                export PYTHONBREAKPOINT=ipdb.set_trace 

                PEP 557: Clases de datos

                Las clases de datos son una nueva característica en Python 3.7 que simplifica la creación de clases que principalmente almacenan atributos de datos y proporcionan métodos predeterminados para la comparación, representación e inicialización. Las clases de datos son similares a namedtuple o struct en otros idiomas, pero son más flexibles y potentes.

                Para crear una clase de datos, debe usar el decorador @dataclass del módulo dataclasses y definir los atributos de su clase como variables de clase con anotaciones de tipo. Por ejemplo, puede escribir una clase de datos como esta:

                from dataclasses import dataclass @dataclass class Point:   x: float y: float 

                Esto generará automáticamente un método __init__() que toma x e y como argumentos y los asigna a self. x y self. y, respectivamente. También generará un método __eq_() que compara dos instancias de Punto por sus atributos, un método __repr__() que devuelve una representación de cadena de una instancia de Punto, y un método __hash_() que devuelve un valor hash de una instancia de Punto.

                Puedes crear y usar instancias de Point como esta:

                p1 = Point(1.0, 2.0) p2 = Point(3.0, 4.0) print(p1) # prints Point(x=1.0, y=2.0) print(p1 == p2) # prints False print(hash(p1)) # prints 3713081631934410656 /pre>

                Las clases de datos también admiten algunas características adicionales, como:

                  • Valores predeterminados: Puede asignar valores predeterminados a sus atributos utilizando el operador = . Por ejemplo, puede escribir una clase de datos como esta:
                  @dataclass class Rectángulo:   width: float = 0.0 height: float = 0.0 

                  Esto hará que los argumentos width y height sean opcionales al crear una instancia de Rectángulo.

                  • Opciones de campo: Puede personalizar el comportamiento de sus atributos usando la función field() del módulo dataclasses. Por ejemplo, puede escribir una clase de datos como esta:

                  Esto hará que el atributo área no se incluya en el método __init__(), pero todavía se generará en los otros métodos. También puede usar otras opciones, como repr, compare, hash, etc., para controlar cómo se usan sus atributos en diferentes métodos.

                  Procesamiento post-init: Puede definir un método especial llamado __post_init__() en su clase de datos que se ejecutará después del método _init__(). Esto puede ser útil para realizar algún procesamiento o validación adicional en sus atributos. Por ejemplo, puede escribir una clase de datos como esta:
                  @dataclass class Circle:   radius: float área: float = field(init=False)   def __post_init__(self):   self.área = 3.14 * self.radius 2 

                  Esto calculará y asignará el atributo de área basado en el atributo radius después de crear una instancia de Circle.

                  PEP 567: Variables de contexto

                  Las variables de contexto son una nueva característica en Python 3.7 que le permite administrar el estado específico del contexto de una manera segura para subprocesos sin usar el almacenamiento local de subprocesos. Las variables de contexto son similares a las variables globales, pero son locales a un contexto, que es un conjunto de valores que están asociados con un cierto flujo de ejecución.

                  Para crear y usar variables de contexto, debe usar la clase ContextVar del módulo contextvars y la función contextvars.copy _context() del mismo módulo. Por ejemplo, puedes escribir algo como esto:

                  Este ejemplo muestra cómo puede crear una variable de contexto llamada nombre, establecer y obtener su valor en el contexto actual, hacer una copia del contexto actual, modificar y obtener el valor de la variable de contexto en la copia, y obtener el valor de la variable de contexto en el contexto original. Como puede ver, el valor de la variable de contexto es diferente en diferentes contextos, pero es consistente dentro de cada contexto.

                  Las variables de contexto son útiles para situaciones en las que necesita almacenar algún estado que sea relevante para un flujo de ejecución específico, como una solicitud, una tarea, una consecuencia, etc., sin afectar otros flujos o subprocesos. Por ejemplo, puede usar variables de contexto para almacenar información como identidad de usuario, configuración regional, zona horaria, nivel de registro, etc.

                  Otras mejoras en la biblioteca estándar, implementación de CPython y documentación

                  Python 3.7 también introduce muchas otras mejoras y mejoras en varios aspectos del lenguaje, como:

                    • Nuevos módulos: Python 3.7 añade dos nuevos módulos a la biblioteca estándar: contextvars y dataclasses. El primero proporciona soporte para variables de contexto, como hemos visto antes. El segundo proporciona soporte para clases de datos, como hemos visto antes.
                    • Nuevas funciones: Python 3.7 añade varias funciones nuevas a los módulos existentes en la biblioteca estándar. Algunas de ellas son:
                      • time.time_ns() y time.clock_gettime_ns(): Estas funciones devuelven la hora actual o la hora de reloj como un número entero de nanosegundos.
                      • os.cpu_count(): Esta función devuelve el número de CPU en el sistema.
                      • math.comb(n, k): Esta función devuelve el número de formas de elegir k elementos de n elementos sin repetición y sin orden.
                      • math.dist(p, q): Esta función devuelve la distancia euclidiana entre dos puntos p y q.
                      • math.isqrt(n): Esta función devuelve la raíz cuadrada entera de n.
                      • statistics.geometric_mean(data): Esta función devuelve la media geométrica de una secuencia de números como un flotador.
                      • statistics.multimode(data): Esta función devuelve una lista de los valores más frecuentes en una secuencia de números.
                      • Nuevas características de sintaxis: Python 3.7 añade algunas nuevas características de sintaxis para mejorar la legibilidad y expresividad del lenguaje. Algunas de ellas son:
                        • PEP 562: Personalización de los atributos del módulo: Esta función le permite definir una función especial llamada __getattr__() en su módulo que se llamará cuando se acceda a un atributo de su módulo pero no se encuentre. Esto puede ser útil para implementar la carga perezosa, advertencias de desaprobación o atributos de proxy a otros módulos.
                        • PEP 563: Evaluación pospuesta de anotaciones: Esta característica le permite diferir la evaluación de anotaciones hasta que sean necesarias, como hemos visto antes.
                        • PEP 564: Añadir nuevas funciones de tiempo con resolución de nanosegundos: Esta función añade nuevas funciones al módulo de tiempo que soporta resolución de nanosegundos, como hemos visto antes.
                        • PEP 565: Mostrar DeprecationWarning en __main__: Esta característica hace que DeprecationWarning mensajes visibles por defecto cuando se ejecuta un script directamente, en lugar de solo cuando se ejecuta a través de un corredor de prueba o una sesión interactiva. Esto puede ayudar a los desarrolladores a notar y corregir características obsoletas más fácilmente.
                        • Mejoras de rendimiento: Python 3.7 mejora el rendimiento y la eficiencia de varios aspectos del lenguaje, como:
                          • PEP 552: Archivos pyc deterministas: Esta característica hace que los archivos bytecode generados por Python (archivos.pyc) sean deterministas, lo que significa que tendrán el mismo contenido y valor hash independientemente del tiempo o máquina donde se generen. Esto puede mejorar la reproducibilidad, seguridad y almacenamiento en caché del código Python.
                          • PEP 564: Añadir nuevas funciones de tiempo con resolución de nanosegundos: Esta función añade nuevas funciones al módulo de tiempo que soporta resolución de nanosegundos, como hemos visto antes.
                          • Otras optimizaciones: Python 3.7 también incluye otras optimizaciones, como llamadas de métodos más rápidas, operaciones de dict más rápidas, acceso de atributos más rápido, manejo de excepciones más rápido, etc.
                          • Correcciones de seguridad: Python 3.7 corrige algunos problemas de seguridad que afectan a versiones anteriores del lenguaje, como:
                            • PEP 476: Habilitación predeterminada de la verificación de certificados para los clientes http de stdlib: Esta función habilita la verificación de certificados SSL/TLS de forma predeterminada para los módulos http.client, urllib.request y urllib.parse, que se utilizan para realizar solicitudes HTTP en Python. Esto puede prevenir los ataques de man-in-the-middle y otros riesgos de seguridad al comunicarse con servidores HTTPS.
                            • PEP 578: Python Runtime Audit Hooks: Esta característica le permite registrar ganchos de auditoría que pueden monitorear y registrar eventos que ocurren durante la ejecución de código Python, como importar módulos, abrir archivos, ejecutar comandos, etc. Esto puede ayudarle a detectar y prevenir actividades maliciosas o no autorizadas en sus aplicaciones Python.
                            • Otras correcciones: Python 3.7 también incluye otras correcciones de seguridad, como la desactivación de las inyecciones de encabezado HTTP, la prevención de desbordamientos de búfer, la fijación de fugas de memoria, etc.
                            • Traducciones de documentación: Python 3.7 añade soporte para traducir la documentación oficial de Python a diferentes idiomas, como francés, japonés, coreano, español, etc. Esto puede ayudar a los hablantes que no hablan inglés a aprender y usar Python más fácil y eficazmente.

                            Inconvenientes y problemas de compatibilidad de Python 3.7

                            Si bien Python 3.7 ofrece muchos beneficios y mejoras sobre versiones anteriores del lenguaje, también tiene algunos inconvenientes y problemas de compatibilidad que debe tener en cuenta antes de usarlo. Algunos de ellos son:

                              • Algunas correcciones de seguridad pueden romper la compatibilidad hacia atrás: Algunas de las correcciones de seguridad que se introducen en Python 3.7 pueden causar que algún código existente falle o se comporte de manera diferente que antes. Por ejemplo, habilitar la verificación de certificados de forma predeterminada para clientes HTTP puede generar errores SSL para algunos servidores que usan certificados firmados o caducados. Es posible que necesite actualizar su código o configuración para manejar estos cambios.
                              • La API de C no se ve afectada por el modo de compatibilidad: La API de C es la interfaz que le permite escribir extensiones o incrustar Python en otras aplicaciones utilizando el lenguaje C. La API C no se ve afectada por las instrucciones de importación __future_ que permiten algunas características en Python 3.7, como la evaluación pospuesta de anotaciones o archivos deterministas pyc. Esto significa que puede necesitar utilizar diferentes técnicas o macros para acceder a estas características desde el código C.
                              • Algunos paquetes pueden no ser compatibles con Python 3.7 todavía: Algunos paquetes o bibliotecas de terceros que se utilizan en sus proyectos de Python pueden no ser compatibles con Python 3.7 todavía o pueden tener algunos errores o problemas con esta versión. Es posible que necesite comprobar la compatibilidad y actualizar el estado de estos paquetes antes de usarlos con Python 3.7.

                              Conclusión

                              En este artículo, hemos aprendido cómo descargar e instalar Python 3.7 en su máquina, cuáles son las principales características y beneficios de esta versión, y cuáles son algunos de los posibles inconvenientes o problemas de compatibilidad que puede encontrar.

                              Python 3.7 es una versión importante del lenguaje Python que introduce varias nuevas características y mejoras que hacen que Python sea más potente, expresivo y fácil de usar. Algunos de los aspectos más destacados de esta versión son la evaluación pospuesta de anotaciones, la función de punto de interrupción incorporado (), las clases de datos, las variables de contexto y otras mejoras en la biblioteca estándar, la implementación de CPython y la documentación.

                              Por lo tanto, le recomendamos que utilice Python 3.7 si desea aprovechar las nuevas características y mejoras que ofrece, pero también estar preparado para hacer frente a algunos desafíos y cambios que puede traer. También debe mantener su versión de Python y paquetes actualizados para garantizar el mejor rendimiento y seguridad de sus proyectos de Python.

                              Preguntas frecuentes

                              Q: Cómo puedo actualizar mi versión de Python a 3.7?

                              A: La forma más fácil de actualizar su versión de Python a 3.7 es descargarla e instalarla desde el sitio web oficial o la tienda de Windows, como hemos explicado antes. Sin embargo, también debe comprobar si su código y paquetes existentes son compatibles con Python 3.7 antes de actualizar, ya que algunos cambios pueden romper su código o causar errores. Puede usar herramientas como pyenv, virtualenv o pipenv para administrar múltiples versiones y entornos de Python en su máquina.

                              Q: Cómo puedo usar sugerencias de tipo en Python 3.7?

                              A: Las sugerencias de tipo son anotaciones opcionales que puedes usar para indicar los tipos esperados de valores o argumentos en tu código Python. Se utilizan principalmente para la comprobación de tipo estático, que es un proceso de verificación de que su código sigue las reglas de tipo en tiempo de compilación o antes de ejecutarlo. Para usar sugerencias de tipo en Python 3.7, tienes que importar el módulo de escritura y usar los tipos predefinidos o crear tus propios tipos usando genéricos o alias. Por ejemplo, puede escribir una función como esta:

                              from typing import List, Dict def count_words(text: str) -> Dict[str, int]:   words = text.split()   counts =    for word in words:   counts[word] = counts.get(word, 0) + 1 devuelve counts 

                              Esta función tiene sugerencias de tipo que indican que el texto debe ser una cadena, y que el valor devuelto debe ser un diccionario de cadenas y enteros. Puede usar herramientas como mypy, pytype o pyre para verificar su código en busca de errores de tipo usando estas sugerencias de tipo.

                              A: La función breakpoint() es una nueva función incorporada en Python 3.7 que le permite insertar un punto de interrupción en su código que lanzará automáticamente un depurador cuando se ejecute. Para usar la función breakpoint(), tienes que llamarlo en cualquier lugar de tu código donde quieras pausar la ejecución y lanzar un depurador. Por ejemplo, puedes escribir algo como esto:

                              def factorial(n):   if n == 0:   return 1 else:   breakpoint()   return n * factorial(n - 1) 

                              Esto detendrá la ejecución cuando la función sea llamada con un argumento positivo y abrirá un depurador en su terminal. A continuación, puede usar los comandos del depurador para inspeccionar las variables, pasar por el código, evaluar expresiones, etc. De forma predeterminada, la función breakpoint() utiliza el módulo pdb, que es el depurador estándar de Python. Sin embargo, puede cambiar esto estableciendo la variable de entorno PYTHONBREAKPOINT en el nombre de otro módulo o función depurador.

                              Q: Cómo puedo crear y usar clases de datos en Python 3.7?

                              A: Las clases de datos son una nueva característica en Python 3.7 que simplifica la creación de clases que principalmente almacenan atributos de datos y proporcionan métodos predeterminados para la comparación, representación e inicialización. Para crear una clase de datos, debe usar el decorador @dataclass del módulo dataclasses y definir los atributos de su clase como variables de clase con anotaciones de tipo. Por ejemplo, puede escribir una clase de datos como esta:

                              from dataclasses import dataclass @dataclass class Point:   x: float y: float 
                              p1 = Point(1.0, 2.0) p2 = Point(3.0, 4.0) print(p1) # prints Point(x=1.0, y=2.0) print(p1 == p2) # prints False print(hash(p1)) # prints 3713081631934410656 /pre>

                              Q: Cómo manejo el estado específico del contexto usando variables de contexto en Python 3.7?

                              A: Las variables de contexto son una nueva característica en Python 3.7 que le permite administrar el estado específico del contexto de una manera segura para subprocesos sin usar el almacenamiento local de subprocesos. Las variables de contexto son similares a las variables globales, pero son locales a un contexto, que es un conjunto de valores que están asociados con un cierto flujo de ejecución.

                              Para crear y usar variables de contexto, debe usar la clase ContextVar del módulo contextvars y la función contextvars.copy_context() del mismo módulo. Por ejemplo, puedes escribir algo como esto:

                              from contextvars import ContextVar, copy_context # Crear un nombre de variable de contexto = ContextVar('name') # Establecer un valor para la variable de contexto name.set('Alice') # Obtener el valor de la variable de contexto print(name.get()) # imprime Alice # Cree una copia del contexto actual ctx = copy_context() # Modifique el valor de la variable context en la copia ctx.run(name.set, 'Bob') # Obtenga el valor de la variable context en la copia print(ctx.run(name.get)) # imprime Bob # Obtiene el valor de la variable de contexto en la impresión de contexto original (name.get()) # imprime Alice 

                              Este ejemplo muestra cómo puede crear una variable de contexto llamada nombre, establecer y obtener su valor en el contexto actual, hacer una copia del contexto actual, modificar y obtener el valor de la variable de contexto en la copia, y obtener el valor de la variable de contexto en el contexto original. Como puede ver, el valor de la variable de contexto es diferente en diferentes contextos, pero es consistente dentro de cada contexto.

                              17b9afdd22
                              https://groups.google.com/g/licgemilgi/c/F30MjfkZz4M https://groups.google.com/g/speedenrafi/c/KS29vv1mDBU https://groups.google.com/g/idevyler/c/_8LRNRfviYI
                              Reply all
                              Reply to author
                              Forward
                              0 new messages