2017-10-01 1 views
3

CPython 소스의 여러 C 유형은 __sizeof__ 메소드를 가지므로 sys.getsizeof 인 인스턴스의 대략 정확한 크기 (바이트)를 나타낼 수 있습니다.어떤 __sizeof__ 메쏘드가 CPython에 가지고있는 "void * <unused>"인수는 무엇입니까?

이러한 방법은 METH_NOARG 선언하지만, 몇 가지 예를 itertools.product.__sizeof__를 들어, void* whatever 인수를 수행 12 :

static PyObject * 
product_sizeof(productobject *lz, void *unused) 
{ 
    Py_ssize_t res; 

    res = _PyObject_SIZE(Py_TYPE(lz)); 
    res += PyTuple_GET_SIZE(lz->pools) * sizeof(Py_ssize_t); 
    return PyLong_FromSsize_t(res); 
} 

static PyMethodDef product_methods[] = { 
    /* ... */ 
    {"__sizeof__",  (PyCFunction)product_sizeof,  METH_NOARGS, sizeof_doc}, 
    {NULL,    NULL} /* sentinel */ 
}; 

다른 사람 (예를 들어하지 않는 반면 일부는 그것을 (예 : 1, 2)이). 인수없이 메소드를 선언 할 때 인수를 갖는 것은 이해가되지 않는 것처럼 보입니다.

"unused"라는 이름을 사용하면 아마도 한 번 의미가있는 것처럼 보이지만 나는 무엇을 알아 내지 못합니다. "git blame"을 사용하고 관련 문제를 읽으려고 시도했지만이 "unused"인수와 관련하여 아무 것도 찾을 수 없습니다. 나는 또한 sys.getsizeof에 대한 "기본"인수와 관련이있을 수 있다고 생각했지만 그 방법으로 전달되지 않았습니다 - 어떤 기본값이 주어 졌는지 알 수있는 방법의 요지는 무엇입니까?

관심이 있어요 그것 : 논쟁의 목적은 무엇 이었습니까? (그리고 그것이 쓸모 없게되었을 때 왜 제거되지 않았습니까?)

+1

아직 자세한 내용을 알지 못합니다. (당장은 시간이 없습니다.)'* unused'가없는 두 버전은 [Argument Clinic] (https://www.python.org/dev/)입니다. peps/pep-0436 /) 구현. 이것은 거의 확실하게 중요합니다. 생성 된 코드는 추가 인수를 무시합니다. –

+1

빙고 : https://github.com/python/cpython/blob/v3.6.2/Modules/clinic/_pickle.ch#L49-L63 –

답변

2

단일 매개 변수 만 사용하는 특정 유형의 기능은 없습니다. PyCFunction의 항상 문서 상태로 둘을 :이 유형의 C. 기능 대부분의 파이썬 callables을 구현하는 데 사용되는 기능의

유형이 개 PyObject* 매개 변수를 사용하고 하나 개의 값을 반환합니다.

METH_NOARGS 경우이 기능은 하나의 매개 변수가되는 것은 아닙니다가 아니라, 그것은 두 번째 매개 변수는 항상 NULL 수 있다는 것을 의미 :

첫 번째 매개 변수는 일반적으로 자기 이름

및 모듈 또는 객체 인스턴스에 대한 참조를 보유합니다. 모든 경우에 두 번째 매개 변수는 NULL입니다. 호출이 이루어지는 곳

당신은 또한 call.c:_PyMethodDef_RawFastCallKeywords에서 직접이를 볼 수 있습니다

이를 다루는 토론의 숫자가있다
case METH_NOARGS: 
    // After snipping checks away 
    result = (*meth) (self, NULL); 

는,이 중 일부에 대한 here, herehere를 참조하십시오.


Martijn이 지적한대로 단일 인수 만있는 버전의 경우 이러한 인수 클리닉을 사용하여 숨 깁니다.

+0

사실 'self'만 사용하는 일종의 메소드가 있습니다 : ['PyNoArgsFunction '] (https://github.com/python/cpython/blob/v3.6.2/Include/methodobject.h#L23). 하지만 그것은 남은 것 (https://bugs.python.org/issue18091) 인 것처럼 보입니다. CPython 소스에서는 사용되지 않고 문서화되지 않았습니다. – MSeifert

+0

@MSeifert 실제로 여기에있는 이유는 [here] (https://bugs.python.org/issue18091)를 참조하십시오. (우리의 대답이 그렇게 많이 어울리는 방식으로 이상하게 보입니다 :-) –

+1

"쓸모가 없습니다". 'METH_NOARG'는 매우 편리 할 것입니다. 그래, 거의 동시에 게시 :). – MSeifert

2

Martijn Pieters의 의견을 토대로이 방법에 두 번째 인수가있는 이유를 알 수있었습니다. 그것없이 나열된 것들은 의원 클리닉 파일 안에 래퍼 함수를 ​​가지고있다 (그래서 그것은 단지 "숨겨진"것이었다). __sizeof__과 관련이있을뿐만 아니라 모든 METH_NOARG 방법과 관련이 있습니다.

METH_NOARG documentation은 다음 매개 변수는 그들이 METH_NOARGS 플래그를 나열하는 경우 인수가 지정되어 있는지 확인할 필요가 없습니다

METH_NOARGS

방법없이. 유형은 PyCFunction이어야합니다. 첫 번째 매개 변수는 일반적으로 self라는 이름이며 모듈 또는 개체 인스턴스에 대한 참조를 보유합니다. 모든 경우에 두 번째 매개 변수는 NULL입니다.

그러나 PyCFunctions는 두 개의 인수가 : *이 유형의 기능은 두 가지의 PyObject을 C에서 가장 파이썬 callables을 구현하는 데 사용되는 기능의

PyCFunction

유형을 하나를 반환 매개 변수 그러한 가치. 반환 값이 NULL이면 예외가 설정됩니다. NULL이 아니면 반환 값은 파이썬에서 노출 된 함수의 반환 값으로 해석됩니다. 이 함수는 새로운 참조를 반환해야합니다.

typedef를 대응하는 methodobject에서 찾을 수 있습니다

(강조 광산) : 그들은 돈하더라도

typedef PyObject *(*PyCFunction)(PyObject *, PyObject *); 

는 그래서 PyMethodDef 내부에 선언 된 모든 메소드는, (적어도) 두 개의 인수가 필요합니다 ' 두 번째 것을 사용하십시오. 이것이 "사용되지 않는"이유이며, 메서드 자체에는 아무런 의미가 없습니다.

관련 문제