코드 객체¶
코드 객체는 CPython 구현의 저수준 세부 사항입니다. 각 객체는 아직 함수에 묶여 있지 않은 실행 가능한 코드 덩어리를 나타냅니다.
-
type PyCodeObject¶
코드 객체를 설명하는 데 사용되는 객체의 C 구조체. 이 형의 필드는 언제든지 변경될 수 있습니다.
-
PyTypeObject PyCode_Type¶
이것은 파이썬 코드 객체를 나타내는
PyTypeObject의 인스턴스입니다.
-
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에서 변경:
qualname및exceptiontable매개 변수가 추가되었습니다.버전 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에서 변경:
qualname및exceptiontable매개 변수가 추가되었습니다.버전 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_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 사용자는 내부 런타임 구현 세부 사항에 의존해서는 안 됩니다. 이러한 세부 사항에는 코드 객체의 생성 및 파괴의 정확한 순서와 타이밍 등이 포함될 수 있습니다. 이러한 세부 사항의 변경은 감시자에게 관찰 가능한 차이를 초래할 수 있지만(콜백이 호출되는지 여부 포함), 실행 중인 Python 코드의 의미론을 변경하지는 않습니다.
콜백이 예외를 설정하는 경우, 반드시
-1을 반환해야 합니다. 이 예외는PyErr_WriteUnraisable()을 사용하여 발생할 수 없는 예외로 출력됩니다. 그렇지 않으면0을 반환해야 합니다.다른 메서드와 달리, 이 방법으로 추가된 콜백은 예외를 무시할 수 없습니다 (예외 세부 정보가 전달되지 않기 때문입니다).
Added in version 3.12.
코드 객체 플래그¶
코드 객체에는 플래그의 비트 필드가 포함되어 있으며, 이는 co_flags Python 속성으로 검색할 수 있고(예: PyObject_GetAttrString() 사용), PyUnstable_Code_New() 및 유사한 함수에 flags 인수를 사용하여 설정할 수 있습니다.
이름이 CO_FUTURE_``로 시작하는 플래그는 :ref:`future statements <future>`에 의해 일반적으로 선택 가능한 기능을 나타냅니다. 이 플래그들은 :c:member:`PyCompilerFlags.cf_flags`에서 사용할 수 있습니다. 많은 ``CO_FUTURE_ 플래그는 현재 버전의 Python에서 필수적이며, 설정해도 아무런 영향이 없습니다.
다음 플래그들이 사용 가능합니다. 각 플래그의 의미는 해당 Python 동등물의 링크된 문서를 참조하십시오.
플래그 |
의미 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
효과 없음 ( |
|
추가 정보¶
외부 Just-in-time 컴파일러와 같은 프레임 평가의 낮은 수준의 확장을 지원하기 위해, 코드 객체에 임의의 추가 데이터를 첨부하는 것이 가능합니다.
이 함수들은 불안정한 C API 계층의 일부입니다. 이 기능은 CPython 구현 세부 사항이며, API는 비사용 경고 없이 변경될 수 있습니다.
-
Py_ssize_t PyUnstable_Eval_RequestCodeExtraIndex(freefunc free)¶
- 이것은 불안정 API. 경고 없이 사소 버전에서 변경될 수 있습니다.
코드 객체에 데이터를 추가하는 데 사용되는 새로운 불투명 인덱스 값을 반환합니다.
이 함수는 일반적으로 한 번 (인터프리터당) 호출되며, 그 결과를 사용하여 개별 코드 객체의 데이터를 조작합니다.
free 가
NULL이 아닌 경우: 코드 객체가 해제될 때, 새로운 인덱스 아래에 저장된 비``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을 반환합니다.
인덱스에 데이터가 설정되지 않은 경우, extra 를
NULL로 설정하고 예외를 발생시키지 않은 채 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가 변경될 때까지는 사용할 수 있습니다.