2012-12-30 2 views
0

libedit (약간 다른 API를 사용하여 readline 대신 BSD를 사용하는 대신)에 래퍼를 작성하려고하는데 C 함수에 명명 된 함수를 추가하는 방법이 있습니다. C에서 예를 들어 C 동적 콜백을 기대하는 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을 파이썬 메소드를 동적으로 바인딩 할 수있는 좋은 방법을 찾을 수 없습니다. 미리 만들어진 C 함수를 여러 개 만들어 파이썬 메소드에 개별적으로 래핑 할 수는 있지만 가능하면 C API를 에뮬레이션하는 것이 좋습니다.

EL_ADDFN을 호출하고 호출하는 파이썬 메소드를 판별하는 방법이 있습니까?

답변

0

사용해보기 : 하나의 단일 처리기 기능 (아래에서 설명 함). EL_ADDFN을 파이썬 함수에 대한 이름의 매핑을 기록하도록 랩핑하지만 항상 하나의 핸들러 함수를 사용합니다. EL_BIND를 랩핑하여 문자의 매핑을 함수 이름에 기록하도록합니다. 핸들러 함수는 이름 매핑에 문자의 ch 매개 변수를 조회 한 다음 이름을 함수 매핑으로 룩업 한 다음 함수를 호출해야합니다. (ADDFN가 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 래퍼는 웁니다 Hashtable이며, BIND 연산자는 chmap을 채 웁니다.

관련 문제