Hi Pythonians, To begin with I'd like to apologize that I am not very experienced Python programmer so please forgive me if the following text does not make any sense.
I have been missing constants in Python language. There are some workarounds available, for example the const-module. To me, this looks quite cumbersome and very unintuitive. For the interpreter, in the efficiency-wise, I just cannot tell. For the solution I came up with two new assignment operators to the language which would create a constant name and constant value: Let's welcome the new constant assignment operators := and ::= The := assignment operator says that "declare the name to be constant and immutable". However, there might be some side-effects and the constant may not always be constant as you will see below: a = [1, 2, 3] b := [4, 5, 6] # assign [4,5,6] to 'b' and declare name 'b' to be "constant" and "immutable" c := a # assign 'a' to 'c' and declare that name 'c' is "constant" and "immutable" d = c # assign 'c' to 'd' and 'd' inherits the "immutable"-attribute from 'c', but 'd' can be assigned later e = d # assign 'd' to 'e' and 'e' inherits the "immutable"-attribute from 'd', but 'e' can be assigned later a.append( b ) print a # prints [1, 2, 3, 4, 5, 6] print c # prints [1, 2, 3, 4, 5, 6] because of the side-effect print d # prints [1, 2, 3, 4, 5, 6] as well print e # prints [1, 2, 3, 4, 5, 6] no magic here c = b # 'c' cannot be assigned as 'c' is "constant" c := b # 'c' cannot be redefined either as 'c' is "constant" c.append( 7 ) # cannot be done as 'c' is "immutable" d.append( 7 ) # cannot be done as 'd' is "immutable" as it was inherited from 'c'. e.append( 7 ) # cannot be done as 'e' is "immutable" as it was inherited from 'd'. d = [7, 8, 9] # normal variable assignment because 'd' was not declared to be a "constant" d.append( 10 ) # now allowed as 'd' is not "immutable" any more The ::= copy&assign-operator says that "make a copy of the right-hand-side object and declare the name to be constant and immutable ". This would give us a true constant object which cannot be changed. Example follows: a = [1, 2, 3] b = [4, 5, 6] c ::= a # make copy of 'a' and assign that new copy to 'c' and declare that name 'c' is a "constant" and "immutable" d = c # assign 'c' to 'd' and 'd' inherits the "immutable"-attribute from 'c', but 'd' can be assigned later e := d # assign 'd' to 'e' and declare that name 'e' is "constant" and "immutable" a.append( b ) print a # prints [1, 2, 3, 4, 5, 6] print c # prints [1, 2, 3] as 'a' and 'c' are two different objects because of the ::= print d # prints [1, 2, 3] no magic here print e # prints [1, 2, 3] no magic here either c = b # 'c' cannot be assigned as 'c' is "constant" c := b # 'c' cannot be redefined either as 'c' is "constant" c.append( 7 ) # cannot be done as 'c' is "immutable" d.append( 7 ) # cannot be done as 'd' is "immutable" as it was inherited from 'c'. e.append( 7 ) # cannot be done as 'e' is "immutable" as it was inherited from 'd'. d = [7, 8, 9] # normal variable assignment because 'd' was not declared to be a "constant" d.append( 10 ) # now allowed as 'd' is not "immutable" any more The := operator would be computionally efficient as it creates only a reference to an existing object but it may suffer from side-effects. The ::= is less efficient as it makes a copy on an existing object, but gives truly constant objects. Does this make any sense to you, or are there some fatal issues that I just happened to overlook? Br, T.S. -- http://mail.python.org/mailman/listinfo/python-list