简体   繁体   中英

raise statement on a conditional expression

Following "Samurai principle", I'm trying to do this on my functions but seems it's wrong...

return <value> if <bool> else raise <exception>

Is there any other "beautiful" way to do this? Thanks

Inline/ternary if is an expression, not a statement. Your attempt means "if bool, return value, else return the result of raise expression " - which is nonsense of course, because raise exception is itself a statement not an expression.

There's no way to do this inline, and you shouldn't want to. Do it explicitly:

if not bool:
    raise MyException
return value

If you absolutely want to raise in an expression, you could do

def raiser(ex): raise ex

return <value> if <bool> else raiser(<exception>)

This "tries" to return the return value of raiser() , which would be None , if there was no unconditional raise in the function.

I like to do it with assertions, so you emphasize that that member must to be, like a contract.

>>> def foo(self):
...     assert self.value, "Not Found"
...     return self.value

Well, you could test for the bool separately:

if expr: raise exception('foo')
return val

That way, you could test for expr earlier.

There is a way to raise inside of a ternary, the trick is to use exec :

def raising_ternary(x):
    return x if x else exec("raise Exception('its just not true')")

As you can see calling it with True will do the first part of the ternary and calling it with False will raise the exception:

>>> def raising_ternary(x):
...     return x if x else exec("raise Exception('its just not true')")
... 
>>> raising_ternary(True)
True
>>> raising_ternary(False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in raising_ternary
  File "<string>", line 1, in <module>
Exception: its just not true
>>> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM