the annoying, verbose self

Colin J. Williams cjw at sympatico.ca
Sat Nov 24 08:45:58 EST 2007


Kay Schluehr wrote:
> Colin J. Williams schrieb:
>> Kay Schluehr wrote:
>>> On Nov 22, 8:43 pm, Bruno Desthuilliers
>>> <bdesth.quelquech... at free.quelquepart.fr> wrote:
>>>> Colin J. Williams a écrit :
>>>>
>>>>
>>>>
>>>>> bearophileH... at lycos.com wrote:
>>>>>> Alexy:
>>>>>>> Sometimes I
>>>>>>> avoid OO just not to deal with its verbosity.  In fact, I try to 
>>>>>>> use
>>>>>>> Ruby anywhere speed is not crucial especially for @ prefix is 
>>>>>>> better-
>>>>>>> looking than self.
>>>>>> Ruby speed will increase, don't worry, as more people will use it.
>>>>>> Bye,
>>>>>> bearophile
>>>>> I don't see this as a big deal, but suppose that the syntax were
>>>>> expanded so that, in a method, a dot ".", as a precursor to an 
>>>>> identifier,
>>>>> was treated as "self." is currently treated?
>>>> <dead-horse-beaten-to-hell-and-back>
>>>>
>>>> Python's "methods" are thin wrapper around functions, created at 
>>>> lookup
>>>> time (by the __get__ method of the function type). What you define 
>>>> in a
>>>> class statement are plain functions, period. So there's just no way to
>>>> do what you're suggesting.
>>>>
>>>> </dead-horse-beaten-to-hell-and-back>
>>>
>>> The object model is irrelevant here. The substitution is purely
>>> syntactical and gets resolved at compile time:
>>>
>>> def foo(first, ...):
>>>     .bar = ...
>>>
>>> is always equivalent with:
>>>
>>> def foo(first, ...):
>>>     first.bar = ...
>>>
>>> and generates the same bytecode.
>>>
>>> Whether this is helpfull, beautifull or necessary is another issue.
>>>
>>> Kay
>>
>> I had never thought of trying the above, which is, essentially what I 
>> was
>> suggesting, as the syntax specifies:
>>
>> primary ::=
>>              atom | attributeref
>>               | subscription | slicing | call
>>
>> attributeref ::=
>>              primary "." identifier
>>
>> I did try it and get:
>>
>> # tmp.py
>> class Z():
>>   def __init__(self):
>>     a= 1
>>     self.b= 2
>>     #.c= 3         Marked as a syntax error by PyScripter
>>
>> def y(self):
>>   self.a= 4
>>   #.b= 5           Marked as a syntax error by PyScripter
>>
>> It seems that some, probably simple, change in the parsing is needed.
>>
>> Colin W.
>
> Sure. Since you cite the grammar let me say that I find it somewhat
> confusing that the grammar in the Python documentation doesn't
> correspond to the grammar used by the CPython parser. For the following
> I will use the notations of the Grammar file used by the CPython parser.
>
> In order to adapt the syntax take a look at
>
> atom: ('(' [yield_expr|testlist_gexp] ')' |
>       '[' [listmaker] ']' |
>       '{' [dictmaker] '}' |
>       '`' testlist1 '`' |
>       NAME | NUMBER | STRING+)
>
> The last row must be changed to
>
>       ['.'] NAME | NUMBER | STRING+)
>       ~~~~~
>
> But then you run into conflict with the definition of the ellipsis in 
> rule
>
> subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
>
> because you need two token of lookahead. Pythons LL(1) parser might not
> manage this.
>
> This problem vanishes with Python 3.0 which defines an own ellipsis 
> literal:
>
> atom: ('(' [yield_expr|testlist_comp] ')' |
>       '[' [testlist_comp] ']' |
>       '{' [dictorsetmaker] '}' |
>       NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
>
> Kay
>
Many thanks for this clarification.  I hope that those beavering away on
Python 3000 will give further consideration to this matter.

Colin W.
>
>



More information about the Python-list mailing list