PyArg_ParseTupleAndKeywords
Carl Banks
pavlovevidence at gmail.com
Fri Jan 22 21:08:26 EST 2010
On Jan 22, 3:23 pm, "Mr.M" <m... at unknown.nospam> wrote:
> Hi,
>
> i can't understand what i'm doing wrong. I have a c/api that implements
> a new class.
> In (initproc) function i have somethink like this:
>
> [code]
>
> (some declarations omitted here)
You probably shouldn't have, that could be where the error is.... I'd
include the whole function up to the call that raises the exception.
> static char* keywordlist[] = {"service",
> "event_type",
> "free_text",
> "group_uid",
> "remote_name",
> "remote_abook_uid",
> "start_time",
> "end_time",
> "storage_time",
> "flags",
> "bytes_sent",
> "bytes_received",
> NULL};
>
> if (!PyArg_ParseTupleAndKeywords(args, keywords, "|ssssssiiiiii",
> keywordlist,
> &service,
> &event_type,
> &free_text,
> &group_uid,
> &remote_name,
> &remote_abook_uid,
> &start_time,
> &end_time,
> &storage_time,
> &flags,
> &bytes_sent,
> &bytes_received)) return -1;
This should be return NULL in most cases, but not all (such as if it's
an object's tp_init--and it does look like that's the case here, so
probably not the issue).
> [/code]
>
> Ok, what i want is something like this:
>
> [code]
> import mymodule
> a = mymodule.myclass() # ok, this works
> a = mymodule.myclass(flags = 1) # bad, this won't work
> > TypeError: expected string or Unicode object, tuple found
> [/code]
Are you sure that PyArg_ParseTupleAndKeywords is what's raising the
error?
Are you subclassing this type in Python, and passing one of the string
parameters a tuple by mistake? For instance, did you do something
like this:
class myclass(_mycmodule._myctype):
def __init__(self,*args,**kwargs):
log_something_here()
super(myclass,self).__init__(args,**kwargs)
Note the missing * on args.
> I found that if i write this everything works fine:
>
> [code]
> import mymodule
> a = mymodule.myclass(service = "blabla", event_type = "event", free_text
> = "free", group_uid = "group", remote_name = "remote name",
> remote_abook_uid = "abook", start_time = 1, end_time = 61, storage_time
> = 61, flags = 2)
> [/code]
>
> in other words, the code only works if *EVERY* argument is specified in
> exactly the same position it appears in keyword-null-terminated array.
That it would have to be in a certain order is strange. Are you sure
it's just not merely that they all have to be present?
> Could you please help me?
Tricky, but I think it'd help if you provided more information. My
gut feeling is that there exception is being raised somewhere other
than you think it is (i.e., not by PyArg_ParseTuple), so I'd recommend
adding some debugging statements to track down the exact point wher
the error occurs.
Carl Banks
More information about the Python-list
mailing list