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

Reply via email to