Is it possible to determine what a function needs for parameters -

Chris Mellon arkanes at gmail.com
Wed May 2 12:52:23 EDT 2007


On 2 May 2007 09:41:56 -0700, rh0dium <steven.klass at gmail.com> wrote:
> On May 2, 8:25 am, Gary Herron <gher... at islandtraining.com> wrote:
> > rh0dium wrote:
> > >> This is far more work than you need. Push an (args, kwargs) tuple into
> > >> your arguments queue and call self.function(*args, **kwargs).
> >
> > > No see I tried that and that won't work.
> >
> > Won't work?  How does it fail?> I'm assuming what you are referring to is this (effectively)
> >
> > > Q.put(((),{a:"foo", b:"bar}))
> >
> > > input = Q.get()
> > > self.function( *input[0], **input[1])
> >
> > > This will obviously fail if several conditions aren't met - hence the
> > > kludge.  Am I missing something here?
> >
> > Obviously?  Conditions?  What conditions?
> >
> > We do things like this constantly, and in fact, it *does* work.
> >
> > Please tell us how it fails, or what is unsatisfactory about it.
> >
> > Gary Herron
>
> Good - It looks like I am the one who is clueless..
>
> If I do this:
>
> def funcA(input):
>    pass
>
> Then I run the code
> for x in range(lod):myQ.put(random.random())
> myQ.put(None)
> a=WorkerB(requestQ=myQ, function=funcA).start()
>
> This will fail because there isn't an input[1]
>


Thats because you put the wrong value into the arguments queue.
For this use case, we define the arguments queue as being a source of 2-tuples,
with an argument list and a kwargs dict. So you have to do:

for x in range(lod):
    myQ.put((random.random(), {}))

(don't be afraid of indentation and newlines - I started to modify
your source to provide a working example and got frustrated
reformatting it so I could read it)

Since you've now defined the external interface for your system (pass
it a queue of argument, kwargs tuples and a callable) it's the
responsibility of the caller to correctly satisfy that interface.



More information about the Python-list mailing list