¿Qué constituye exactamente una constante en Python?

PEP 8 prescribe que

Las constantes generalmente se definen en un nivel de módulo y se escriben en mayúsculas con guiones bajos que separan las palabras. Los ejemplos incluyen MAX_OVERFLOW y TOTAL .

Entiendo que esta es solo una convención de nombres, pero tengo curiosidad por saber si existe una definición oficial o ampliamente aceptada de lo que realmente constituye una constante frente a una variable semiprivada.

¿Se limita esto a lo que podríamos llamar constantes matemáticas ? (Es decir, flotar, int, complejo)

¿O incluiría cosas como objetos o cadenas datetime.date que se definen a nivel de módulo? ¿Qué tal un diccionario con claves / valores de tipos mixtos? Si la respuesta es no, ¿deberían estos tipos de objetos definirse como (quasi-) variables privadas con _leading_underscore ?

Bueno, las convenciones de encoding de PEP 8 se escribieron principalmente para la biblioteca estándar de Python :

Este documento proporciona las convenciones de encoding para el código Python que comprende la biblioteca estándar en la distribución principal de Python.

Recorriendo algunos de los módulos de la biblioteca estándar de Python 3.5, junto con las cadenas y números habituales, uno encuentra cosas como

UUID s, uuid.py:

 NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8') 

expresiones regulares, smtplib.py

 OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I) 

diccionarios, plistlib.py:

 _BINARY_FORMAT = {1: 'B', 2: 'H', 4: 'L', 8: 'Q'} 

frozenset s, asyncore.py:

 _DISCONNECTED = frozenset({ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, ... 

y un datetime.date en calendar.py

 _EPOCH_ORD = datetime.date(EPOCH, 1, 1).toordinal() 

por lo tanto, básicamente, todo lo que se supone que debe permanecer constante durante toda la duración de la ejecución, incluso si fuera de tipo mutable (el diccionario en plistlib.py).

En su mayor parte en python, la convención de nomenclatura PEP8 para las constantes está ahí para ayudar a cualquier progtwigdor que esté leyendo el código a saber que no debe cambiar esa “constante” en particular. En otros idiomas como C, en realidad puede reducir el tiempo que lleva ejecutar el código.

Ver esta publicación en Los beneficios de las constantes.

Una constante es solo un valor que nunca cambia.

En la POO es útil declarar constantes privadas o públicas, pero para Python no hay una separación funcional de “Constantes” y variables regulares.

Una cosa más en otros lenguajes de progtwigción que admiten constantes verdaderas si declara un valor como constante, ese valor no puede cambiar ni siquiera si intenta reasignar ese valor más adelante. Sin embargo, en Python no hay constantes, por lo que utilizamos la convención de nomenclatura para recordarnos que no debemos cambiar ese valor.