2012-04-21 3 views
4

저는 Python-C 확장에 대해 배우고 있으며 키워드 인수를 사용하는 메서드가 PyCFunctions로 캐스팅되어야하는 이유에 대해 의아해했습니다.Python C Extension - 키워드 인수를 사용하는 메서드가 PyCFunction에 캐스트되는 이유는 무엇입니까?

PyCFunction에 대한 나의 이해는 PyObject에 대한 두 개의 포인터가 필요하며 PyObject에 대한 단일 포인터를 반환한다는 것입니다. 나는 키워드 인수를 사용하는 함수를 사용하는거야 경우

PyObject* myFunc(PyObject* self, PyObject* args) 

,이 함수는 PyObjects 세 포인터를 가지고와의 PyObject에 하나의 포인터를 반환합니다 - 예를 들어, 그러나

PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs) 

, I는 ('가산기'라는 함수) 모듈 기능 어레이를 만들 때

{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" } 

잘 작동한다. 나는 float를 int로 형 변환하고 float의 정수가 아닌 부분을 사용해야하는 것처럼 느낍니다. 이 작품을 보지 못했다면 효과가 없을 것이라고 생각했을 것입니다. 나는 여기서 무엇을 이해하지 못 하겠는가?

또한 필자는 PyCFunctionWithKeywords에 대한 참조를 보았습니다. PyCFunctionWithKeywords는 필자가 필요하다고 생각한 기능 서명이있는 것 같지만 컴파일러는 '호환되지 않는 포인터 유형'에 대해 경고를했습니다.

PyCFunctionWithKeywords가 더 이상 사용되지 않았습니까? 그렇지 않다면 사용해야 할 때/사용해야 할 때가 있습니까?

답변

4

함수가 키워드 인수를 처리하는 경우 함수는 PyCFunctionWithKeywords와 일치해야합니다. 그러나 C는 오버로딩을하지 않으며, PyMethodDef에 의해 구축 된 구조는 완전히 체크되지 않은 void *가 아닌 PyCFunction을 기대하도록 정의됩니다. 따라서 PyCFunctionWithKeywords를 PyCFunction으로 형 변환하여 불필요한 컴파일러를 중단해야합니다.

플래그에 METH_KEYWORDS를 전달하여 함수에 PyCFunction이 아닌 PyCFunctionWithKeywords의 서명이 있음을 Python에 알리십시오.

+0

그래서 METH_KEYWORDS 플래그는 Python 인터프리터의 C 루틴 중 하나가 PyCFunctionWithKeywords로 다시 캐스트하도록 알려줍니까? – user1245262

+0

예, 정확히 같습니다 (http://svn.python.org/projects/python/branches/pep-0384/Objects/methodobject.c에서 PyCFunction_Call()을 참조하십시오). – yak

+0

C 언어 자체는 void *로 캐스트 된 함수 포인터가 함수 포인터로 성공적으로 캐스트 될 수 있다고 약속하지 않습니다. –