On 13/05/2022 18:37, bryangan41 wrote:
Is the following LBYL:foo = 123if foo < 200:    do()If so, how to change to 
EAFP?Thanks!Sent from Samsung tablet.

The distinction between look-before-you-leap and
easier-to-ask-forgiveness-than-permission is weaker than yo might expect.

When you write

filename = ...
if exists(filename):
    with open(filename) as instream:
        # do stuff
else:
    # fallback

there are two checks for the file's existence, one explicit, and one
implicitly inside open() -- and worse, the first, explicit, check is
unreliable because between exists() and open() there is a small delay
that may be sufficient to create or delete the file. Therefore the
recommended (EAFP) version of the above is

filename = ...
try:
    with open(filename) as instrem:
        # do stuff
except FileNotFoundError
    # fallback

or just

with open(filename) as instream:
    # do stuff

if there is no meaningful fallback.

Regarding your example code, whether you can write an EAFP version for

if foo < 200:
    do()

depends on the contents of do(). If do() fails in a well-defined way,
let's say by raising a FooAbove199 exception you can write just

do()

or, if you need a fallback

try:
    do()
except FooAbove199:
    # fallback

Note that if you change do() from

do():
    # do stuff

to

def do():
    if foo < 200:
        # do stuff
    else:
        raise FooAbove199(f"Invalid {foo=!r}")

the

do()

invocation becomes EAFP even though you are actually performing the same
test as before.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to