On Fri, Feb 10, 2012 at 3:01 PM, Righard van Roy <pluij...@gmail.com> wrote:
> Hello,
>
> I want to add an item to a list, except if the evaluation of that item
> results in an exception.
> I could do that like this:
>
> def r(x):
>    if x > 3:
>        raise(ValueError)
>
> try:
>    list.append(r(1))
> except:
>    pass
> try:
>    list.append(r(5))
> except:
>    pass
>
> This looks rather clumbsy though, and it does not work with i.e. list
> comprehensions.
>
> I was thinking of writing a decorator like this:
>
> def tryAppendDecorator(fn):
>    def new(*args):
>        try:
>            fn(*args)
>        except:
>            pass
>    return new
>
> @tryAppendDecorator
> def tryAppend(list, item):
>    list.append(item)
>
> tryAppend(list, r(1))
> tryAppend(list, r(5))
>
> This does not work however because the 'item' argument gets evaluated
> before the decorator does it's magic.
>
> Is there a way to postpone the evaluation of 'item' till it gets used
> inside the decorator. Like it is possible to quote a form in Lisp.

Nope. All arguments always get evaluated before control passes to the
callee. You'd have to "quote" the arguments manually by putting them
in lambdas, thus explicitly delaying their evaluation.

Cheers,
Chris
--
http://rebertia.com
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to