[Python-Dev] Re: anonymous blocks
Nick Coghlan
ncoghlan at gmail.com
Wed Apr 27 13:44:49 CEST 2005
Greg Ewing wrote:
> Nick Coghlan wrote:
>
>> def template():
>> # pre_part_1
>> yield None
>> # post_part_1
>> yield None
>> # pre_part_2
>> yield None
>> # post_part_2
>> yield None
>> # pre_part_3
>> yield None
>> # post_part_3
>>
>> def user():
>> block = template()
>> with block:
>> # do_part_1
>> with block:
>> # do_part_2
>> with block:
>> # do_part_3
>
>
> That's an interesting idea, but do you have any use cases
> in mind?
I was trying to address a use case which looked something like:
do_begin()
# code
if some_condition:
do_pre()
# more code
do_post()
do_end()
It's actually doable with a non-looping block statement, but I have yet to come
up with a version which isn't as ugly as hell.
> I worry that it will be too restrictive to be really useful.
> Without the ability for the iterator to control which blocks
> get executed and when, you wouldn't be able to implement
> something like a case statement, for example.
We can't write a case statement with a looping block statement either, since
we're restricted to executing the same suite whenever we encounter a yield
expression. At least the non-looping version offers some hope, since each yield
can result in the execution of different code.
For me, the main sticking point is that we *already* have a looping construct to
drain an iterator - a 'for' loop. The more different the block statement's
semantics are from a regular loop, the more powerful I think the combination
will be. Whereas if the block statement is just a for loop with slightly tweaked
exception handling semantics, then the potential combinations will be far less
interesting.
My current thinking is that we would be better served by a block construct that
guaranteed it would call __next__() on entry and on exit, but did not drain the
generator (e.g. by supplying appropriate __enter__() and __exit__() methods on
generators for a PEP 310 style block statement, or __enter__(), __except__() and
__no_except__() for the enhanced version posted elsewhere in this rambling
discussion).
However, I'm currently scattering my thoughts across half-a-dozen different
conversation threads. So I'm going to stop doing that, and try to put it all
into one coherent post :)
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.skystorm.net
More information about the Python-Dev
mailing list