0

libedit (わずかに異なる API を持つ readline の BSD 代替) のラッパーを作成しようとしていますが、名前付き関数を C API に追加する方法があります。

たとえば、C では次のようになります。

static unsigned char show_help(EditLine *e, int ch) {
    printf("Help");
}

el = el_init(argv[0], stdin, stdout, stderr);
el_set(el, EL_ADDFN, "help",  "This is help", show_help);
el_set(el, EL_BIND, "\?", "help", NULL);

el_set を呼び出して関数を追加し、後でその関数をバインドします。

EL_ADDFN をラップして Python メソッドを動的にバインドできるようにする良い方法が見つかりません。名前の付いた一連の C 関数を作成し、それらをすべて個別に Python メソッドにラップすることもできますが、できるだけ C API をエミュレートしたいと考えています。

EL_ADDFN を呼び出して、呼び出している python メソッドを特定する方法はありますか?

4

1 に答える 1

0

これを試してください: 1 つのハンドラー関数 (以下で説明します)。EL_ADDFN をラップして、名前から Python 関数へのマッピングを記録しますが、常に 1 つのハンドラー関数を使用します。EL_BIND をラップして、文字から関数名へのマッピングを記録します。ハンドラー関数は、キャラクターから名前へのマッピングで ch パラメーターを検索し、名前から関数へのマッピングを検索して、関数を呼び出す必要があります。(ADDFN を BIND の前に呼び出す必要がある場合は、ch から関数へのマップを作成し、それを BIND ラッパーに直接入力することができます。)

疑似 C の場合:

const char *chmap[256];  // initialize to zero
struct hashtable *namemap;  // up to you to find a
                            // hashtable implementation that
                            // will take const char * and map to
                            // PyObject * (function object);

static unsigned char python_func(EditLine *e, int ch) {
    const char *name = chmap[ch];
    // check for errors
    PyObject *func = lookup(namemap, name);
    // check for errors

    PyObject *editline = convert(e); // or whatever you have
    PyObject *result = PyObject_CallFunctionObjArgs(func, NULL);
    // check result, convert to unsigned char, and return
}

したがって、ADDFN ラッパーはハッシュテーブルにデータを取り込み、BIND オペレーターは chmap にデータを取り込みます。

于 2013-01-10T01:40:58.727 に答える