How to pop the interpreter's stack?
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Mon Dec 27 00:03:56 EST 2010
On Sun, 26 Dec 2010 09:15:32 -0800, Ethan Furman wrote:
> Steven D'Aprano wrote:
>> Right. But I have thought of a clever trick to get the result KJ was
>> asking for, with the minimum of boilerplate code. Instead of this:
>>
>>
>> def _pre_spam(args):
>> if condition(args):
>> raise SomeException("message")
>> if another_condition(args):
>> raise AnotherException("message")
>> if third_condition(args):
>> raise ThirdException("message")
>>
>> def spam(args):
>> _pre_spam(args)
>> do_useful_work()
>>
>>
>> you can return the exceptions instead of raising them (exceptions are
>> just objects, like everything else!), and then add one small piece of
>> boilerplate to the spam() function:
>>
>>
>> def _pre_spam(args):
>> if condition(args):
>> return SomeException("message")
>> if another_condition(args):
>> return AnotherException("message")
>> if third_condition(args):
>> return ThirdException("message")
>>
>> def spam(args):
>> exc = _pre_spam(args)
>> if exc: raise exc
>> do_useful_work()
>
> -1
>
> You failed to mention that cleverness is not a prime requisite of the
> python programmer -- in fact, it's usually frowned upon. The big
> problem with the above code is you are back to passing errors in-band,
> pretty much completely defeating the point of have an out-of-band
> channel.
How is that any worse than making _pre_spam() a validation function that
returns a bool?
def spam(args):
flag = _pre_spam(args)
if flag: raise SomeException()
do_useful_work()
Is that also frowned upon for being too clever?
--
Steven
More information about the Python-list
mailing list