Activestate tiene una receta titulado Constants in Python por el venerable Alex Martelli para la creación de un módulo de const
con atributos que no pueden recuperarse después de la creación. Eso suena como lo que estás buscando, excepto por el upsideing —, pero eso podría agregarse haciendo que verifique si el nombre del atributo estaba en mayúsculas o no.
Por supuesto, esto se puede eludir por el determinado, pero esa es la forma en que Python es — y es considerado como un "bien" por la mayoría de la gente. Sin embargo, para hacerlo un poco más difícil, le sugiero que no se moleste en agregar el método supuestamente obvio __delattr__
, ya que las personas podrían simplemente eliminar nombres y luego volver a agregarlos a diferentes valores.
Esto es lo que estoy tomando sobre:
# Put in const.py...
# from http://code.activestate.com/recipes/65207-constants-in-python
class _const:
class ConstError(TypeError): pass # base exception class
class ConstCaseError(ConstError): pass
def __setattr__(self, name, value):
if name in self.__dict__:
raise self.ConstError("Can't change const.%s" % name)
if not name.isupper():
raise self.ConstCaseError('const name %r is not all uppercase' % name)
self.__dict__[name] = value
# replace module entry in sys.modules[__name__] with instance of _const
# (and create additional reference to module so it's not deleted --
# see Stack Overflow question: http://bit.ly/ff94g6)
import sys
_ref, sys.modules[__name__] = sys.modules[__name__], _const()
if __name__ == '__main__':
import const # test this module...
try:
const.Answer = 42 # not OK, mixed-case attribute name
except const.ConstCaseError as exc:
print(exc)
else: # test failed - no ConstCaseError exception generated
raise RuntimeError("Mixed-case const names should't have been allowed!")
const.ANSWER = 42 # should be OK, all uppercase
try:
const.ANSWER = 17 # not OK, attempts to change defined constant
except const.ConstError as exc:
print(exc)
else: # test failed - no ConstError exception generated
raise RuntimeError("Shouldn't have been able to change const attribute!")
Salida:
const name 'Answer' is not all uppercase
Can't change const.ANSWER
¿Por qué está gastando tiempo en esto? La gente tiene tu fuente de Python. Ellos solo pueden cambiarlo. ¿Por qué perder el tiempo con "final" y "constante"? –
Ya sabes, eso es a propósito. Los chicos de Python son de la opinión, que todos somos adultos y debemos actuar como tal. Entonces, ¿por qué prohibir el acceso? Actúa como un adulto y nunca los cambies en tu código. Si otro programador lo hace, es su culpa, si el código se rompe, y usted tiene un VCS para descubrir a quién culpar (supongo). – Boldewyn
Además, es una tarea fácil de auditar. Cualquier instancia de 'UPPER_CASE =' es un error porque alguien rompió las reglas. –