PEP 286 – 향상된 인자 튜플
- Author:
- Martin von Löwis <martin at v.loewis.de>
- Status:
- Deferred
- Type:
- Standards Track
- Created:
- 03-Mar-2002
- Python-Version:
- 2.3
- Post-History:
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
인자 변환기가 새 메모리를 생성하면 PyArg_ParseTuple은 어려운 메모리 관리 문제에 직면합니다. 이러한 경우를 처리하기 위해, 특수화된 인자 타입이 제안됩니다.
PEP 보류
이 PEP에서 다루는 개념에 대한 추가 탐구는, PEP의 목표를 추진하고 피드백을 수집하여 반영하는 데 관심이 있으면서 이를 효과적으로 수행할 충분한 시간이 있는 현재의 주도자가 없어 보류되었습니다.
이 PEP의 결론은 C API 인터페이스 코드의 일부 측면을 생성하기 위해 전처리 단계의 사용을 제안하는 PEP 426의 결론에도 영향을 받을 수 있습니다.
문제 설명
오늘날 인자 튜플은 함수 인자에 대한 참조를 유지하며, 이 참조는 인자 튜플이 존재하는 한, 즉 최소한 함수 호출이 실행되는 동안은 살아 있음이 보장됩니다.
어떤 경우에는 인자를 파싱하면 새 메모리가 할당되며, 이 메모리는 호출자가 해제해야 합니다. 여기에는 두 가지 문제가 있습니다:
제안된 해결책
‘인자 튜플’이라는 새로운 타입이 도입됩니다. 이 타입은 tuple에서 파생되며, __dict__ 멤버(tp_dictoffset -4 위치)를 추가합니다. 이 타입의 인스턴스는 다음 속성을 가질 수 있습니다:
- ‘failobjects’, 성공한 경우에 해제되어야 하는 객체들의 목록
- ‘okobjects’, 인자 튜플이 해제될 때 함께 해제될 객체들의 목록
이 타입을 관리하기 위해, 다음 함수들이 추가되어 ceval.c와 getargs.c에서 적절하게 사용됩니다:
PyArgTuple_New(int);PyArgTuple_AddFailObject(PyObject*, PyObject*);PyArgTuple_AddFailMemory(PyObject*, void*);PyArgTuple_AddOkObject(PyObject*, PyObject*);PyArgTuple_AddOkMemory(PyObject*, void*);PyArgTuple_ClearFailed(PyObject*);
인자 파싱이 실패하면, 모든 fail 객체는 Py_DECREF를 통해 해제되고, 모든 fail 메모리는 PyMem_Free를 통해 해제됩니다. 파싱이 성공하면, fail 객체와 fail 메모리에 대한 참조는 아무것도 해제하지 않고 버려집니다.
인자 튜플이 해제될 때, 모든 ok 객체와 메모리가 함께 해제됩니다.
해당 함수들이 다른 타입의 객체와 함께 호출되면 경고가 발생하고 더 이상의 조치는 취해지지 않습니다. 인자 튜플을 사용하지 않는 영향받는 변환기의 사용법은 폐지 예정입니다.
영향받는 변환기
다음 변환기는 실패 메모리와 실패 객체를 추가합니다: N, es, et, es#, et# (변환기에 메모리가 전달되지 않는 한)
새 변환기
유니코드 변환을 단순화하기 위해, e* 변환기는 E* 변환기(Es, Et, Es#, Et#)로 복제됩니다. E* 변환기의 사용법은 애플리케이션이 결과 메모리를 관리할 필요가 없다는 점을 제외하면 e* 변환기의 사용법과 동일합니다. 이는 인자 튜플과 함께 Ok 객체를 등록함으로써 구현될 예정입니다. e* 변환기는 폐지 예정입니다.
참고 자료
Copyright
This document has been placed in the public domain.