On 12/24/2011 07:25 PM, Steven D'Aprano wrote:
I'd use a function attribute.

def func(x, y=None):
   if y is None:
     y = func.default_y
   ...
func.default_y = []

That's awkward only if you believe function attributes are awkward.

I do. All you've done is move the default from *before* the function is
defined to *after* the function is defined, instead of keeping it in the
function definition. It's still separate, and if the function is renamed
your code stops working. In other words, it violates encapsulation of the
function.

Although we can solve that (default being after the function is defined) using a simple decorator:

def funcargs(**args):
    def __decorate_with_args(func):
        for k,v in args.items():
            setattr(func, k, v)
        return func
    return __decorate_with_args

Usage:

@funcargs(foo=4)
def bar(baz):
    return baz + bar.foo

et voila, we had just reinvented early binding default argument, with a much uglier syntax.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to