2013-05-06 3 views
3

None 값을 포함하는 튜플을 C 확장자에서 파이썬으로 반환하는 적절한 방법은 무엇입니까? 나는 하나의 None 값이C API에서 None 값을 포함하는 튜플을 반환하는 방법은 무엇입니까?

result = Py_BuildValue(""); 

와 튜플이

result = Py_BuildValue("(ii)", 123, 456); 

같은 것을 사용하여 만들 수 있지만, 예를 들어 얻을이 결합 할 수있는 방법이 표시되지 않는 것을 사용하여 생성 될 수 있다는 사실을 알고 , 적절한 정수와 None 값을 포함하는 튜플.

답변

4

이 파이썬에서 오직 하나 None 개체가, 그리고 당신은 항상 Py_None으로 C에서 참조 할 수 있습니다.

코드 ...

result = Py_BuildValue(""); 

Py_INCREF(Py_None); 
result = Py_None; 

그냥 원하는 경우 ... 그냥 ... Py_None의 refcount가를 증가하고 같은 그래서, 그 포인터를 반환 None을 반환 한 다음 사용하십시오 ...

Py_INCREF(Py_None); 
return Py_None; 

... 또는 Python 2.4부터 동일한 기능을 수행 할 수 있습니다. Py_BuildValue() 당신을 위해 것을 수행 - 매크로와 NG ...

이 같은 튜플에 반환하는 경우
Py_RETURN_NONE; 

...

return Py_BuildValue("(O)", Py_None); 

은 ... refcount가를 증가 할 필요가 없습니다 .

그러나이 같은 튜플에 반환하는 경우 ...

PyObject* tuple = PyTuple_New(1); 
Py_INCREF(Py_None); 
PyTuple_SetItem(tuple, 0, Py_None); 
return tuple; 

... 다음 PyTuple_SetItem() 당신을 위해 그것을하지 않기 때문에, refcount가를 증가해야합니다.

+0

'Py_BuildValue ("(O)", Py_None)'을 사용할 때 명백한 참조 횟수가 필요합니까? 'O'에 대한 [Py_BuildValue()'] (http://docs.python.org/2/c-api/arg.html#Py_BuildValue) 문서는 다음과 같이 기술하고 있습니다 : * 파이썬 객체를 그대로 둡니다. 카운트, 1 씩 증가) * –

+0

@ReinierTorenbeek 죄송합니다. 나는 문서를 다시 검사하고 실수로 잘못된 부분을 읽고 대답을 업데이트 한 다음 오류를 깨닫고 대답을 되 돌렸다. – Aya

+0

@ReinierTorenbeek 답변을 다시 업데이트했습니다. FWIW는 형식 문자열을 구문 분석 할 필요가 없으므로 후자의 방식이 약간 빠릅니다. – Aya

3
result = Py_BuildValue("(isi)", 123, NULL, 456); 

참고 : http://docs.python.org/2/c-api/arg.html#Py_BuildValue

+2

... 또는 'Py_BuildValue ("(iOi)", 123, Py_None, 456)' – Aya

+0

감사합니다. 답을받지 못해 죄송합니다. 너무 빨리 행동했습니다. 나는 Aya의 대답을 받아 들였다. 'NULL' 문자열을 사용하는 것은 나에게 해킹처럼 느껴집니다. –

관련 문제