Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

인자 변환기가 새 메모리를 생성하면 PyArg_ParseTuple은 까다로운 메모리 관리 문제에 부딪힙니다. 이러한 경우를 처리하기 위해 특수한 인자 타입을 제안합니다.

PEP 보류

이 PEP에서 다루는 개념에 대한 추가 탐구는, PEP의 목표를 추진하고 피드백을 수집하여 반영하는 데 관심이 있으면서 이를 효과적으로 수행할 충분한 시간이 있는 현재의 주도자가 없어 보류되었습니다.

이 PEP의 결론은 C API 인터페이스 코드의 일부 측면을 생성하기 위해 전처리 단계를 사용하자고 제안하는 PEP 426의 결론에 의해서도 영향을 받을 수 있습니다.

문제 설명

현재 인자 튜플은 함수 인자에 대한 참조를 유지하며, 이 인자들은 인자 튜플이 존재하는 동안, 즉 적어도 함수 호출이 실행되는 동안에는 살아 있음이 보장됩니다.

어떤 경우에는 인자를 파싱할 때 새 메모리를 할당하며, 이 메모리는 이후 호출자가 해제해야 합니다. 여기에는 두 가지 문제가 있습니다:

  1. 실패한 경우, 애플리케이션은 어떤 메모리를 해제해야 하는지 알 수 없습니다. 대부분의 호출자는 자신에게 그 메모리를 해제할 책임이 있다는 사실조차 알지 못합니다. 이에 대한 예로는 N 변환기(버그 #416288 [1])와 es# 변환기(버그 #501716 [2])가 있습니다.
  2. 인자 파싱이 성공한 경우에도, 호출자가 메모리 해제를 책임져야 한다는 것은 여전히 불편합니다. 어떤 경우에는 이것이 불필요하게 비효율적입니다. 예를 들어, es 변환기는 올바른 내용을 가진 문자열 객체가 이미 존재하는데도 변환 결과를 메모리에 복사합니다.

제안하는 해결책

‘인자 튜플’이라는 새로운 타입을 도입합니다. 이 타입은 튜플에서 파생되며, __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* 변환기는 폐지 예정입니다.

참고 문헌