On Aug 23, 3:11 pm, Peter Otten <__pete...@web.de> wrote: > Mark Carter wrote: > > Suppose I want to define a function "safe", which returns the argument > > passed if there is no error, and 42 if there is one. So the setup is > > something like: > > > def safe(x): > > # WHAT WOULD DEFINE HERE? > > > print safe(666) # prints 666 > > print safe(1/0) # prints 42 > > > I don't see how such a function could be defined. Is it possible? > > 1/0 is evaluated before safe() is called. Therefore safe() has no chance to > catch the exception. You have to move the evaluation into the safe() > function: > > >>> def safe(deferred, default=42, exception=Exception): > > ... try: > ... return deferred() > ... except exception: > ... return default > ...>>> print safe(lambda: 666) > 666 > >>> print safe(lambda: 1/0) > > 42
Nice! Functional programmers know that once you have a lazy language, you can simulate all control constructs within that framework. eg in Haskell one could define an 'if-function' as iffunc (True, a, b) = a iffunc (False, a, b) = b In most other languages such a definition would not work. What Peter has demonstrated is that for an eager language like python, a bare-lambda is a lazy-fying construct -- http://mail.python.org/mailman/listinfo/python-list