http://mail.python.org/pipermail/python-dev/2009-June/090210.html およびhttp://dan.iel.fm/posts/python-c-extensions/を参照
ここに私の質問に関して検索した他の場所があります: http://article.gmane.org/gmane.comp.python.general/424736 http://joyrex.spc.uchicago.edu/bookshelves/python/cookbook/pythoncook- CHP-16-SECT-3.html http://docs.python.org/2/c-api/sequence.html#PySequence_Check 可変数の引数を持つ Python 拡張モジュール
私は Python/C API の経験がありません。
次のコードがあります。
sm_int_list = (1,20,3)
c_int_array = (ctypes.c_int * len(sm_int_list))(*sm_int_list)
sm_str_tuple = ('some','text', 'here')
C拡張側では、次のようなことをしました:
static PyObject* stuff_here(PyObject *self, PyObject *args)
{
char* input;
int *i1, *i2;
char *s1, *s2;
// args = (('some','text', 'here'), [1,20,3], ('some','text', 'here'), [1,20,3])
**PyArg_ParseTuple(args, "(s#:):#(i:)#(s#:):#(i:)#", &s1, &i1, &s2, &i2)**;
/*stuff*/
}
そのようなもの: stuff.here(('some','text', 'here'), [1,20,3], ('some','text', 'here'), [1,20,3] )
何らかの計算の後、args と同じ形式でデータを返します。PyArg_ParseTuple 式を知りたいのですが、解析する適切な方法ですか?
- 可変文字列の配列
- 整数の配列
更新 NEW
これは正しい方法ですか?:
static PyObject* stuff_here(PyObject *self, PyObject *args)
unsigned int tint[], cint[];
ttotal=0, ctotal=0;
char *tstr, *cstr;
int *t_counts, *c_counts;
Py_ssize_t size;
PyObject *t_str1, *t_int1, *c_str2, *c_int2; //the C var that takes in the py variable value
PyObject *tseq, cseq;
int t_seqlen=0, c_seqlen=0;
if (!PyArg_ParseTuple(args, "OOiOOi", &t_str1, &t_int1, &ttotal, &c_str2, &c_int2, &ctotal))
{
return NULL;
}
if (!PySequence_Check(tag_str1) && !PySequence_Check(cat_str2)) return NULL;
else:
{
//All things t
tseq = PySequence_Fast(t_str1, "iterable");
t_seqlen = PySequence_Fast_GET_SIZE(tseq);
t_counts = PySequence_Fast(t_int1);
//All things c
cseq = PySequence_Fast(c_str2);
c_seqlen = PySequence_Fast_GET_SIZE(cseq);
c_counts = PySequence_Fast(c_int2);
//Make c arrays of all things tag and cat
for (i=0; i<t_seqlen; i++)
{
tstr[i] = PySequence_Fast_GET_ITEM(tseq, i);
tcounts[i] = PySequence_Fast_GET_ITEM(t_counts, i);
}
for (i=0; i<c_seqlen; i++)
{
cstr[i] = PySequence_Fast_GET_ITEM(cseq, i);
ccounts[i] = PySequence_Fast_GET_ITEM(c_counts, i);
}
}
また
PyArg_ParseTuple(args, "(s:)(i:)(s:)(i:)", &s1, &i1, &s2, &i2)
そしてまた帰りながら、
Py_BuildValue("sisi", arr_str1,arr_int1,arr_str2,arr_int2)
??
実際、誰かがさまざまな PyArg_ParseTuple 関数を詳細に明確にすることができれば、非常に有益です。ドキュメントにあるように、Python C APIは、やるべきことに関するチュートリアルではありません。