Favorite non-python language trick?
Steven D'Aprano
steve at REMOVETHIScyber.com.au
Sun Jun 26 00:30:15 EDT 2005
On Sat, 25 Jun 2005 23:08:10 +0000, Bengt Richter wrote:
> On Sun, 26 Jun 2005 04:08:31 +1000, Steven D'Aprano <steve at REMOVETHIScyber.com.au> wrote:
>
>>On Fri, 24 Jun 2005 15:47:45 -0700, James Stroud wrote:
>>
>>> On Friday 24 June 2005 05:58 am, Steven D'Aprano wrote:
>>>> with colour do begin
>>>> red := 0; blue := 255; green := 0;
>>>> end;
>>>>
>>>> instead of:
>>>>
>>>> colour.red := 0; colour.blue := 255; colour.green := 0;
>>>>
>>>> Okay, so maybe it is more of a feature than a trick, but I miss it and it
>>>> would be nice to have in Python.
>
> How do you like the following?
> >>> color = type('',(),{})() # an instance that will accept attributes
> >>> vars(color)
> {}
>
> The single line replacing
> """
> with colour do begin
> red := 0; blue := 255; green := 0;
> end;
> """
> follows:
> >>> vars(color).update(red=0, blue=255, green=0)
The point is that a hypothetical "with" block would have to allow
arbitrary access to dotted names: getting, setting, deletion, and method
calling, not just one very limited form of keyword assignment.
I understand how to manipulate __dict__ as an more complicated (dare I say
obfuscated?) way of assigning to object attributes.
[snip]
> We can clear those attributes from the instance dict:
>>>> vars(colour).clear()
>>>> vars(colour)
> {}
Which has the unfortunate side effect of also destroying any other
instance attributes.
>>you might do this:
>>
>>with myobject:
>> # read a class attribute
>> print .__class__.myattribute
>> # set an instance attribute
>> .widget.datapoints[.collector] = .dispatcher(.widget.current_value)
>>
>
> def mywith(o=myobject):
> # read a class attribute
> print o.__class__.myattribute
> # set an instance attribute
> o.widget.datapoints[o.collector] = o.dispatcher(o.widget.current_value)
> mywith()
[snip]
> Is a one-character prefix to the dot objectionable?
That's a good workaround, subject to namespace pollution issues, and one
that I'm aware of. Although do you really want to be creating a unique
function definition every time you want to use the with idiom?
I'm not about to stop using Python because of the lack of Pascal-like
"with" blocks. It is a nice feature to have, but I'm aware that Guido
prefers explicit to implicit and "with" is extremely implicit.
--
Steven.
More information about the Python-list
mailing list