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