사실 당신은 단순히 PyObject_CallFunctionObjArgs
와 PyInt_Type
를 호출 할 수
pVal = PyObject_CallFunctionObjArgs((PyObject *)&PyInt_Type, pObj, NULL);
을 당신이이 NULL
에 대한 pVal
를 돌려 확인해야하지만. 당신은 "이것은 잘 동작한다"라고 말했지만, "a"
(파이썬 문자열은 C 숯!)과 같은 것을 pObj
과 같이 사용하면 어떨까요? 내 생각 엔 이건 PyObject_Print
에 전화하면 세그 폴트됩니다.
일반적으로 잘못 될 가능성이있는 경우 모든 반환 값을 확인해야합니다. 그렇지 않으면 예를 들어 NULL
을 다른 함수 (세그먼테이션 결함)에 전달하거나 예외가 설정되면 값을 리턴 할 때 (SystemError)와 같은 모든 종류의 문제가 발생할 수 있습니다. 또한 지점에 따라 참조 횟수가 다릅니다. 나중에이 코드를 처리 할 수도 있지만 일반적으로 두 번째 분기에서 참조 카운트를 증가시켜 나중에 if
을 추가 할 필요가 없습니다. 따라서 다음을 사용하여 제안 할 것입니다 :
if (PyString_Check(pObj)) {
/* Convert the string literal to an integer */
pVal = PyObject_CallFunctionObjArgs((PyObject *)&PyInt_Type, pObj, NULL);
if (pVal == NULL) {
return NULL;
}
printf(" From string: ");
PyObject_Print(pVal, stdout, Py_PRINT_RAW); # <-- can this fail?
printf("\n");
} else if (PyInt_Check(pObj)) {
pVal = pObj;
/* Increment the reference count so it has the same count as the pVal in the first branch. */
Py_INCREF(pVal);
} else {
PyErr_SetString(PyExc_TypeError, "list items must be integer string literals or integers");
return NULL;
}
또는 간단히 말해서 PyInt_Type
에 의존하여 올바르게 사용하십시오.
/* Convert pObj to an integer, this is equivalent to int(pObj) and works
for integers and strings alike, however other inputs will fail. */
pVal = PyObject_CallFunctionObjArgs((PyObject *)&PyInt_Type, pObj, NULL);
if (pVal == NULL) {
return NULL;
}
아 좋은 지적, 그러한 함수가 존재한다는 걸 잊었습니다. –
'PyObject_CallFunctionObjArgs' - 정말 멋진 이름입니다. 그래도 말이 되네. –
예, 기억하기 쉽습니다. D – MSeifert