[Python-ideas] my take on mutable default arguments

Chris Rebert cvrebert at gmail.com
Sat Jan 27 23:12:34 CET 2007


As pointed out by Calvin Spealman in an earlier email:

Calvin Spealman wrote:
 > Deep copy of the originally created
 > default argument can be expensive and would not work in any useful way
 > with non-literals as defaults, such as function calls or subscript
 > lookups or even simple attributes.

However, your decorator is useful in several common cases.
- Chris Rebert

tomer filiba wrote:
> i thought this code be solved nicely with a decorator... it needs some
> more work, but it would make a good cookbook recipe:
> 
> .>>> from copy import deepcopy.
> .>>>
> .>>> def defaults(**kwdefs):
> ...     def deco(func):
> ...         def wrapper(*args, **kwargs):
> ...             for k,v in kwdefs.iteritems():
> ...                 if k not in kwargs:
> ...                     kwargs[k] = deepcopy(v)
> ...             return func(*args, **kwargs)
> ...         return wrapper
> ...     return deco
> ...
> .>>> @defaults(x = [])
> ... def foo(a, x):
> ...     x.append(a)
> ...     print x
> ...
> .>>> foo(5)
> [5]
> .>>> foo(5)
> [5]
> .>>> foo(5)
> [5]
> 
> maybe it should be done by copying func_defaults... then it could
> be written as
> 
> @copydefaults
> def f(a, b = 5, c = []):
>     ...
> 
> 
> -tomer
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
> 



More information about the Python-ideas mailing list