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. 경고 없이 사소 버전에서 변경될 수 있습니다.

코드 객체에서 첫 번째 자유 (클로저) 변수\의 위치를 반환합니다.

버전 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()를 사용하십시오.

바이트코드 정의가 자주 변경되므로, :c:func:`PyUnstable_Code_New`를 직접 호출하는 것은 특정 Python 버전에 묶일 수 있습니다.

이 함수의 많은 인자들은 복잡하게 상호 의존적이므로, 값의 미묘한 변화가 잘못된 실행이나 VM 충돌을 초래하기 쉽습니다. 이 함수는 극도의 주의가 필요할 때만 사용하십시오.

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

버전 3.12에서 변경: 불안정한 C API 의 일부로 PyCode_New 에서 이름이 변경되었습니다. 이전 이름은 더 이상 사용되지 않지만, 시그니처가 다시 변경될 때까지 사용 가능합니다.

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 로 이름이 변경되었습니다. 이전 이름은 더 이상 사용되지 않지만, 시그니처가 다시 변경될 때까지 사용 가능합니다.

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:`PEP 626 <0626#out-of-process-debuggers-and-profilers>`에 설명된 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)

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

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

Added in version 3.11.

PyObject *PyCode_GetVarnames(PyCodeObject *co)

Python 코드 getattr(co_, 'co_varnames') 와 동일합니다. 지역 변수의 이름을 포함하는 PyTupleObject 에 대한 새 참조를 반환합니다. 오류가 발생하면 NULL 이 반환되고 예외가 발생합니다.

Added in version 3.11.

PyObject *PyCode_GetCellvars(PyCodeObject *co)

Python 코드 getattr(co_, 'co_cellvars') 와 같습니다. 중첩 함수에 의해 참조되는 지역 변수 이름을 포함하는 PyTupleObject 에 대한 새 참조를 반환합니다. 오류가 발생하면 NULL 이 반환되고 예외가 발생합니다.

Added in version 3.11.

PyObject *PyCode_GetFreevars(PyCodeObject *co)

Python 코드 getattr(co_, 'co_freevars') 와 같습니다. free (closure) variables 이름을 포함하는 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 사용자는 내부 런타임 구현 세부 사항에 의존해서는 안 됩니다. 이러한 세부 사항에는 코드 객체의 생성 및 파괴의 정확한 순서와 타이밍 등이 포함될 수 있습니다. 이러한 세부 사항의 변경은 감시자에게 관찰 가능한 차이를 초래할 수 있지만(콜백이 호출되는지 여부 포함), 실행 중인 Python 코드의 의미론을 변경하지는 않습니다.

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

다른 메서드와 달리, 이 방법으로 추가된 콜백은 예외를 무시할 수 없습니다 (예외 세부 정보가 전달되지 않기 때문입니다).

Added in version 3.12.

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

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

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

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

코드 객체 플래그

코드 객체에는 플래그의 비트 필드가 포함되어 있으며, 이는 co_flags Python 속성으로 검색할 수 있고(예: PyObject_GetAttrString() 사용), PyUnstable_Code_New() 및 유사한 함수에 flags 인수를 사용하여 설정할 수 있습니다.

이름이 CO_FUTURE_``로 시작하는 플래그는 :ref:`future statements <future>`에 의해 일반적으로 선택 가능한 기능을 나타냅니다. 플래그들은 :c:member:`PyCompilerFlags.cf_flags`에서 사용할 있습니다. 많은 ``CO_FUTURE_ 플래그는 현재 버전의 Python에서 필수적이며, 설정해도 아무런 영향이 없습니다.

다음 플래그들이 사용 가능합니다. 각 플래그의 의미는 해당 Python 동등물의 링크된 문서를 참조하십시오.

플래그

의미

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

추가 정보

외부 Just-in-time 컴파일러와 같은 프레임 평가의 낮은 수준의 확장을 지원하기 위해, 코드 객체에 임의의 추가 데이터를 첨부하는 것이 가능합니다.

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

Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free)
이것은 불안정 API. 경고 없이 사소 버전에서 변경될 수 있습니다.

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

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

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

Added in version 3.6: _PyEval_RequestCodeExtraIndex

버전 3.12에서 변경: PyUnstable_Eval_RequestCodeExtraIndex 로 이름이 변경되었습니다. 이전 비공개 이름은 사용이 중단되었지만, 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 로 이름이 변경되었습니다. 이전 비공개 이름은 사용이 중단되었지만, 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 로 이름이 변경되었습니다. 이전 비공개 이름은 사용이 중단되었지만, API가 변경될 때까지는 사용할 수 있습니다.

분실물 보관소