¿Cómo creo una constante en Python?

Resuelto zfranciscus asked hace 14 años • 44 respuestas

¿Cómo declaro una constante en Python?

En Java, hacemos:

public static final String CONST_NAME = "Name";
zfranciscus avatar Apr 21 '10 19:04 zfranciscus
Aceptado

No puedes declarar una variable o valor como constante en Python.


Para indicar a los programadores que una variable es una constante, se suele escribir en mayúsculas:

CONST_NAME = "Name"

Para generar excepciones cuando se cambian las constantes, consulte Constantes en Python de Alex Martelli. Tenga en cuenta que esto no se utiliza habitualmente en la práctica.


A partir de Python 3.8, hay una typing.Finalanotación de variable que le indicará a los verificadores de tipo estático (como mypy) que su variable no debe reasignarse. Este es el equivalente más cercano al de Java final. Sin embargo, en realidad no impide la reasignación :

from typing import Final

a: Final[int] = 1

# Executes fine, but mypy will report an error if you run mypy on this:
a = 2
Felix Kling avatar Apr 21 '2010 12:04 Felix Kling

No hay constuna palabra clave como en otros idiomas, sin embargo, es posible crear una propiedad que tenga una "función de obtención" para leer los datos, pero no una "función de establecimiento" para reescribir los datos. Básicamente, esto protege el identificador contra cambios.

Aquí hay una implementación alternativa usando la propiedad de clase:

Tenga en cuenta que el código no es nada fácil para un lector que se pregunta acerca de las constantes. Vea la explicación a continuación.

def constant(f):
    def fset(self, value):
        raise TypeError
    def fget(self):
        return f()
    return property(fget, fset)

class _Const(object):
    @constant
    def FOO():
        return 0xBAADFACE
    @constant
    def BAR():
        return 0xDEADBEEF

CONST = _Const()

print(hex(CONST.FOO))  # -> '0xbaadfaceL'

CONST.FOO = 0
##Traceback (most recent call last):
##  File "example1.py", line 22, in <module>
##    CONST.FOO = 0
##  File "example1.py", line 5, in fset
##    raise TypeError
##TypeError

Explicación del código:

  1. Defina una función constantque tome una expresión y la use para construir un "captador", una función que devuelva únicamente el valor de la expresión.
  2. La función de establecimiento genera un TypeError por lo que es de solo lectura
  3. Utilice la constantfunción que acabamos de crear como decoración para definir rápidamente propiedades de solo lectura.

Y de alguna otra forma más antigua:

(El código es bastante complicado, más explicaciones a continuación)

class _Const(object):
    def FOO():
        def fset(self, value):
            raise TypeError
        def fget(self):
            return 0xBAADFACE
        return property(**locals())
    FOO = FOO()  # Define property.

CONST = _Const()

print(hex(CONST.FOO))  # -> '0xbaadfaceL'

CONST.FOO = 0
##Traceback (most recent call last):
##  File "example2.py", line 16, in <module>
##    CONST.FOO = 0
##  File "example2.py", line 6, in fset
##    raise TypeError
##TypeError
  1. Para definir el identificador FOO, primero defina dos funciones (fset, fget - los nombres quedan a mi elección).
  2. Luego use el incorporadoproperty para construir un objeto que pueda "configurarse" u "obtener".
  3. Tenga en cuenta que los propertydos primeros parámetros de la función se denominan fsety fget.
  4. Utilice el hecho de que elegimos estos mismos nombres para nuestro propio getter & setter y cree un diccionario de palabras clave usando ** (doble asterisco) aplicado a todas las definiciones locales de ese alcance para pasar parámetros a la propertyfunción.
inv avatar Apr 22 '2010 03:04 inv

En Python, en lugar de que el lenguaje imponga algo, la gente usa convenciones de nomenclatura, por ejemplo, __methodpara métodos privados y el uso _methodpara métodos protegidos .

De la misma manera, puedes simplemente declarar la constante en mayúsculas, por ejemplo:

MY_CONSTANT = "one"

Si desea que esta constante nunca cambie, puede conectarse al acceso a atributos y hacer trucos, pero un enfoque más simple es declarar una función:

def MY_CONSTANT():
    return "one"

El único problema es que tendrás que hacerlo en todos los lugares MY_CONSTANT(), pero nuevamente MY_CONSTANT = "one"es la forma correcta en Python (generalmente).


También puedes usar nombradotuple() para crear constantes:

>>> from collections import namedtuple
>>> Constants = namedtuple('Constants', ['pi', 'e'])
>>> constants = Constants(3.14, 2.718)
>>> constants.pi
3.14
>>> constants.pi = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
Anurag Uniyal avatar Apr 21 '2010 13:04 Anurag Uniyal