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의 결론에 의해서도 영향을 받을 수 있습니다.
문제 설명
현재 인자 튜플은 함수 인자에 대한 참조를 유지하며, 이 인자들은 인자 튜플이 존재하는 동안, 즉 적어도 함수 호출이 실행되는 동안에는 살아 있음이 보장됩니다.
어떤 경우에는 인자를 파싱할 때 새 메모리를 할당하며, 이 메모리는 이후 호출자가 해제해야 합니다. 여기에는 두 가지 문제가 있습니다:
제안하는 해결책
‘인자 튜플’이라는 새로운 타입을 도입합니다. 이 타입은 튜플에서 파생되며, __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*);
인자 파싱이 실패하면 모든 실패 객체는 Py_DECREF를 통해 해제되고, 모든 실패 메모리는 PyMem_Free를 통해 해제됩니다. 파싱이 성공하면 실패 객체와 실패 메모리에 대한 참조는 아무것도 해제하지 않은 채 버려집니다.
인자 튜플이 해제될 때 모든 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.