저는 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가 더 이상 사용되지 않았습니까? 그렇지 않다면 사용해야 할 때/사용해야 할 때가 있습니까?
그래서 METH_KEYWORDS 플래그는 Python 인터프리터의 C 루틴 중 하나가 PyCFunctionWithKeywords로 다시 캐스트하도록 알려줍니까? – user1245262
예, 정확히 같습니다 (http://svn.python.org/projects/python/branches/pep-0384/Objects/methodobject.c에서 PyCFunction_Call()을 참조하십시오). – yak
C 언어 자체는 void *로 캐스트 된 함수 포인터가 함수 포인터로 성공적으로 캐스트 될 수 있다고 약속하지 않습니다. –