구현 세부 사항입니다. Python C API to retrieve arguments은 위치 인수와 키워드 인수를 구분합니다. 위치 적 주장은 내부적으로 이름조차 갖지 못한다. 당신이 볼 수 있듯이
PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)
, 그것은 어떤 인수 이름을 포함하지 않습니다
operator.add
기능 (및 sub
같은 유사한 것)의 인수를 검색하는 데 사용되는 코드는 다음입니다. operator.add
관련 전체 코드는 다음과 같습니다
#define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \
PyObject *a1, *a2; \
if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \
return AOP(a1,a2); }
spam2(op_add , PyNumber_Add)
#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \
{#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},
spam2(add,__add__, "add(a, b) -- Same as a + b.")
당신이 볼 수 있듯이, a
및 b
는 문서화 문자열에 사용되는 유일한 장소. 메서드 정의는 메서드가 키워드 인수를 받아들이는 데 필요한 METH_KEYWORDS
플래그도 사용하지 않습니다.
일반적으로 말해, 당신은 안전하게 인수 이름 항상 키워드 인수를 받아 들일 것입니다 알고있는 파이썬 기반의 기능은 (물론 사람이 *args
풀고 있지만 인수가 보이는 함수 문서를 만드는 더러운 물건을 할 수 있다고 가정 할 수있다 normal) C 함수는 키워드 인수를 허용하거나 허용하지 않을 수 있습니다. 몇 가지 인수 또는 선택적 인수 이상을 포함하는 함수가 이후/선택적 인수에 대한 키워드 인수를 허용 할 가능성이 있습니다. 하지만 당신은 꽤 많이 테스트해야합니다.
python-ideas mailinglist에서 키워드 인수 지원에 대한 토론을 찾을 수 있습니다.
흠 : 거기에 귀도 반 로섬 (Guido van Rossum)에서 문 (파이썬의 창조자 일명 Benevolent Dictator For Life)도 있습니다. 많은 (대부분?) 1-arg와 선택된 2-arg 함수 (그리고 거의 3 + -arg 함수)는 가독성을 떨어 뜨릴 것이라고 생각합니다. 예를 들어 ord (char = x)의 이 나타났습니다.
나는 실제로 인수 이이 (우리가 이미 그것이 키워드를해야한다는 것은 구문을 추가하는 것처럼) 키워드 인수로 제공 할 수없는 상태로 통 사적 기능을보고 싶습니다.
키워드를 추가 할 때 args가 잘못 입력 된 부분이 있습니다. 기본 제공 유형 또는 ABC가 있으며 재정의 할 수 있습니다. 예 : dict에 pop() 메소드를 고려하십시오.인수 이름이 현재 문서화되지 않았으므로 다른 사람이 dict을 하위 클래스로 지정하고이 메소드를 무시하면 이 무엇인지는 중요하지 않습니다. dict을 사용하여 dict을 에뮬레이션하려는 다른 변경 가능한 매핑 클래스를 만드는 경우 모든 호출자 (dict, dict 하위 클래스 또는 dict-like 오리를 예상 함)는 호출에서 위치 인수를 사용합니다. 그러나 우리가 인데 pop()에 대한 인수 이름을 문서화하고 사용자가 을 사용하기 시작하면 대부분의 dict 하위 클래스와 오리가 갑자기 깨져서 (운이 좋으면 같은 이름을 선택했습니다).
사람들이이 함수가 키워드 인수를 사용하지 않기로 선택한 이유에 대해 사람들이 대답 할 수 있다면 좋을 것입니다. D – jamylak