Snippet 1
do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
Snippet 2
try:
do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
except:
pass
Snippet 3
try: do_magic(); except: pass
try: do_foo() ; except: pass
try: do_bar() ; except: pass
Is there a way to write code snippet 3 elegantly?
- if
do_magic()
fails or not,do_foo()
anddo_bar()
should be executed. - if
do_foo()
fails or not,do_bar()
should be executed.
In Basic/Visual Basic/VBS, there's a statement called On Error Resume Next
which does this.
you could try a nested ´try´ loop, alltho that might not be as elegantly pythonic as you might want. the ´lambda´ solution is is also a good way to go, did not mention because it was done in the previous answer
edit:
edit 2:
well damnnit, this answer just got posted seconds beforehand again :|
In Python 3.4 onwards, you can use
contextlib.suppress
:Alternatively,
fuckit
.In the question, Snippet 3 does not work but will work if you don't mind splitting each line over two lines...
A working example..
..if you save this to test.py and then at a CMD prompt in windows simply type
test.py
it will returnNo_Arg1 No_Arg2 No_Arg3
because there were no arguments. However, if you supply some arguments, if typetest.py 111 222
it will return111 222 No_Arg3
etc. (Tested - Windows 7, python2.7).IMHO this is far more elegant than the nesting example replies. It also works exactly like On Error Resume Next and I use it when translating from VB6. One issue is that the
try
lines cannot contain a conditional. I have found that as a rule, python cannot contain more than one:
in a line. That said, it simply means splitting the statement over 3 lines etc.If all three functions accept same number of parameters:
Otherwise, wrap the function call with
lambda
.If there are no parameters...
A lot of ident, but it works