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