On 13/06/2006 1:45 PM, Redefined Horizons wrote:
> I'm trying to understand the argument flags that are used in the
> method table of an extension module written in C.
> 
> First let me ask this question about the method table. Is it an C
> array named "PyMethodDef"?

Its *type* is PyMethodDef (there is a typedef for that in python.h). You 
can name it what you like, but in a module called "foo", calling this 
thing "foo_methods" might be a reasonable idea.

Please read section 1.4 of the Extending and Embedding Manual.

> 
> Now, onto my questions about the arguments:
> 
> [1] I see that even when the Python function we are supplying takes no
> arguments, (the argument flag is METH_NOARGS), that we still pass the
> C function a reference to "self". Is this "self" actually a pointer to
> the section of memory that represents the object in Python that is
> calling the method?

This is independent of whether it is NOARGS or VARARGS. Irrespective of 
whether the C function is intended to appear to the Python caller as a 
method of a type/class, or as module-level function, its first arg is 
self. In the latter case, it should be unused by the called function. If 
you were to print its contents (using the %p format in printf, if 
available), you would find that it is NULL.

Please read section 1.1 of the manual.

> 
> [2] What is the difference between "positional" arguments indicated by
> the METH_VARARGS argument flag, and "keyword" arguments that are
> indicated by the METH_KEYWORDS argument flag? Does one determine the
> identity of an argument based on the order or position in which the
> arguments are passed to the C function, while the other uses keys in a
> dictionary to identify the arguments?

The difference is the same as if the called function is a Python 
function. In one sense, there is no difference -- even if you declare 
keywords, a call can still use positional arguments. Note that 
METH_KEYWORDS is not a substitute for METH_VARARGS; it's an add-on -- or 
a bitwise-or-on :-)

def afunction(foo, bar, zot):
# positional args, caller's only option is afunction(42, 1, 666)
def bfunction(foo=0, bar="plugh", zot=None):
# keyword args, caller can do:
bfunction(zot=10**100) # using a keyword: args foo & bar get default values
bfunction(10, "xyzzy") # positional: foo = 10; bar = "xyzzy"; zot = 10**100

In a Python function, nothing extra needs to be done.
In a C-extension function, a char * [] is required to supply the names 
of the arguments. The default value caper is handled by the caller 
initialising the C variables that will receive the argument values.

Manual: please read section 1.4 and section 1.8.

> That should be the start of my customization questions... :]
> 
> If it is any consolation I hope to take what I learn and put together
> a tutorial on expanding Python for those that only have a little
> experience with C programming, like myself. I plan to explain
> everything like I was teaching a 6-year old. :]
> 
> I was just going to put this on a wiki, but is there a way to include
> with other Python documentation on an "official" site?

The manual is in fact written as a tutorial. You may prefer to propose 
changes to the manual, rather than to publish yet another document.

A good idea is to download the Python source and go looking in the 
Modules directory. If module foo is implemented in C, its source will be 
there as foomodule.c. For a simple module that provides only functions, 
look at e.g. binascii. For something that defines types, try datetime. 
They and others should provide you with good examples.

HTH,
John
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to