FYI, Something very similar already exists in the standard library, contextlib.suppress: https://docs.python.org/3/library/contextlib.html#contextlib.suppress
It makes a nice 2+ liner for a lot of situations: with suppress(Exception): ... Seems more flexible than OPs keyword suggestion as you can fit an entire block of code in there, not just a single expression. And it's quite semantically expressive. Damian (he/him) On Sun, May 23, 2021 at 9:28 AM Ricky Teachey via Python-ideas < python-ideas@python.org> wrote: > I think you can already do all of this with a custom exception-swallowing > decorator function. > > Something like this: > > from functools import wraps > > def swallow(*exceptions, default=Exception, result=None): > if not exceptions: > exceptions = Exception, > def decorator(func): > @wraps(func) > def wrapped(*args, **kwargs): > try: > return func(*args, **kwargs) > except exceptions: > return result > return wrapped > return decorator > > Then just write: > > @swallower() > def some_func(): > log_to_telegram('This is a not important message. It's okay even if > it isn\'t delivered.') > > For divide by zero errors you need to put the division operation in a > lambda function: > > safe_divide = swallow(DivideByZero, result=0) > division = safe_divide(lambda: a/b) > > I didn't test any of this but it should be working. > > On Sun, May 23, 2021, 8:54 AM Shivam Saini <shivams...@gmail.com> wrote: > >> Sometimes, we need to execute a statement, which might throw an exception >> and we want to return None if it causes an exception. In short, we want to >> run that command as failsafe mode, so that it doesn't cause abnormal >> termination in case of any exception. >> >> *Approach till now:* >> >> def log_to_telegram(text): >> ''' Suppose you want to send some log to some telegram channel using >> telegram bot api. It might raise Network Error, or Invalid Bot token error. >> ''' >> send_message(CHANNEL, BOT_TOKEN, TEXT) # Suppose send_message is a >> function wrapper for telegram bot api. >> >> def some_func(): >> try: >> log_to_telegram('This is a not important message. It's okay even >> if it isn\'t delivered.') >> except: >> pass >> # Next work >> >> *Suggested approach:* >> >> # consider the same log_to_telegram function as defined in previous >> example >> >> def some_func(): >> safe log_to_telegram('This is a not important message. It's okay even >> if it isn\'t delivered.') >> # safe keyword ensures that it raises no exception and the process >> isn't terminated even if log_to_telegram function raises an exception. >> >> *Other examples:* >> >> *1. By default, it will return None.* >> * Example: * >> try: >> file = open('some_file') >> except: >> file = None >> * Can be rewritten as:* >> file = safe open('some_file') >> >> *2. We can provide a return value explicitly which should be returned in >> case of some exception.* >> * Example: * >> try: >> division = a/b >> except: >> division = 0 >> * Can be rewritten as:* >> division = safe(0) a/b >> >> *3. We can set what exceptions we want to be 'safed'.* >> * Example: * >> try: >> element = some_list[index]/divisor >> except ZeroDivisionError: >> element = 0 # It will make element zero if divisor is zero, >> but it will not except IndexError in case index is out of range for >> some_list >> * Can be rewritten as:* >> element = safe(0, ZeroDivisionError) some_list[index]/divisor >> >> *I think this keyword should be there in python, it will make code short >> and readable. * >> _______________________________________________ >> Python-ideas mailing list -- python-ideas@python.org >> To unsubscribe send an email to python-ideas-le...@python.org >> https://mail.python.org/mailman3/lists/python-ideas.python.org/ >> Message archived at >> https://mail.python.org/archives/list/python-ideas@python.org/message/5SEDN6AUM7LZPZZJJZ3RMAKHKHN6N665/ >> Code of Conduct: http://python.org/psf/codeofconduct/ >> >> _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/ORKXAAH2EZFYHJMVU74H5R6BSJVMMER7/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/D5SCJFV3ASC5VJTCQ2ENGCVGALQCOXGT/ Code of Conduct: http://python.org/psf/codeofconduct/