That wont be an oneliner still. We can add decorator to a function,  and
that don't even be very readable. If we can convert that decorator to an
inbuilt keyword that would work as an one liner and would be very readable
too.

On Sun, 23 May 2021, 18:56 Ricky Teachey, <ri...@teachey.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/CF5OOOSVZJUGFQF7B3EDEPKIRCCEYGQD/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to