¿Cómo creo una constante en Python?
¿Cómo declaro una constante en Python?
En Java, hacemos:
public static final String CONST_NAME = "Name";
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.Final
anotació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
No hay const
una 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:
- Defina una función
constant
que tome una expresión y la use para construir un "captador", una función que devuelva únicamente el valor de la expresión. - La función de establecimiento genera un TypeError por lo que es de solo lectura
- Utilice la
constant
funció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
- Para definir el identificador FOO, primero defina dos funciones (fset, fget - los nombres quedan a mi elección).
- Luego use el incorporado
property
para construir un objeto que pueda "configurarse" u "obtener". - Tenga en cuenta que los
property
dos primeros parámetros de la función se denominanfset
yfget
. - 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
property
función.
En Python, en lugar de que el lenguaje imponga algo, la gente usa convenciones de nomenclatura, por ejemplo, __method
para métodos privados y el uso _method
para 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