C言語でタプルを生成

C言語でタプルを生成してみました。以下はそのメモ
他言語でPythonの拡張を作るには、BoostライブラリやSwigを使う方法など、いくつかあります。
そのなかで、今回はC言語Pythonのタプルを生成します。


方針はタプルを生成するCコードを書き、setup.pyでビルド&インストールスクリプトを書いて実行した後、動作確認をします。

動作はn個のタプルを生成します。

ファイル名 tuple2.c

// tuple2.c
#include <Python.h>

PyObject*
tuple2_make(PyObject* self, PyObject* args)
{
  int len, i;
  PyTupleObject* ret_tuple;

  if (!PyArg_ParseTuple(args, "i", &len))
    {
      return NULL;
    }

  if(len == 1)
    {
      return Py_BuildValue("i", 0);
    }

  ret_tuple = PyTuple_New(len);
  for(i = 0; i < len; i++)
    {
      PyTuple_SetItem(ret_tuple, i, Py_BuildValue("i", 0));
    }
  return ret_tuple;
}

static PyMethodDef tuple2methods[] = {
  {"make", tuple2_make, METH_VARARGS,
"make tuple\n\
make(int) -> tuple"},
{NULL},
};

PyMODINIT_FUNC
inittuple2(void)
{
  Py_InitModule("tuple2", tuple2methods);
}

ビルドとインストールスクリプト
ファイル名 setup.py

from distutils.core import setup, Extension

setup(
    name = 'tuple2',
    ext_modules = [
        Extension('tuple2module', ['tuple2.c'],
                   library_dirs = [],
                   libraries = [],
                   extra_compile_args = [],
                   extra_link_args = [])
    ])

ビルドとインストール

$ python setup.py build
$ sudo python setup.py install

確認

$ python
>>> import tuple2
>>> tuple2.make(0)
()
>>> tuple2.make(1)
0
>>> tuple2.make(10)
(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

文字列生成やリスト生成に関しては公式ドキュメントを参照すれば簡単にできます。

参考サイト
http://python.matrix.jp/tips/cpp_extension.html
http://owa.as.wakwak.ne.jp/zope/docs/Python/BindingC/
http://www.python.jp/doc/release/api/tupleObjects.html