# 컨텍스트 변수 객체

Added in version 3.7.

버전 3.7.1에서 변경:

참고

파이썬 3.7.1에서 모든 컨텍스트 변수 C API의 서명이 `PyContext`, `PyContextVar` 및 `PyContextToken` 대신 `PyObject` 포인터를 사용하도록 변경되었습니다, 예를 들어:

    // in 3.7.0:
    PyContext *PyContext_New(void);

    // in 3.7.1+:
    PyObject *PyContext_New(void);

자세한 내용은 bpo-34762를 참조하십시오.

이 절에서는 `contextvars` 모듈을 위한 공용 C API에 대해 자세히 설명합니다.

type PyContext

  `contextvars.Context` 객체를 나타내는 데 사용되는 C 구조체.

type PyContextVar

  `contextvars.ContextVar` 객체를 나타내는 데 사용되는 C 구조체.

type PyContextToken

  `contextvars.Token` 객체를 나타내는 데 사용되는 C 구조체.

PyTypeObject PyContext_Type

  context 형을 나타내는 형 객체.

PyTypeObject PyContextVar_Type

  컨텍스트 변수 형을 나타내는 형 객체.

PyTypeObject PyContextToken_Type

  컨텍스트 변수 토큰 형을 나타내는 형 객체.

형 검사 매크로:

int PyContext_CheckExact(PyObject *o)

  o가 `PyContext_Type` 형이면 참을 돌려줍니다. o는 `NULL`이 아니어야 합니다. 이 함수는 항상 성공합니다.

int PyContextVar_CheckExact(PyObject *o)

  o가 `PyContextVar_Type` 형이면 참을 돌려줍니다. o는 `NULL`이 아니어야 합니다. 이 함수는 항상 성공합니다.

int PyContextToken_CheckExact(PyObject *o)

  o가 `PyContextToken_Type` 형이면 참을 돌려줍니다. o는 `NULL`이 아니어야 합니다. 이 함수는 항상 성공합니다.

컨텍스트 객체 관리 함수:

PyObject *PyContext_New(void)
  반환값: 새 참조.

  새로운 빈 컨텍스트 객체를 만듭니다. 에러가 발생하면 `NULL`를 반환합니다.

PyObject *PyContext_Copy(PyObject *ctx)
  반환값: 새 참조.

  전달된 ctx 컨텍스트 객체의 얕은 복사본을 만듭니다. 에러가 발생하면 `NULL`을 반환합니다.

PyObject *PyContext_CopyCurrent(void)
  반환값: 새 참조.

  현재 스레드 컨텍스트의 얕은 복사본을 만듭니다. 에러가 발생하면 `NULL`을 반환합니다.

int PyContext_Enter(PyObject *ctx)

  현재 스레드의 현재 컨텍스트로 ctx를 설정합니다. 성공 시 `0`을 반환하고, 에러 시 `-1`을 반환합니다.

int PyContext_Exit(PyObject *ctx)

  ctx 컨텍스트를 비활성화하고 이전 컨텍스트를 현재 스레드의 현재 컨텍스트로 복원합니다. 성공 시 `0`을 반환하고, 에러 시 `-1`을 반환합니다.

int PyContext_AddWatcher(PyContext_WatchCallback callback)

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

  Added in version 3.14.

int PyContext_ClearWatcher(int watcher_id)

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

  Added in version 3.14.

type PyContextEvent

  컨텍스트 객체 감시자 이벤트의 가능한 열거형:

  - `Py_CONTEXT_SWITCHED`: 현재 컨텍스트가 다른 컨텍스트로 전환되었습니다. 감시자 콜백에 전달된 객체는 이제 현재 `contextvars.Context` 객체이거나, 현재 컨텍스트가 없는 경우 None입니다.

  Added in version 3.14.

typedef int (*PyContext_WatchCallback)(PyContextEvent event, PyObject *obj)

  컨텍스트 객체 감시자 콜백 함수. 콜백에 전달된 객체는 이벤트마다 다릅니다. 자세한 내용은 `PyContextEvent`를 참조하십시오.

  콜백이 예외가 설정된 상태로 반환되면, 반드시 `-1`을 반환해야 합니다; 이 예외는 `PyErr_FormatUnraisable()`을 사용하여 발생할 수 없는 예외로 인쇄됩니다. 그렇지 않으면 `0`을 반환해야 합니다.

  콜백에 진입할 때 이미 예외가 설정되어 있을 수 있습니다. 이 경우, 콜백은 해당 예외를 그대로 유지한 채 `0`을 반환해야 합니다. 콜백에서 예외를 설정할 수 있는 다른 API를 호출하려면, 먼저 기존의 예외 상태를 저장하고 지운 후 반환 직전에 이를 다시 복원해야 합니다.

  Added in version 3.14.

컨텍스트 변수 함수:

PyObject *PyContextVar_New(const char *name, PyObject *def)
  반환값: 새 참조.

  새 `ContextVar` 객체를 만듭니다. name 매개 변수는 인트로스펙션과 디버그 목적으로 사용됩니다. def 매개 변수는 컨텍스트 변수의 기본값을 지정할 수 있습니다. `NULL`은 기본값 없음입니다. 에러가 발생하면, 이 함수는 `NULL`을 반환합니다.

int PyContextVar_Get(PyObject *var, PyObject *default_value, PyObject **value)

  컨텍스트 변수의 값을 가져옵니다. 조회하는 동안 에러가 발생하면 `-1`을 반환하고, 값이 있는지와 상관없이 에러가 발생하지 않으면 `0`을 반환합니다.

  컨텍스트 변수가 발견되면, value는 그것을 가리키는 포인터가 됩니다. 컨텍스트 변수가 발견되지 않으면, value는 다음을 가리 킵니다:

  - default_value, `NULL`이 아니면;

  - var의 기본값, `NULL`이 아니면;

  - `NULL`

  `NULL`일 때를 제외하고, 이 함수는 새 참조를 반환합니다.

PyObject *PyContextVar_Set(PyObject *var, PyObject *value)
  반환값: 새 참조.

  현재 컨텍스트에서 var의 값을 value로 설정합니다. 이 변경에 대한 새 토큰 객체를 반환하거나, 에러가 발생하면 `NULL`을 반환합니다.

int PyContextVar_Reset(PyObject *var, PyObject *token)

  var 컨텍스트 변수의 상태를 token을 반환한 `PyContextVar_Set()` 호출 전의 상태로 재설정합니다. 이 함수는 성공 시 `0`을 반환하고, 에러 시 `-1`을 반환합니다.