On Sun, 18 Jan 2009 07:36:53 -0800, Paul Rubin wrote: > Steven D'Aprano <st...@remove-this-cybersource.com.au> writes: >> def foo(self, x, y=None): >> if y is None: >> y = self.a >> >> I don't find that clumsy in the least. I find it perfectly readable and >> a standard idiom. > > That has the same problem as the earlier version.
No it doesn't. The earlier version had the problem that *any* false object is replaced by self.a. I'm just following the standard Python idiom of using None as a sentinel. Have a look through the standard library and see how many times it is used. Built-ins rarely accept None as a sentinel, slice() being a conspicuous exception. This is sometimes a nuisance when writing wrappers: def my_find(S, sub, start=None, end=None): """Like string.find() only with pre-processing.""" pre_process() # stub for something complicated if end is None and start is None: return S.find(sub) elif end if None: return S.find(sub, start) else: return S.find(sub, start, end) or if you prefer: def my_find(S, sub, start=None, end=None): """Like string.find()""" pre_process() args = [sub] if start is not None: args.append(start) if end is not None: args.append(end) return S.find(*args) Having said that, there are times where you need to pass None as a legitimate argument and not as a sentinel. In that case, your solution: > If the person passes > None, they get self.a. I prefer: > > sentinel = object() > ... > > def foo(x, y=sentinel): > if y is sentinel: > y = self.a is an excellent one. -- Steven -- http://mail.python.org/mailman/listinfo/python-list