Normalizing arguments

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dan Ellis

    Normalizing arguments

    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

    #2
    Re: Normalizing arguments

    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
    the inspect module instead.

    Here's your starter for 10 ...
    >>def f(a, b, c=3):
    .... pass
    ....
    >>inspect.getar gspec(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/

    Comment

    • Dan Ellis

      #3
      Re: Normalizing arguments

      On Oct 17, 5:13 pm, Steve Holden <st...@holdenwe b.comwrote:
      You'd get a lot further a lot faster by looking at the documentation for
      the inspect module instead.
      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.

      Comment

      • Chris Rebert

        #4
        Re: Normalizing arguments

        On Fri, Oct 17, 2008 at 8:37 AM, Dan Ellis <dan@remember.t his.namewrote:
        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?
        --

        >
        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...

        Comment

        • Dan Ellis

          #5
          Re: Normalizing arguments

          On Oct 17, 6:17 pm, "Chris Rebert" <c...@rebertia. comwrote:
          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

          Comment

          • Aaron \Castironpi\ Brady

            #6
            Re: Normalizing arguments

            On Oct 17, 12:37 pm, Dan Ellis <d...@remember. this.namewrote:
            On Oct 17, 6:17 pm, "Chris Rebert" <c...@rebertia. comwrote:
            >
            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.



            It was discussed here:


            Comment

            • Dan Ellis

              #7
              Re: Normalizing arguments

              On Oct 17, 7:16 pm, "Aaron \"Castironpi \" Brady"
              <castiro...@gma il.comwrote:
              George Sakkis has a recipe that might help.
              >
              http://code.activestate.com/recipes/551779/
              Looks like just the thing. Thanks!

              Comment

              Working...