Re: Implementing class methods in C

2005-08-19 Thread nmichaud

> If you implement _test in C, works none of the above.
> The only difference I can see is that:

> type(_test.func2)
> 
> is for Python implemented function and

> type(_test.func2)
> 
> for C implementation

> I would really like to know the answer too.
> How do you implement some methods in C without subclassing ?


But the strange thing is if I use new.instancemethod the c function
becomes bound (using my previous code for _test.c)

import _test

class Test:
def func1(self):
print "In class "+repr(self.__class__.__namd__)

import new
Test.func2 = new.instancemethod(_test.func2, None, Test)
del new

t = Test
type(_test.func2)   # returns 
type(T.func1)   # returns 
type(t.func1)   # returns >
type(T.func2)   # returns 
type(t.func2)   # returns >

So is seems like it is bound appropriately, but when called across the
C/Python api the first argument (self) of func2 is not separated
from the other arguments (and thus is not sent into the c
function as PyObject* self, but instead as part of PyObject* args)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Implementing class methods in C

2005-08-18 Thread nmichaud

Nope, it still doesn't work. Anyway, that's not exactly what i want, since
i want func2 to be accessible from all instances of Test()

Naveen

On Thu, 18 Aug 2005, Jeremy Moles wrote:

> I honestly don't know the answer to this and I am entirely guessing
> but--does it work without using the new module? That is:
>
> 
>
> import _test
>
> class Foo:
>   pass
>
> foo = Foo()
>
> foo.bar = _test.func2
>
> foo.bar()
>
> On Thu, 2005-08-18 at 12:09 -0400, [EMAIL PROTECTED] wrote:
> > I am having a problem implementing some methods of a python class in C.
> > The class is defined in python, but I would like to rewrite some methods
> > in c. Here is an example of what I want to do:
> >
> > file _test.c:
> >
> > #include 
> >
> > static PyObject *
> > func2(PyObject *self, PyObject *args)
> > {
> >   if (self == NULL) {
> > PyErr_SetString(PyExc_SystemError, "self is NULL");
> > return NULL;
> >   }
> >
> >   // Parse arguments
> >   if (!PyArg_ParseTuple(args, ""))
> >   {
> > return NULL;
> >   }
> >
> >   Py_INCREF(Py_None);
> >   return Py_None;
> > }
> >
> > static PyMethodDef TestMethods[] = {
> >   {"func2", func2, METH_VARARGS, "func2."},
> >   {NULL, NULL, 0, NULL} /* Sentinel */
> > };
> >
> > PyMODINIT_FUNC
> > init_test(void)
> > {
> >   (void) Py_InitModule("_test", TestMethods);
> > }
> >
> > 
> > test.py:
> >
> > class Test:
> >   def func1(self):
> > print "I am in func 1"
> >
> > import _test
> > import new
> > Test.func2 = new.instancemethod(_test.func2, None, Test)
> > del(new)
> >
> > t = Test()
> > t.func2()
> >
> >
> > When I run test.py, I get a SystemError exception (which is what I raise
> > if self is NULL). I think my confusion lies in the use of PyObject* self
> > in the function declaration. Shouldn't this be set to point to the
> > instance of class Test that I am calling it from? Am I misunderstanding
> > the purpose of PyObject* self? Thanks.
> >
> > Naveen
> >
> > -
> > Naveen Michaud-Agrawal
> > Program in Molecular Biophysics
> > Johns Hopkins University
> > (410) 614 4435
>
-- 
http://mail.python.org/mailman/listinfo/python-list


Implementing class methods in C

2005-08-18 Thread nmichaud

I am having a problem implementing some methods of a python class in C.
The class is defined in python, but I would like to rewrite some methods
in c. Here is an example of what I want to do:

file _test.c:

#include 

static PyObject *
func2(PyObject *self, PyObject *args)
{
  if (self == NULL) {
PyErr_SetString(PyExc_SystemError, "self is NULL");
return NULL;
  }

  // Parse arguments
  if (!PyArg_ParseTuple(args, ""))
  {
return NULL;
  }

  Py_INCREF(Py_None);
  return Py_None;
}

static PyMethodDef TestMethods[] = {
  {"func2", func2, METH_VARARGS, "func2."},
  {NULL, NULL, 0, NULL} /* Sentinel */
};

PyMODINIT_FUNC
init_test(void)
{
  (void) Py_InitModule("_test", TestMethods);
}


test.py:

class Test:
  def func1(self):
print "I am in func 1"

import _test
import new
Test.func2 = new.instancemethod(_test.func2, None, Test)
del(new)

t = Test()
t.func2()


When I run test.py, I get a SystemError exception (which is what I raise
if self is NULL). I think my confusion lies in the use of PyObject* self
in the function declaration. Shouldn't this be set to point to the
instance of class Test that I am calling it from? Am I misunderstanding
the purpose of PyObject* self? Thanks.

Naveen

-
Naveen Michaud-Agrawal
Program in Molecular Biophysics
Johns Hopkins University
(410) 614 4435
-- 
http://mail.python.org/mailman/listinfo/python-list


Implementing class methods in C

2005-08-15 Thread nmichaud

I am having a problem implementing some methods of a python class in C.
The class is defined in python, but I would like to rewrite some methods
in c. Here is an example of what I want to do:

file _test.c:

#include 

static PyObject *
func2(PyObject *self, PyObject *args)
{
  if (self == NULL) {
PyErr_SetString(PyExc_SystemError, "self is NULL");
return NULL;
  }

  // Parse arguments
  if (!PyArg_ParseTuple(args, ""))
  {
return NULL;
  }

  Py_INCREF(Py_None);
  return Py_None;
}

static PyMethodDef TestMethods[] = {
  {"func2", func2, METH_VARARGS, "func2."},
  {NULL, NULL, 0, NULL} /* Sentinel */
};

PyMODINIT_FUNC
init_test(void)
{
  (void) Py_InitModule("_test", TestMethods);
}


test.py:

class Test:
  def func1(self):
print "I am in func 1"

import _test
import new
Test.func2 = new.instancemethod(_test.func2, None, Test)
del(new)

t = Test()
t.func2()


When I run test.py, I get a SystemError exception (which is what I raise
if self is NULL). I think my confusion lies in the use of PyObject* self
in the function declaration. Shouldn't this be set to point to the
instance of class Test that I am calling it from? Am I misunderstanding
the purpose of PyObject* self? Thanks.

Naveen

-
Naveen Michaud-Agrawal
Program in Molecular Biophysics
Johns Hopkins University
(410) 614 4435
-- 
http://mail.python.org/mailman/listinfo/python-list