Keyword arguments - strange behaviour?

Fuzzyman fuzzyman at gmail.com
Thu Dec 23 17:58:30 EST 2004


Steven Bethard wrote:
> Fuzzyman wrote:
> >>>Steven Bethard wrote:
> >>>>
> >>>>So, one of my really common use cases that takes advantage of the
> >>>>fact that default parameters are evaluated at function definition
> >>>>time:
> >>>>
> >>>>def foo(bar, baz, matcher=re.compile(r'...')):
> >>>>    ...
> >>>>    text = matcher.sub(r'...', text)
> >>>>    ...
> > Sure.. but you also gave an example of an alternative that was
complex,
>
> Interesting.  I would have thought that my example was pretty simple.

> Maybe it would be helpful to generalize it to:
>
> def foo(bar, baz, spam=badger(x, y, z)):
>      ...
>
> All it does is use a default value that was produced by a function
call.
>   I'm surprised you haven't run into this situation before...
>
> Of course, what is complex or simple is a matter of personal opinion.
I
> use this pattern so often that it's quite simple to me, but I guess I

> can understand that if you don't use such a pattern, it might seem
> foreign to you.
>
> Steve


Hello Steve,

It wasn't that part of the example that I thought was over complex.
(although it's not a 'pattern' I use often). You suggested that if we
had dynamic evaluation of default values, you would have to replace it
with :
>>>> class foo(object):
>>>>     matcher=re.compile(r'...')
>>>>     def __new__(self, bar, baz, matcher=None):
>>>>         if matcher is None:
>>>>             matcher = self.matcher
>>>>         ...
>>>>         text = matcher.sub(r'...', text)
>>>>         ...

Now that I thought was over complex... when all you wanted to do was
put a constant into your default value !

Having said that I see Steve's point about not knowing the namespace
when the function will be called.
Regards,

Fuzzy
http://www.voidspace.org.uk/python/index.shtml




More information about the Python-list mailing list