코드 객체¶
코드 객체는 CPython 구현의 저수준 세부 사항입니다. 각 객체는 아직 함수에 묶여 있지 않은 실행 가능한 코드 덩어리를 나타냅니다.
-
type PyCodeObject¶
코드 객체를 설명하는 데 사용되는 객체의 C 구조체. 이 형의 필드는 언제든지 변경될 수 있습니다.
-
PyTypeObject PyCode_Type¶
이것은 파이썬 코드 객체를 나타내는
PyTypeObject의 인스턴스입니다.
-
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에서 변경:
qualname및exceptiontable매개변수가 추가되었습니다.버전 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에서 변경:
qualname및exceptiontable매개변수가 추가되었습니다.버전 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_DESTROYAdded in version 3.12.
-
typedef int (*PyCode_WatchCallback)(PyCodeEvent event, PyCodeObject *co)¶
코드 객체 감시 콜백 함수의 유형.
event 이
PY_CODE_EVENT_CREATE인 경우 콜백은 co 가 완전히 초기화된 후에 호출됩니다. 그렇지 않은 경우, 콜백은 co 가 파괴되기 전에 호출되므로 co 의 이전 상태를 검사할 수 있습니다.event 이
PY_CODE_EVENT_DESTROY인 경우, 콜백에서 파괴될 예정인 코드 객체에 대한 참조를 가져오면 해당 객체를 복구하고 현재 시점에서 해제되는 것을 방지합니다. 복구된 객체가 나중에 파괴될 때, 해당 시점에 활성화된 모든 감시 콜백이 다시 호출됩니다.이 API를 사용하는 사용자는 내부 런타임 구현 세부 사항에 의존해서는 안 됩니다. 이러한 세부 사항에는 코드 객체의 생성 및 파괴의 정확한 순서와 타이밍이 포함될 수 있으나 이에 국한되지는 않습니다. 이러한 세부 사항의 변경이 감시자가 관찰할 수 있는 차이(콜백 호출 여부 등)를 발생시킬 수는 있지만, 실행되는 파이썬 코드의 의미론은 변경되지 않습니다.
콜백이 예외를 설정하는 경우 반드시
-1을 반환해야 합니다. 이 예외는PyErr_WriteUnraisable()을 사용하여 발생할 수 없는 예외로 출력됩니다. 그렇지 않은 경우에는0을 반환해야 합니다.콜백 진입 시 이미 설정된 대기 중인 예외가 있을 수 있습니다. 이 경우 콜백은 동일한 예외가 설정된 상태로
0을 반환해야 합니다. 이는 콜백이 먼저 예외 상태를 저장하고 삭제한 후, 반환하기 전에 이를 복구하지 않는 한 예외를 설정할 수 있는 다른 API를 호출해서는 안 된다는 것을 의미합니다.Added in version 3.12.
코드 객체 플래그¶
코드 객체는 플래그의 비트 필드를 포함하며, 이는 파이썬 어트리뷰트인 co_flags (예를 들어 PyObject_GetAttrString() 사용)로 가져올 수 있으며, PyUnstable_Code_New() 및 유사한 함수의 flags 인자를 사용하여 설정할 수 있습니다.
이름이 CO_FUTURE_ 로 시작하는 플래그는 일반적으로 future 문 를 통해 선택할 수 있는 기능에 해당합니다. 이러한 플래그들은 PyCompilerFlags.cf_flags 에서 사용할 수 있습니다. 현재 Python 버전에서 많은 CO_FUTURE_ 플래그들이 필수적이며, 이를 설정해도 아무런 효과가 없다는 점에 유의하십시오.
다음과 같은 플래그를 사용할 수 있습니다. 각 플래그의 의미는 연결된 파이썬 대응 기능 문서를 참조하십시오.
플래그 |
의미 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
추가 정보¶
외부 저스트인타임(JIT) 컴파일러와 같은 프레임 평가에 대한 로우 레벨 확장을 지원하기 위해 코드 객체에 임의의 추가 데이터를 첨부할 수 있습니다.
이 함수들은 불안정한(unstable) C API 계층의 일부입니다. 이 기능은 CPython 구현 세부 사항이며, API가 사전 경고 없이 변경될 수 있습니다.
-
Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free)¶
- 이것은 불안정 API. 마이너 릴리스에서 예고 없이 변경될 수 있습니다.
코드 객체에 데이터를 추가하는 데 사용되는 새로운 불투명 인덱스 값을 반환합니다.
일반적으로 이 함수를 한 번(인터프리터당 하나) 호출하고, 그 결과를
PyCode_GetExtra및PyCode_SetExtra와 함께 사용하여 개별 코드 객체의 데이터를 조작합니다.free 가
NULL이 아닌 경우: 코드 객체가 해제될 때, 새 인덱스 아래에 저장된 비(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을 반환합니다.
인덱스 아래에 데이터가 설정되지 않은 경우, extra 를
NULL로 설정하고 예외를 설정하지 않고 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가 변경될 때까지는 사용할 수 있습니다.