[coelacanth ~ 01:22:26]$ cat constancy.py import sys, warnings WARNALLOW, WARNDISALLOW, ERROR = range(3) class ConstantAssignmentError(Exception): pass def constancy(permission=WARNALLOW): caller = sys._getframe(1).f_globals['__name__'] mod = __import__(caller) class Mod(type(sys)): def __getattribute__(self, k): return getattr(mod, k) def __setattr__(self, k, v): if not (k[0].isalpha() and k[0].isupper()): setattr(mod, k, v) return if hasattr(self, k): msg = "Assignment to constant '%s'" % k if permission == ERROR: raise ConstantAssignmentError(msg) if permission == WARNDISALLOW: msg += " (disallowed)" warnings.warn(msg, stacklevel=2) return warnings.warn(msg+" (allowed)", stacklevel=2) setattr(mod, k, v) sys.modules[caller] = Mod(caller) constancy(WARNDISALLOW) [coelacanth ~ 01:22:28]$ python Python 2.5.1 (r251:54863, Mar 19 2008, 21:33:01) [GCC 3.4.4 (Gentoo 3.4.4-r1, ssp-3.4.4-1.0, pie-8.7.8)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import constancy >>> constancy.WARNALLOW = 'hi!' __main__:1: UserWarning: Assignment to constant 'WARNALLOW' (disallowed) >>> constancy.WARNALLOW 0 >>> constancy.hi = 'hi' >>> constancy >>>