ActiveState ha una ricetta intitolata Constants in Python dal venerabile Alex Martelli per la creazione di un modulo const
con gli attributi che non possono essere rimbalzo dopo la creazione. Sembra che quello che stai cercando eccetto per l'aggiornamento — ma che potrebbe essere aggiunto facendolo controllare per vedere se il nome dell'attributo era tutto in maiuscolo o meno.
Naturalmente, questo può essere aggirato dal determinato, ma questo è il modo in cui Python è — ed è considerato una "cosa buona" dalla maggior parte della gente. Tuttavia, per renderlo un po 'più difficile, ti suggerisco di non preoccuparti di aggiungere il metodo apparentemente ovvio __delattr__
poiché le persone potrebbero semplicemente cancellare i nomi e quindi aggiungerli nuovamente a valori diversi.
Questo è quello che sto prendendo circa:
# 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!")
uscita:
const name 'Answer' is not all uppercase
Can't change const.ANSWER
Perché stai spendendo tempo su questo? Le persone hanno la tua fonte Python. Possono solo cambiarlo. Perché scherzare con "finale" e "costante"? –
Sai, è così apposta. I ragazzi di Python sono dell'opinione che siamo tutti adulti e dovremmo comportarci come tali. Allora perché proibire l'accesso? Agisci come un adulto e non cambiarlo mai nel tuo codice. Se un altro programmatore lo fa, è colpa sua, se il codice si rompe, e tu hai un VCS per scoprire chi dare la colpa (presumo). – Boldewyn
Inoltre, è una cosa facile da controllare. Qualsiasi istanza di 'UPPER_CASE = 'è un errore perché qualcuno ha infranto le regole. –