def test_tp_call(self): module = self.import_extension('foo', [ ("tp_call", "METH_VARARGS", ''' PyTypeObject *type = (PyTypeObject *)PyTuple_GET_ITEM(args, 0); PyObject *obj = PyTuple_GET_ITEM(args, 1); PyObject *c_args = PyTuple_GET_ITEM(args, 2); if (!type->tp_call) { PyErr_SetNone(PyExc_ValueError); return NULL; } return type->tp_call(obj, c_args, NULL); ''' ) ]) class C: def __call__(self, *args): return args assert module.tp_call(type(C()), C(), ('x', 2)) == ('x', 2) class D(type): def __call__(self, *args): return "foo! %r" % (args,) typ1 = D('d', (), {}) #assert module.tp_call(D, typ1, ()) == "foo! ()" XXX not working so far assert isinstance(module.tp_call(type, typ1, ()), typ1)