Is it explicitly specified?

Arnaud Delobelle arnodel at googlemail.com
Mon Feb 4 00:49:01 CET 2008


On Feb 3, 11:06 pm, "Terry Reedy" <tjre... at udel.edu> wrote:


> If you have multiple optional keywords with default behaviors when they are
> not specified, the usually mechanism is the **keywords mechanism.  If you
> have just one, that may seem like overkill and some people prefer the
> pseudo-default or sentinal value approach given by Arnaud.  The only change
> I would make from his post is to add at least an underscore to the sentinal
> name to indicate that it is private to the module and not for use of
> importers (and excluded from 'import *').

Yes, or you can even be more radical and use this construct which
leverages the little known fact that 'apply', far from being a mere
deprecated built-in function, is in fact a powerful decorator that
reduces namespace pollution!

@apply
def func(nokey=object()):
    def the_real_func(key=nokey):
        if key is nokey:
            print "no key given"
        else:
            print "key given"
    return the_real_func

>>> func(1)
key given
>>> func()
no key given
>>> func(key=2)
key given

Note that 'apply' has many uses:

Say I have an expensive function f and I want to find y=f(x)*(1+f(x))

Instead of having to pollute my namespace with a temp value:
temp = f(x)
y = temp*(1+temp)

I can use the very pythonic 'apply' decorator:
@apply
def y(z=f(x)): return z*(1+z)

Mmh.  Maybe I should patent it, I've never seen it before...

--
Arnaud

PS: this is not a serious suggestion :)




More information about the Python-list mailing list