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

Stephen J. Turnbull stephen at xemacs.org
Wed Oct 16 17:24:23 CEST 2013


Victor Stinner writes:

> the idea), but I don't understand the purpose of adding a new syntax
 > doing exactly the same than try/except:
 > 
 > >     with trap(OSError) as cm:
 > >         os.unlink('missing.txt')
 > >     if cm.exc:
 > >         do_something()
 > 
 > Nobody noticed that this can be written:
 > 
 > try:
 >   os.unlink('missing.txt')
 > except OSError as err:
 >   # do something with err

A couple of people did, and it was pointed out that "with trap ... if"
allows intervening statements that are *not* in the "with" suite,
while all of the statements between "try" and "except" must be part of
the "try" suite.  The actual equivalent would be

    try:
        os.unlink('missing.txt')
    except OSError as err:
        pass
    # unhandled statements may go here
    if err:
        # do something with err

This is really horrible.

 > ?? What happened with the Zen Principle "There should be one-- and
 > preferably only one --obvious way to do it."

AIUI, the justification for this feature goes something like this:

1.  It is fast and effective to use a try ... except block to catch
    and ignore an exception, but it's awkward and ugly, which may
    deter people from catching those exceptions.  This is much nicer.

2.  The "attractive nuisance" argument against the nicer syntax is
    probably a fallacy: cargo cult programmers benefit as much as
    Raymond's students from the correct single-line-suite usage.  On
    the other hand, nicer syntax may make it easier to wean the cargo
    cult programmers from multi-statement try suites, and there's
    little evidence that the nicer syntax would actually encourage
    them to use more multi-statement suites.

3.  As for the *several* Zen principles this feature violates, we
    really should encourage people to "do something appropriate" with
    exceptions, instead of

    try:
        main()
    except:
        print("You REALLY SCREWED UP this time, didn't you!",
              file=sys.stderr)
        sys.exit(errors.PEBKAC)

    but encouraging robust programming is hard: exception handling is
    just plain awkward if you do it in any generality.  We hope "with
    ignore()" can help in one frequently encountered, easily
    understood, use case.



More information about the Python-Dev mailing list