Every (unqualified) name in Python is a variable. Which means its value can be changed. If you want something that has a value that cannot be changed, you have to make it an attribute of an object. For example, enums work this way. You could define an enum for constants, but enums are nominally opaque to some degree. If you want non-opaque constant definitions, how about this:
def constants(**kwargs) : "defines an object with attributes that are given read-only" \ " values according to the keyword arguments passed." class generator_class : "parent class for generating constant-container instance." pass #end generator_class def gen_constitem(name, val) : def constitem(self) : return \ val #end constitem #begin gen_constitem constitem.__name__ = name return \ property(constitem) #end gen_constitem #begin constants for name in kwargs : setattr(generator_class, name, gen_constitem(name, kwargs[name])) #end for return \ generator_class() #end constants Example use: MY_CONSTS = constants \ ( apple = "fruit", count = 3, compound = {"key" : "value"}, ) print(MY_CONSTS.apple) print(MY_CONSTS.count) print(MY_CONSTS.compound) MY_CONSTS.apple = 2.0 print(MY_CONSTS.apple) produces output: fruit 3 {'key': 'value'} --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-22-e46d365e805a> in <module>() 31 print(MY_CONSTS.count) 32 print(MY_CONSTS.compound) ---> 33 MY_CONSTS.apple = 2.0 34 print(MY_CONSTS.apple) AttributeError: can't set attribute -- https://mail.python.org/mailman/listinfo/python-list