Python

코드 객체

코드 객체는 CPython 구현의 저수준 세부 사항입니다. 각 객체는 아직 함수에 묶여 있지 않은 실행 가능한 코드 덩어리를 나타냅니다.

type PyCodeObject

코드 객체를 설명하는 데 사용되는 객체의 C 구조체. 이 형의 필드는 언제든지 변경될 수 있습니다.

PyTypeObject PyCode_Type

이것은 파이썬 코드 객체를 나타내는 PyTypeObject의 인스턴스입니다.

int PyCode_Check(PyObject *co)

co코드 객체면 참을 반환합니다. 이 함수는 항상 성공합니다.

Py_ssize_t PyCode_GetNumFree(PyCodeObject *co)

코드 객체에 있는 자유 (클로저) 변수의 개수를 반환합니다.

int PyUnstable_Code_GetFirstFree(PyCodeObject *co)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

코드 객체에서 첫 번째 :term:`자유 (클로저) 변수 <closure variable>`의 위치를 반환합니다.

버전 3.13에서 변경: 불안정한 C API 의 일부로 PyCode_GetFirstFree 에서 이름이 변경되었습니다. 이전 이름은 사용 중단되었으나 시그니처가 다시 변경될 때까지는 계속 사용할 수 있습니다.

PyCodeObject *PyUnstable_Code_New(int argcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

새 코드 객체를 반환합니다. 프레임을 만들기 위해 더미 코드 객체가 필요하면, 대신 PyCode_NewEmpty()를 사용하십시오.

바이트코드 정의가 자주 바뀌기 때문에, PyUnstable_Code_New() 를 직접 호출하면 특정 파이썬 버전에 종속될 수 있습니다.

이 함수의 많은 인자들은 복잡한 방식으로 서로 의존하고 있으며, 이는 값이 미세하게 변경될 경우 실행 오류나 VM 충돌로 이어질 가능성이 높음을 의미합니다. 이 함수를 사용할 때는 각별히 주의하십시오.

버전 3.11에서 변경: qualnameexceptiontable 매개변수가 추가되었습니다.

버전 3.12에서 변경: 불안정한 C API 의 일환으로 PyCode_New 에서 이름이 변경되었습니다. 이전 이름은 더 이상 권장되지 않지만(deprecated), 시그니처가 다시 변경될 때까지는 계속 사용할 수 있습니다.

PyCodeObject *PyUnstable_Code_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, PyObject *qualname, int firstlineno, PyObject *linetable, PyObject *exceptiontable)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

PyUnstable_Code_New()와 비슷하지만, 위치 전용 인자를 위한 추가 “posonlyargcount”가 있습니다. PyUnstable_Code_New에 적용되는 것과 같은 주의 사항이 이 함수에도 적용됩니다.

Added in version 3.8: PyCode_NewWithPosOnlyArgs

버전 3.11에서 변경: qualnameexceptiontable 매개변수가 추가되었습니다.

버전 3.12에서 변경: PyUnstable_Code_NewWithPosOnlyArgs 로 이름이 변경되었습니다. 이전 이름은 더 이상 권장되지 않지만(deprecated), 시그니처가 다시 변경될 때까지는 계속 사용할 수 있습니다.

PyCodeObject *PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
반환값: 새 참조.

지정된 파일명, 함수명 및 첫 번째 줄 번호를 갖는 새 빈 코드 객체를 반환합니다. 결과 코드 객체를 실행하면 Exception을 발생시킵니다.

int PyCode_Addr2Line(PyCodeObject *co, int byte_offset)

byte_offset 이 발생하거나 그 이전에 위치하며 그 이후에 끝나는 명령의 줄 번호를 반환합니다. 프레임의 줄 번호만 필요한 경우에는 대신 PyFrame_GetLineNumber() 를 사용하십시오.

코드 객체의 줄 번호를 효율적으로 반복하려면 PEP 626에 기술된 API 를 사용하십시오.

int PyCode_Addr2Location(PyObject *co, int byte_offset, int *start_line, int *start_column, int *end_line, int *end_column)

전달된 int 포인터를 byte_offset 에 있는 명령의 소스 코드 줄 및 열 번호로 설정합니다. 특정 요소에 대한 정보를 사용할 수 없는 경우 해당 값을 0 으로 설정합니다.

함수가 성공하면 1 을, 그렇지 않으면 0을 반환합니다.

Added in version 3.11.

PyObject *PyCode_GetCode(PyCodeObject *co)

파이썬 코드 getattr(co, 'co_code') 와 동일합니다. 코드 객체의 바이트코드를 나타내는 PyBytesObject 에 대한 강한 참조를 반환합니다. 오류 발생 시 NULL 이 반환되고 예외가 발생합니다.

PyBytesObject 는 인터프리터에 의해 필요에 따라 생성될 수 있으며, 반드시 CPython에서 실제로 실행되는 바이트코드를 나타내는 것은 아닙니다. 이 함수의 주요 용도는 디버거 및 프로파일러입니다.

Added in version 3.11.

PyObject *PyCode_GetVarnames(PyCodeObject *co)

파이썬 코드 getattr(co, 'co_varnames') 와 동일합니다. 로컬 변수들의 이름을 포함하는 PyTupleObject 의 새 참조를 반환합니다. 오류 발생 시 NULL 이 반환되고 예외가 발생합니다.

Added in version 3.11.

PyObject *PyCode_GetCellvars(PyCodeObject *co)

파이썬 코드 getattr(co, 'co_cellvars') 와 동일합니다. 중첩된 함수에서 참조되는 로컬 변수들의 이름을 포함하는 PyTupleObject 의 새 참조를 반환합니다. 오류 발생 시 NULL 이 반환되고 예외가 발생합니다.

Added in version 3.11.

PyObject *PyCode_GetFreevars(PyCodeObject *co)

파이썬 코드 getattr(co, 'co_freevars') 와 동일합니다. 자유 변수(closure 변수) 의 이름을 포함하는 PyTupleObject 의 새 참조를 반환합니다. 오류 발생 시 NULL 이 반환되고 예외가 발생합니다.

Added in version 3.11.

int PyCode_AddWatcher(PyCode_WatchCallback callback)

현재 인터프리터에 대한 코드 객체 감시자로 callback 을 등록합니다. PyCode_ClearWatcher() 에 전달할 수 있는 ID를 반환합니다. 에러가 발생한 경우(예: 사용 가능한 감시자 ID가 더 이상 없는 경우) -1 을 반환하고 예외를 설정합니다.

Added in version 3.12.

int PyCode_ClearWatcher(int watcher_id)

현재 인터프리터에 대해 PyCode_AddWatcher() 에서 이전에 반환된 watcher_id 로 식별된 감시자를 지웁니다. 성공 시 0 을 반환하고, 에러 시(예: 주어진 watcher_id 가 등록된 적이 없는 경우) -1 을 반환하고 예외를 설정합니다.

Added in version 3.12.

type PyCodeEvent

가능한 코드 객체 감시 이벤트의 열거형: - PY_CODE_EVENT_CREATE - PY_CODE_EVENT_DESTROY

Added in version 3.12.

typedef int (*PyCode_WatchCallback)(PyCodeEvent event, PyCodeObject *co)

코드 객체 감시 콜백 함수의 유형.

eventPY_CODE_EVENT_CREATE 인 경우 콜백은 co 가 완전히 초기화된 후에 호출됩니다. 그렇지 않은 경우, 콜백은 co 가 파괴되기 전에 호출되므로 co 의 이전 상태를 검사할 수 있습니다.

eventPY_CODE_EVENT_DESTROY 인 경우, 콜백에서 파괴될 예정인 코드 객체에 대한 참조를 가져오면 해당 객체를 복구하고 현재 시점에서 해제되는 것을 방지합니다. 복구된 객체가 나중에 파괴될 때, 해당 시점에 활성화된 모든 감시 콜백이 다시 호출됩니다.

이 API를 사용하는 사용자는 내부 런타임 구현 세부 사항에 의존해서는 안 됩니다. 이러한 세부 사항에는 코드 객체의 생성 및 파괴의 정확한 순서와 타이밍이 포함될 수 있으나 이에 국한되지는 않습니다. 이러한 세부 사항의 변경이 감시자가 관찰할 수 있는 차이(콜백 호출 여부 등)를 발생시킬 수는 있지만, 실행되는 파이썬 코드의 의미론은 변경되지 않습니다.

콜백이 예외를 설정하는 경우 반드시 -1 을 반환해야 합니다. 이 예외는 PyErr_WriteUnraisable() 을 사용하여 발생할 수 없는 예외로 출력됩니다. 그렇지 않은 경우에는 0 을 반환해야 합니다.

콜백 진입 시 이미 설정된 대기 중인 예외가 있을 수 있습니다. 이 경우 콜백은 동일한 예외가 설정된 상태로 0 을 반환해야 합니다. 이는 콜백이 먼저 예외 상태를 저장하고 삭제한 후, 반환하기 전에 이를 복구하지 않는 한 예외를 설정할 수 있는 다른 API를 호출해서는 안 된다는 것을 의미합니다.

Added in version 3.12.

PyObject *PyCode_Optimize(PyObject *code, PyObject *consts, PyObject *names, PyObject *lnotab_obj)

아무 작업도 수행하지 않는 함수입니다.

Python 3.10 이전에는 이 함수가 코드 객체에 대한 기본적인 최적화를 수행했습니다.

버전 3.10에서 변경: 이제 이 함수는 아무 작업도 수행하지 않습니다.

코드 객체 플래그

코드 객체는 플래그의 비트 필드를 포함하며, 이는 파이썬 어트리뷰트인 co_flags (예를 들어 PyObject_GetAttrString() 사용)로 가져올 수 있으며, PyUnstable_Code_New() 및 유사한 함수의 flags 인자를 사용하여 설정할 수 있습니다.

이름이 CO_FUTURE_ 로 시작하는 플래그는 일반적으로 future 문 를 통해 선택할 수 있는 기능에 해당합니다. 이러한 플래그들은 PyCompilerFlags.cf_flags 에서 사용할 수 있습니다. 현재 Python 버전에서 많은 CO_FUTURE_ 플래그들이 필수적이며, 이를 설정해도 아무런 효과가 없다는 점에 유의하십시오.

다음과 같은 플래그를 사용할 수 있습니다. 각 플래그의 의미는 연결된 파이썬 대응 기능 문서를 참조하십시오.

플래그

의미

CO_OPTIMIZED

inspect.CO_OPTIMIZED

CO_NEWLOCALS

inspect.CO_NEWLOCALS

CO_VARARGS

inspect.CO_VARARGS

CO_VARKEYWORDS

inspect.CO_VARKEYWORDS

CO_NESTED

inspect.CO_NESTED

CO_GENERATOR

inspect.CO_GENERATOR

CO_COROUTINE

inspect.CO_COROUTINE

CO_ITERABLE_COROUTINE

inspect.CO_ITERABLE_COROUTINE

CO_ASYNC_GENERATOR

inspect.CO_ASYNC_GENERATOR

CO_HAS_DOCSTRING

inspect.CO_HAS_DOCSTRING

CO_METHOD

inspect.CO_METHOD

CO_FUTURE_DIVISION

효과 없음 (__future__.division)

CO_FUTURE_ABSOLUTE_IMPORT

효과 없음 (__future__.absolute_import)

CO_FUTURE_WITH_STATEMENT

효과 없음 (__future__.with_statement)

CO_FUTURE_PRINT_FUNCTION

효과 없음 (__future__.print_function)

CO_FUTURE_UNICODE_LITERALS

효과 없음 (__future__.unicode_literals)

CO_FUTURE_GENERATOR_STOP

효과 없음 (__future__.generator_stop)

CO_FUTURE_ANNOTATIONS

__future__.annotations

추가 정보

외부 저스트인타임(JIT) 컴파일러와 같은 프레임 평가에 대한 로우 레벨 확장을 지원하기 위해 코드 객체에 임의의 추가 데이터를 첨부할 수 있습니다.

이 함수들은 불안정한(unstable) C API 계층의 일부입니다. 이 기능은 CPython 구현 세부 사항이며, API가 사전 경고 없이 변경될 수 있습니다.

Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

코드 객체에 데이터를 추가하는 데 사용되는 새로운 불투명 인덱스 값을 반환합니다.

일반적으로 이 함수를 한 번(인터프리터당 하나) 호출하고, 그 결과를 PyCode_GetExtraPyCode_SetExtra 와 함께 사용하여 개별 코드 객체의 데이터를 조작합니다.

freeNULL 이 아닌 경우: 코드 객체가 해제될 때, 새 인덱스 아래에 저장된 비(non)-NULL 데이터에 대해 free 가 호출됩니다. PyObject 를 저장할 때는 Py_DecRef() 를 사용하십시오.

Added in version 3.6: _PyEval_RequestCodeExtraIndex

버전 3.12에서 변경: PyUnstable_Eval_RequestCodeExtraIndex 로 이름이 변경되었습니다. 이전의 비공개(private) 이름은 더 이상 권장되지 않지만(deprecated), API가 변경될 때까지는 사용할 수 있습니다.

int PyUnstable_Code_GetExtra(PyObject *code, Py_ssize_t index, void **extra)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

주어진 인덱스 아래에 저장된 추가 데이터를 extra 로 설정합니다. 성공 시 0을 반환합니다. 실패 시 예외를 설정하고 -1을 반환합니다.

인덱스 아래에 데이터가 설정되지 않은 경우, extraNULL 로 설정하고 예외를 설정하지 않고 0을 반환합니다.

Added in version 3.6: _PyCode_GetExtra

버전 3.12에서 변경: PyUnstable_Code_GetExtra 로 이름이 변경되었습니다. 이전의 비공개(private) 이름은 더 이상 권장되지 않지만(deprecated), API가 변경될 때까지는 사용할 수 있습니다.

int PyUnstable_Code_SetExtra(PyObject *code, Py_ssize_t index, void *extra)
이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.

주어진 인덱스 아래에 저장된 추가 데이터를 extra 로 설정합니다. 성공 시 0을 반환합니다. 실패 시 예시를 설정하고 -1을 반환합니다.

Added in version 3.6: _PyCode_SetExtra

버전 3.12에서 변경: PyUnstable_Code_SetExtra 로 이름이 변경되었습니다. 이전의 비공개(private) 이름은 더 이상 권장되지 않지만(deprecated), API가 변경될 때까지는 사용할 수 있습니다.

분실물 보관소