Velocity Reviews > Normalizing arguments

# Normalizing arguments

Dan Ellis
Guest
Posts: n/a

 10-17-2008
Given some function, f(a, b, c=3), what would be the best way to go
about writing a function, g(f, *args, **kwargs), that would return a
normalized tuple of arguments that f would receive when calling
f(*args, **kwargs)? By normalized, I mean that the result would always
be (a, b, c) regardless of how g was called, taking into account
positional arguments, keyword arguments, and f's default arguments.

g(f, 1, 2, 3) -> (1, 2, 3)
g(f, 1, 2, c=3) -> (1, 2, 3)
g(f, 1, c=3, b=2) -> (1, 2, 3)
g(c=3, a=1, b=2) -> (1, 2, 3)
g(1, 2) -> (1, 2, 3)

All the required information is available between args, kwargs and f
(the function object), but I don't know the exact algorithm. Has
anyone already done this, or should I just dig around in the CPython
source and extract an algorithm from there?

Steve Holden
Guest
Posts: n/a

 10-17-2008
Dan Ellis wrote:
> Given some function, f(a, b, c=3), what would be the best way to go
> about writing a function, g(f, *args, **kwargs), that would return a
> normalized tuple of arguments that f would receive when calling
> f(*args, **kwargs)? By normalized, I mean that the result would always
> be (a, b, c) regardless of how g was called, taking into account
> positional arguments, keyword arguments, and f's default arguments.
>
> g(f, 1, 2, 3) -> (1, 2, 3)
> g(f, 1, 2, c=3) -> (1, 2, 3)
> g(f, 1, c=3, b=2) -> (1, 2, 3)
> g(c=3, a=1, b=2) -> (1, 2, 3)
> g(1, 2) -> (1, 2, 3)
>
> All the required information is available between args, kwargs and f
> (the function object), but I don't know the exact algorithm. Has
> anyone already done this, or should I just dig around in the CPython
> source and extract an algorithm from there?

You'd get a lot further a lot faster by looking at the documentation for

Here's your starter for 10 ...

>>> def f(a, b, c=3):

.... pass
....
>>> inspect.getargspec(f)

(['a', 'b', 'c'], None, None, (3,))
>>>

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/

Dan Ellis
Guest
Posts: n/a

 10-17-2008
On Oct 17, 5:13*pm, Steve Holden <(E-Mail Removed)> wrote:

> You'd get a lot further a lot faster by looking at the documentation for

Yeah, I've looked at that already, but it only gives (in a nicer way)
the information I already have from the function object and its code
object.

Chris Rebert
Guest
Posts: n/a

 10-17-2008
On Fri, Oct 17, 2008 at 8:37 AM, Dan Ellis <(E-Mail Removed)> wrote:
> Given some function, f(a, b, c=3), what would be the best way to go
> about writing a function, g(f, *args, **kwargs), that would return a
> normalized tuple of arguments that f would receive when calling
> f(*args, **kwargs)? By normalized, I mean that the result would always
> be (a, b, c) regardless of how g was called, taking into account
> positional arguments, keyword arguments, and f's default arguments.
>
> g(f, 1, 2, 3) -> (1, 2, 3)
> g(f, 1, 2, c=3) -> (1, 2, 3)
> g(f, 1, c=3, b=2) -> (1, 2, 3)
> g(c=3, a=1, b=2) -> (1, 2, 3)
> g(1, 2) -> (1, 2, 3)
>
> All the required information is available between args, kwargs and f
> (the function object), but I don't know the exact algorithm. Has
> anyone already done this, or should I just dig around in the CPython
> source and extract an algorithm from there?
> --
> http://mail.python.org/mailman/listinfo/python-list
>

Why do you want/need this magical g() function considering that, as
you yourself point out, Python already performs this normalization for
you?

Cheers,
Chris
--
Follow the path of the Iguana...
http://rebertia.com

Dan Ellis
Guest
Posts: n/a

 10-17-2008
On Oct 17, 6:17*pm, "Chris Rebert" <(E-Mail Removed)> wrote:

> Why do you want/need this magical g() function considering that, as
> you yourself point out, Python already performs this normalization for
> you?

A caching idea I'm playing around with.

@cache
def some_query(arg1, arg2):
# Maybe do SQL query or something
return result

cache returns a function that does:
- Make a key from its arguments
- If key is in the cache:
- Return result from cache
- If it isn't:
- Call some_query with the same arguments
- Cache and return the result

Guest
Posts: n/a

 10-17-2008
On Oct 17, 12:37*pm, Dan Ellis <(E-Mail Removed)> wrote:
> On Oct 17, 6:17*pm, "Chris Rebert" <(E-Mail Removed)> wrote:
>
> > Why do you want/need this magical g() function considering that, as
> > you yourself point out, Python already performs this normalization for
> > you?

>
> A caching idea I'm playing around with.
>
> @cache
> def some_query(arg1, arg2):
> * * # Maybe do SQL query or something
> * * return result
>
> cache returns a function that does:
> * * - Make a key from its arguments
> * * - If key is in the cache:
> * * * * - Return result from cache
> * * - If it isn't:
> * * * * - Call some_query with the same arguments
> * * * * - Cache and return the result

George Sakkis has a recipe that might help.

http://code.activestate.com/recipes/551779/

It was discussed here:

Dan Ellis
Guest
Posts: n/a

 10-19-2008
On Oct 17, 7:16*pm, "Aaron \"Castironpi\" Brady"
<(E-Mail Removed)> wrote:

> George Sakkis has a recipe that might help.
>
> http://code.activestate.com/recipes/551779/

Looks like just the thing. Thanks!