[Python-Dev] PEP 463: Exception-catching expressions
Yury Selivanov
yselivanov.ml at gmail.com
Sat Feb 22 02:48:01 CET 2014
On 2/21/2014, 7:42 PM, Ethan Furman wrote:
> On 02/21/2014 11:04 AM, Yury Selivanov wrote:
>> On 2/20/2014, 10:15 PM, Chris Angelico wrote:
>>>
>>> * list.pop() - no way to return a default
>>
>> We can fix that in 3.5.
>
> How many are you going to "fix"? How are you going to "fix" the
> routines you don't control?
This new syntax won't magically fix all the code either.
But it may let people write code like this:
# I'm sorry, I really can't read this.
logging.info("Message shown to user: %s",((cache[k]
except LookupError:
(backend.read(k) except OSError: 'Resource not available')
)
if check_permission(k) else 'Access denied'
) except BaseException: "This is like a bare except clause")
or this:
# We happily mask exceptions from getgrnam
g = grp.getgrnam(tarinfo.gname)[2] except KeyError: tarinfo.gid
And this particular case or list.pop method, let's be honest,
can be fixed ;)
>
>>> * seq[index] - no way to handle a bounds error
>>
>> We can add 'list.get(index, default)' method, similar to
>> 'Mapping.get'. It's far more easier than introducing new
>> syntax.
>
> When I have to keep writing the same code over and over and aver
> again, I find a better way to do the job. In this case, an exception
> expression does quite nicely.
I can't believe you find
list[42] except IndexError: 'spam'
to be better than
list.get(42, 'spam')
If IndexError is such a big deal, I think we can add this function
to list and collections.abc.Sequence. Authors of libraries
will follow.
>
>> I also searched how many 'except IndexError' are in
>> the standard library code. Around 60. That's a rather
>> low number, that can justify adding 'list.get' but not
>> advocate a new syntax.
>
> And roughly 200 of KeyError, another couple hundred of ValueError...
Many KeyErrors can be fixed with a proper use of '.get()', or 'in'
operator.
Many AttributeErrors can be fixed with use of getattr() or
hasattr(), or by designing a better API.
Many ValueErrors... wait, there are no ValueError examples
in the PEP, so I won't comment.
>
> This is not just about better handling of [missing] default values,
> but of better exception handling. This PEP adds the ability to use a
> scalpel instead of a sledge hammer.
I'd say it's another sledge-hammer, but a tad smaller and a cuter
one (to some people). But it's still exception handling, still
more code than a function call.
Yury
More information about the Python-Dev
mailing list