On Fri, 18 Jan 2013 03:38:08 +0000, Dan Sommers wrote: > On Thu, 17 Jan 2013 15:21:08 +0000, Steven D'Aprano wrote: > >> On Thu, 17 Jan 2013 06:35:29 -0800, Mark Carter wrote: >> >>> I thought it would be interesting to try to implement Scheme SRFI 39 >>> (Parameter objects) in Python. >>> >>> The idea is that you define a function that returns a default value. >>> If you call that function with no arguments, it returns the current >>> default. If you call it with an argument, it resets the default to the >>> value passed in. Here's a working implementation: >> [...] >>> Can anyone suggest a better implementation? >> >> I don't like the decorator version, because it requires creating a do- >> nothing function that just gets thrown away. He's my version, a factory >> function that takes two arguments, the default value and an optional >> function name, and returns a Param function: [...] > > This, or something like this, is very old: > > sentinel = object() > class Magic: > def __init__(self, value): > self.value = value > def __call__(self, value=sentinel): > if value != sentinel: > self.value = value > return self.value
There's not really any magic in that :-) Better to use "if value is not sentinel" rather than != because the caller might provide a custom object that compares equal to sentinel. Also you should name it SENTINEL, or even _SENTINEL, to indicate that it is (1) a constant, and (2) a private variable. > It's not a function, nor a decorator, but it behaves like a function. A callable, so-called because you can call it :-) I believe that C++ calls it a "functor", not to be confused with what Haskell calls a functor, which is completely different. -- Steven -- http://mail.python.org/mailman/listinfo/python-list