EAFP

dn PythonList at DancesWithMice.info
Sat May 14 01:05:19 EDT 2022


On 14/05/2022 04.37, bryangan41 wrote:
> Is the following LBYL:foo = 123if foo < 200:    do()

Yes (once formatted for Python).


If so, how to change to EAFP?

Not sure if can. Let's alter the code to:

foo = 0

#and

def do():
    return 5 / foo

Then, you will expect a ZeroDivisionError exception to be raised -
whereas with other values, there will (likely) be no problem.

Now, we have a clear identification for when 'forgiveness' will need to
be requested! The 'EAFP' solution encloses the function-call:

foo = 123
try:
    do()
except ZeroDivisionError:
    undo()


In the OP's code-snippet, the "200" criteria means there is no such
clean-cut and automatic 'failure' attached to, or implied by, foo's
value. However, we could define a custom-exception and 'raise the alarm'
when 'forgiveness' is required:

class ValueTooLargeError( ValueError):
    """Catch values larger than the valid range."""

def do():
    if foo < 200:
        ...
    else:
        raise ValueTooLargeError

This is a pythonic-construct (and thus a recommendable coding-pattern),
in that the calling-routine can decide how to respond to the exception -
which many vary according to the specifics of do()'s re-use.


However, is it "EAFP"? We had to introduce the exact if-condition which
makes it "LBYL"!

Perhaps time for me to bow-out, and leave such to the philosophers...


Sent from Samsung tablet.

There are pills for that...
-- 
Regards,
=dn


More information about the Python-list mailing list