Por qué Pendulum tuvo que escribir el operador + más maldito de todo Python

Why Pendulum had to write the most cursed "+" operator in all of Python

Pendulum, la popular librería de fechas en Python, implementó un operador + que inspecciona la pila de llamadas para decidir si usa aritmética consciente del horario de verano o la del estándar. El truco, que ralentiza la suma 600 veces, nace del conflicto entre dos promesas: compatibilidad total con datetime y un comportamiento mejorado. El autor, creador de la librería whenever, analiza el hack y propone una solución más limpia que ya fue fusionada.

La respuesta depende del nombre de la función que lo llamó. Así que puedes cambiar el resultado de + renombrando tu propia función.
  1. shoo

    Mmm. Cambiar el flujo de control basándose en la introspección de la pila de llamadas es bastante desagradable.

    Recuerdo que encontramos un uso ingenioso para la introspección de la pila de llamadas en un proyecto: no para cambiar el flujo de control, sino para mejorar el logging. Dentro de una función de utilidad open_db_connection, para autogenerar un nombre informativo que describiera qué parte del código había abierto la conexión:

    Por ejemplo: some_backend_process: main -> ... > grandparent -> parent -> open_db_connection

    Usábamos información de la pila de llamadas para generar una cadena "some_backend_process grandparent.parent" que describía el sitio de llamada y que podía pasarse a postgres como application_name [1] al establecer una conexión. Luego, desde el lado de la base de datos, si teníamos consultas problemáticas en tiempo de ejecución, teníamos muchas más pistas para averiguar qué parte del código del backend era responsable [2].

    Habría una forma de hacer algo equivalente sin fisgonear la pila de llamadas, requiriendo que el llamador pasara explícitamente un nombre descriptivo y único, pero eso lo hace un poco más propenso a errores, especialmente porque algunos desarrolladores tienden a copiar y pegar fragmentos de código existente y reutilizar el mismo nombre en todas partes.

    [1] https://www.postgresql.org/docs/current/libpq-connect.html#L...

    [2] https://www.postgresql.org/docs/current/monitoring-stats.htm...

  2. jvolkman

    Voy a superar esto con mi truco que cambia el valor de `sys.platform` según el llamador: https://github.com/jvolkman/rules_pycross/blob/main/pycross/...

    Esto se usa al compilar ruedas binarias de forma cruzada (por ejemplo, construir una rueda de macos en un host de compilación linux o viceversa).

  3. ariebovenberg

    Autor aquí. Me topé con esto mientras comparaba Pendulum con `whenever`, la librería de datetime que mantengo. Envié un parche que elimina el truco, pero el artículo trata sobre por qué el diseño subyacente no se puede parchear de la misma manera. Encantado de responder preguntas.

Más de este día

2026-10-07