[Python-ideas] revisit pep 377: good use case?

Steven D'Aprano steve at pearwood.info
Thu Mar 1 01:00:03 CET 2012

Craig Yoshioka wrote:
> I've tried classes, decorators, and passing the conditional using 'as', as 
> suggested by Michael,  so I disagree that with is not suitable here since I have 
> yet to find a better alternative.  If you want I can give pretty concrete 
> examples in the ways they aren't as good.  Furthermore, I think it could be 
> argued that it makes more sense to be able to safely skip the with body without 
> the user of the with statement having to manually catch the exception 
> themselves.... we don't make people catch the StopIteration exception manually 
> when using iterators...

Sometimes we do. When you call next(it) manually, you are responsible for 
catching the exception manually. It is only flow-control tools (e.g. for 
loops, list comprehensions) that catch the exception for you.

> 1)  I can't think of many instances in python where a block of code can not be 
> conditionally executed safely:
>      if - obvious
>      functions - need to be called
>      loops - can have 0 or more iterations
>      try/except/finally - even here there is the same notion of the code blocks 
> being conditionally executed, just a bit more scrambled

Classes are blocks of code. If you want to conditionally skip executing all, 
or part, of a class block you wrap it in an if block. (Or try...except.) This 
is as it should be: the class statement is not a flow control statement.

Nor is the def statement. In this case, the right concept is not in *calling* 
the function body, but in *compiling* the function body. Again, if you want to 
  conditionally skip compiling all or part of the function body, you have to 
wrap it in a flow control structure, if or try.

We don't have any concept of:

     class K: body

     def f(): body

where something inside the bodies invisibly determines whether or not the K 
block executes or the f block compiles.


More information about the Python-ideas mailing list