ActiveState a une recette intitulée Constants in Python par le vénérable Alex Martelli pour la création d'un module const
avec des attributs qui ne peuvent pas être reprise après la création. Cela ressemble à ce que vous recherchez, sauf pour la mise à jour — mais cela pourrait être ajouté en le faisant vérifier pour voir si le nom de l'attribut était tout en majuscule ou pas.
Bien sûr, cela peut être contourné par le déterminé, mais c'est la façon dont Python est — et est considéré comme une «bonne chose» par la plupart des gens. Cependant, pour le rendre un peu plus difficile, je suggère que vous ne vous embêtez pas à ajouter la méthode supposément évidente __delattr__
puisque les gens pourraient alors simplement supprimer les noms et ensuite les rajouter à différentes valeurs.
C'est ce que je prends sur:
# 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!")
Sortie:
const name 'Answer' is not all uppercase
Can't change const.ANSWER
Pourquoi vous passer du temps à ce sujet? Les gens ont votre source Python. Ils peuvent juste le changer. Pourquoi se tromper avec "final" et "constant"? –
Vous savez, c'est exprès. Les gars de Python sont d'avis que nous sommes tous des adultes et que nous devrions agir comme tels. Alors pourquoi interdire l'accès du tout? Agissez comme un adulte et ne le changez jamais dans votre code. Si un autre programmeur le fait, c'est sa faute, si le code se casse, et vous avez un VCS pour savoir qui blâmer (je suppose). – Boldewyn
En outre, c'est une chose facile à vérifier. Toute instance de 'UPPER_CASE =' est une erreur car quelqu'un a enfreint les règles. –