Keyword arguments - strange behaviour?

Fuzzyman fuzzyman at
Thu Dec 23 12:45:26 CET 2004

brian.b... at wrote:
> > Channelling the effbot, I think he was asking what namespace
> you
> > expected the expression "arg=otherfunction(x)" to be evaluated in
> when
> > it's used at the time of a function call to dynamically create a
> > default value for arg.
> Thanks, I realise now that's what was meant. I think I was just
> assuming otherfunction() would be globally available - but that's not
> something I want to go into since I can see now there will be
> trying to define what python should do if it evaluated defaults at
> function call :)
> I think I can now explain to someone why there are good reasons that
> the default params are evaluated at the definition. However, I still
> can't give a nice looking solution on how to re-write a function to
> have empty mutable values as default arguments: eg.
> def method(a,b,opt1=[],opt2=None,opt3="",opt4={})
> How could I re-write this (especially if there are perhaps 20
> parameters,any number of which may have mutable defaults) without
> writing 20 "if opt1 is None: opt1=[]" statements?
> Brian

One way that is *slightly neater* is to simply collect all keyword
arguments as a dictionary. Then compare with a dictionary of defaults
for any missing keywords.

def afunction(**keywargs):
defaults = {'param1' : [], 'param2' : {}, 'param3' : []}
for entry in defaults:
if not keywargs.has_key(entry):
keywargs[entry] = defaults[entry]

This keeps all your defaults in a single dictionary and avoids a really
long function definition.


More information about the Python-list mailing list