[Python-Dev] cpython: Rename contextlib.ignored() to contextlib.ignore().

Charles Hixson charleshixsn at earthlink.net
Tue Oct 15 04:57:24 CEST 2013


On 10/14/2013 06:04 PM, Zero Piraeus wrote:
> :
>
> On Tue, Oct 15, 2013 at 10:18:56AM +1000, Nick Coghlan wrote:
>> I didn't articulate the point very well. The reason I originally
>> approved the change (and the reason I have kept it despite the
>> objections raised) is because it allows correct-but-ugly code like:
>>
>>      try:
>>          os.unlink(fname)
>>      except FileNotFoundError:
>>          pass
>>
>> To be rewritten as the significantly more elegant:
>>
>>      with ignore(FileNotFoundError):
>>          os.unlink(fname)
> I thought that was already clear, to be honest. As an aside, calling the
> try/except construct above "ugly" seems a stretch to me - it's a little
> verbose if you're going to be using it a lot, but presumably in that
> case you'd just wrap it in a safe_unlink() convenience function if it
> became annoying.
>
>> This benefit when used correctly then needs to be weighed against the
>> risk of it being used *incorrectly*, especially by people that expect
>> it to work like VB's "on error resume next" rather than by suppressing
>> the exception and resuming execution after the with statement.
>>
>> The problem of overbroad exception handling isn't a new one, though,
>> and I don't believe this feature makes that problem *worse*, and, by
>> making it simpler and cleaner to suppress exceptions from a single
>> statement, may make it better. For example, this code is wrong:
>>
>>      try:
>>          os.unlink(fname)
>>          os.unlink(fname2)
>>      except FileNotFoundError:
>>          pass
> Yes, it's bad code, but it's more intuitively obvious what it does (and
> therefore that it's badly written) than the equivalent
>
>      with ignore(FileNotFoundError):
>          os.unlink(fname)
>          os.unlink(fname2)
>
> ... as others have pointed out. The above suffers from the same
> (famously solved by Python) problem as C code with inconsistent braces
> and indentation: there's a disconnect between what it looks like and
> what it does.
>
> I think one problem is that ignore() doesn't actually do what its name
> suggests - the flow of execution is changed if an exception occurs,
> which by definition means the exception isn't being ignored.
>
> Maybe it would be better to call it silence()? That's still not perfect
> IMO, but it's closer to an accurate description of what's going on.
>
>   -[]z.
>
but is:

     with ignore(FileNotFoundError):
         os.unlink(fname)
         os.unlink(fname2)

equivalent to:

     try:
         os.unlink(fname)
         os.unlink(fname2)
     except FileNotFoundError:
         pass

or to:

     try:
         os.unlink(fname)
     except FileNotFoundError:
         pass
    try:
         os.unlink(fname2)
     except FileNotFoundError:
         pass


If the documentation isn't clear, I'd read it the second way.  (And I'd 
*WANT* it to be the second way.)

-- 
Charles Hixson



More information about the Python-Dev mailing list