Albert Hopkins wrote:
On Wed, 2008-12-03 at 13:38 -0800, Warren DeLano wrote:
A bottom line / pragmatic question... hopefully not a FAQ.
Why was it necessary to make "as" a reserved keyword?
And more to the point, why was it necessary to prevent developers from
being able to refer to attributes named "as"?
For example, this code breaks as of 2.6 / 3.0:
Class C:
Pass
obj = C()
obj.bs = 2 # valid
obj.as = 1 # syntax error
obj.cs = 3 # valid
Just to be clear: I understand why it breaks, since "as" is now a
keyword, I also know that one can use workarounds such as:
obj.__dict__['as'] = 1
to maintain compatibility.
What I want to understand is why this parser change was necessary in
order to enable new 2.6/3.0 features. Was this change potentially
avoidable?
Why can't the parser distinguish between a standalone " as " keyword and
".as" used as an object/attribute reference?
Couldn't we have continued along just fine using a smarter parser
without elevating "as" to reserved status (and thus potentially breaking
a 10+ years of existing code)?
Thank you for enlighting me!
(Unfortunately, our project may now have to maintain a branch at 2.5.x
in order to preserve compatibility with existing third-party scripts &
infrastructure which routinely rely upon "as" as an object method.
Sigh.)
Cheers,
Warren
The short answer is that "as" is a keyword as of 2.6 (with the
introduction of the "with" statement) and to be fair none of the other
keywords can be identifiers.
Also to be fair, there seems to be warning at least in my version of
python 2.5:
import sys
sys.version_info
(2, 5, 1, 'final', 0)
class C:
... pass
...
obj = C()
obj.as = 3
<stdin>:1: Warning: 'as' will become a reserved keyword in Python 2.6
The parser in Python v2.5 can identify when "as" has its special meaning
by context, but it's better to be consistent. Hopefully there won't be
many reserved words (IIRC, COBOL has a _large_ number of them)! If you
still want a name like that then the convention is to add a trailing
underscore, eg the "pass_" method of POP3 objects in poplib. That
probably doesn't help you, though. :-(
--
http://mail.python.org/mailman/listinfo/python-list