# 객체 프로토콜 — Python 3.8.18 문서

# 객체 프로토콜

PyObject* `Py_NotImplemented`

  지정된 형 조합에 대해 연산이 구현되지 않았음을 알리는 데 사용되는 `NotImplemented` 싱글톤.

`Py_RETURN_NOTIMPLEMENTED`

  C 함수 내에서 `Py_NotImplemented` 반환을 올바르게 처리합니다 (즉, NotImplemented의 참조 횟수를 증가시키고 반환합니다).

int `PyObject_Print`( PyObject *o, FILE *fp, int flags)

  파일 fp에 객체 o를 인쇄합니다. 에러 시 `-1`을 반환합니다. flags 인자는 특정 인쇄 옵션을 활성화하는 데 사용됩니다. 현재 지원되는 유일한 옵션은 `Py_PRINT_RAW`입니다; 주어지면, `repr()` 대신 객체의 `str()`이 기록됩니다.

int `PyObject_HasAttr`( PyObject *o, PyObject *attr_name)

  o에 attr_name 어트리뷰트가 있으면 `1`을, 그렇지 않으면 `0`을 반환합니다. 이것은 파이썬 표현식 `hasattr(o, attr_name)`과 동등합니다. 이 함수는 항상 성공합니다.

  `__getattr__()`과 `__getattribute__()` 메서드를 호출하는 동안 발생하는 예외는 억제됨에 유의하십시오. 에러 보고를 얻으려면 대신 `PyObject_GetAttr()`을 사용하십시오.

int `PyObject_HasAttrString`( PyObject *o, const char *attr_name)

  o에 attr_name 어트리뷰트가 있으면 `1`을, 그렇지 않으면 `0`을 반환합니다. 이것은 파이썬 표현식 `hasattr(o, attr_name)`과 동등합니다. 이 함수는 항상 성공합니다.

  `__getattr__()`과 `__getattribute__()` 메서드를 호출하고 임시 문자열 객체를 만드는 중에 발생하는 예외는 억제됨에 유의하십시오. 에러 보고를 얻으려면 대신 `PyObject_GetAttrString()`을 사용하십시오.

PyObject* `PyObject_GetAttr`( PyObject *o, PyObject *attr_name)
  Return value: New reference.

  객체 o에서 attr_name이라는 이름의 어트리뷰트를 가져옵니다. 성공하면 어트리뷰트 값을, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o.attr_name`과 동등합니다.

PyObject* `PyObject_GetAttrString`( PyObject *o, const char *attr_name)
  Return value: New reference.

  객체 o에서 attr_name이라는 이름의 어트리뷰트를 가져옵니다. 성공하면 어트리뷰트 값을, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o.attr_name`과 동등합니다.

PyObject* `PyObject_GenericGetAttr`( PyObject *o, PyObject *name)
  Return value: New reference.

  형 객체의 `tp_getattro` 슬롯에 배치되는 일반 어트리뷰트 게터(getter) 함수. 객체의 (있다면) `__dict__`에 있는 어트리뷰트뿐만 아니라 객체의 MRO에 있는 클래스의 딕셔너리에 있는 디스크립터를 찾습니다. 디스크립터 구현하기에 요약된 것처럼, 데이터 디스크립터는 인스턴스 어트리뷰트보다 우선하지만, 비 데이터 디스크립터는 그렇지 않습니다. 그렇지 않으면, `AttributeError`가 발생합니다.

int `PyObject_SetAttr`( PyObject *o, PyObject *attr_name, PyObject *v)

  객체 o에 대해, attr_name이라는 이름의 어트리뷰트 값을 v 값으로 설정합니다. 실패 시 예외를 발생시키고 `-1`을 반환합니다. 성공하면 `0`을 반환합니다. 이것은 파이썬 문장 `o.attr_name = v`와 동등합니다.

  v가 `NULL`이면, 어트리뷰트가 삭제되지만, 이 기능은 폐지되었고 `PyObject_DelAttr()`로 대체되었습니다.

int `PyObject_SetAttrString`( PyObject *o, const char *attr_name, PyObject *v)

  객체 o에 대해, attr_name이라는 이름의 어트리뷰트 값을 v 값으로 설정합니다. 실패 시 예외를 발생시키고 `-1`을 반환합니다. 성공하면 `0`을 반환합니다. 이것은 파이썬 문장 `o.attr_name = v`와 동등합니다.

  v가 `NULL`이면, 어트리뷰트가 삭제되지만, 이 기능은 폐지되었고 `PyObject_DelAttrString()`으로 대체되었습니다.

int `PyObject_GenericSetAttr`( PyObject *o, PyObject *name, PyObject *value)

  형 객체의 `tp_setattro` 슬롯에 배치되는 일반 어트리뷰트 세터(setter)와 딜리터(deleter) 함수. 객체의 MRO에 있는 클래스의 딕셔너리에서 데이터 디스크립터를 찾고, 발견되면 인스턴스 딕셔너리에 있는 어트리뷰트를 설정하거나 삭제하는 것보다 우선합니다. 그렇지 않으면, 객체의 (있다면) `__dict__`에서 어트리뷰트가 설정되거나 삭제됩니다. 성공하면 `0`이 반환되고, 그렇지 않으면 `AttributeError`가 발생하고 `-1`이 반환됩니다.

int `PyObject_DelAttr`( PyObject *o, PyObject *attr_name)

  객체 o에 대해, attr_name이라는 이름의 어트리뷰트를 삭제합니다. 실패 시 `-1`을 반환합니다. 이것은 파이썬 문장 `del o.attr_name`과 동등합니다.

int `PyObject_DelAttrString`( PyObject *o, const char *attr_name)

  객체 o에 대해, attr_name이라는 이름의 어트리뷰트를 삭제합니다. 실패 시 `-1`을 반환합니다. 이것은 파이썬 문장 `del o.attr_name`과 동등합니다.

PyObject* `PyObject_GenericGetDict`( PyObject *o, void *context)
  Return value: New reference.

  `__dict__` 디스크립터의 게터(getter)를 위한 일반적인 구현. 필요하면 딕셔너리를 만듭니다.

  버전 3.3에 추가.

int `PyObject_GenericSetDict`( PyObject *o, PyObject *value, void *context)

  `__dict__` 디스크립터의 세터(setter)를 위한 일반적인 구현. 이 구현은 딕셔너리 삭제를 허락하지 않습니다.

  버전 3.3에 추가.

PyObject* `PyObject_RichCompare`( PyObject *o1, PyObject *o2, int opid)
  Return value: New reference.

  opid에 의해 지정된 연산을 사용하여 o1과 o2의 값을 비교합니다. opid는 `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT` 또는 `Py_GE` 중 하나여야 하고 각각 `<`, `<=`, `==`, `!=`, `>` 또는 `>=`에 해당합니다. 이는 파이썬 표현식 `o1 op o2`와 동등합니다. 여기서 `op`는 opid에 해당하는 연산자입니다. 성공 시 비교 값을, 실패 시 `NULL`을 반환합니다.

int `PyObject_RichCompareBool`( PyObject *o1, PyObject *o2, int opid)

  opid에 의해 지정된 연산을 사용하여 o1과 o2의 값을 비교합니다. opid는 `Py_LT`, `Py_LE`, `Py_EQ`, `Py_NE`, `Py_GT` 또는 `Py_GE` 중 하나여야 하고 각각 `<`, `<=`, `==`, `!=`, `>` 또는 `>=`에 해당합니다. 에러 시 `-1`을, 결과가 거짓이면 `0`을, 그렇지 않으면 `1`을 반환합니다. 이는 파이썬 표현식 `o1 op o2`와 동등합니다. 여기서 `op`는 opid에 해당하는 연산자입니다.

참고

o1과 o2가 같은 객체이면, `PyObject_RichCompareBool()` 은 항상 `Py_EQ`의 경우는 `1`을, `Py_NE`의 경우는 `0`을 반환합니다.

PyObject* `PyObject_Repr`( PyObject *o)
  Return value: New reference.

  객체 o의 문자열 표현을 계산합니다. 성공하면 문자열 표현을, 실패하면 `NULL`을 반환합니다. 이것은 파이썬 표현식 `repr(o)`와 동등합니다. `repr()` 내장 함수에 의해 호출됩니다.

  버전 3.4에서 변경: 이 함수에는 이제 디버그 어서션이 포함되어 있어 활성 예외를 조용히 버리지 않도록 합니다.

PyObject* `PyObject_ASCII`( PyObject *o)
  Return value: New reference.

  `PyObject_Repr()`처럼, 객체 o의 문자열 표현을 계산하지만, `\x`, `\u` 또는 `\U` 이스케이프를 사용하여 `PyObject_Repr()`이 반환한 문자열에서 비 ASCII 문자를 이스케이프 합니다. 이것은 파이썬 2에서 `PyObject_Repr()`에 의해 반환된 것과 유사한 문자열을 생성합니다. `ascii()` 내장 함수에 의해 호출됩니다.

PyObject* `PyObject_Str`( PyObject *o)
  Return value: New reference.

  객체 o의 문자열 표현을 계산합니다. 성공 시 문자열 표현을, 실패 시 `NULL`을 반환합니다. 이것은 파이썬 표현식 `str(o)`와 동등합니다. `str()` 내장 함수에 의해, 따라서 `print()` 함수에 의해서도 호출됩니다.

  버전 3.4에서 변경: 이 함수에는 이제 디버그 어서션이 포함되어 있어 활성 예외를 조용히 버리지 않도록 합니다.

PyObject* `PyObject_Bytes`( PyObject *o)
  Return value: New reference.

  객체 o의 바이트열 표현을 계산합니다. 실패하면 `NULL`을, 성공하면 바이트열 객체를 반환됩니다. 이는 o가 정수가 아닐 때 파이썬 표현식 `bytes(o)`와 동등합니다. `bytes(o)`와 달리, o가 정수이면 0으로 초기화된 바이트열 객체 대신 TypeError가 발생합니다.

int `PyObject_IsSubclass`( PyObject *derived, PyObject *cls)

  클래스 derived가 클래스 cls와 동일하거나 cls에서 파생되었으면 `1`을 반환하고, 그렇지 않으면 `0`을 반환합니다. 에러가 발생하면 `-1`을 반환합니다.

  cls가 튜플이면, cls의 모든 항목에 대해 검사가 수행됩니다. 적어도 하나의 검사에서 `1`을 반환하면 결과는 `1`이 되고, 그렇지 않으면 `0`이 됩니다.

  cls에 `__subclasscheck__()` 메서드가 있으면, PEP 3119에 설명된 대로 서브 클래스 상태를 판별하기 위해 호출됩니다. 그렇지 않으면, derived가 직접 또는 간접 서브 클래스일 때 cls의 서브 클래스입니다, 즉 `cls.__mro__`에 포함되어 있습니다.

  일반적으로 클래스 객체(즉 `type`이나 파생 클래스의 인스턴스)만 클래스로 간주합니다. 그러나, 객체는 `__bases__` 어트리뷰트(베이스 클래스의 튜플이어야 합니다)를 가짐으로써 이를 재정의할 수 있습니다.

int `PyObject_IsInstance`( PyObject *inst, PyObject *cls)

  inst가 cls 클래스나 cls의 서브 클래스의 인스턴스이면 `1`을 반환하고, 그렇지 않으면 `0`을 반환합니다. 에러가 발생하면 `-1`을 반환하고 예외를 설정합니다.

  cls가 튜플이면, cls의 모든 항목에 대해 검사가 수행됩니다. 적어도 하나의 검사에서 `1`을 반환하면 결과는 `1`이 되고, 그렇지 않으면 `0`이 됩니다.

  cls에 `__instancecheck__()` 메서드가 있으면, PEP 3119에 설명된 대로 서브 클래스 상태를 판별하기 위해 호출됩니다. 그렇지 않으면, inst는 해당 클래스가 cls의 서브 클래스일 때 cls의 인스턴스입니다.

  인스턴스 inst는 `__class__` 어트리뷰트를 가짐으로써 클래스로 간주하는 것을 재정의할 수 있습니다.

  객체 cls는 `__bases__` 어트리뷰트(베이스 클래스의 튜플이어야 합니다)를 가짐으로써, 클래스로 간주하는지와 베이스 클래스가 무엇인지를 재정의할 수 있습니다.

int `PyCallable_Check`( PyObject *o)

  객체 o가 콜러블인지 판별합니다. 객체가 콜러블이면 `1`을, 그렇지 않으면 `0`을 반환합니다. 이 함수는 항상 성공합니다.

PyObject* `PyObject_Call`( PyObject *callable, PyObject *args, PyObject *kwargs)
  Return value: New reference.

  튜플 args로 제공된 인자와 딕셔너리 kwargs로 제공된 이름있는 인자로 콜러블 파이썬 객체 callable을 호출합니다.

  args는 `NULL`이 아니어야 합니다, 인자가 필요하지 않으면 빈 튜플을 사용하십시오. 이름있는 인자가 필요하지 않으면, kwargs는 `NULL`일 수 있습니다.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  이것은 파이썬 표현식 `callable(*args, **kwargs)`와 동등합니다.

PyObject* `PyObject_CallObject`( PyObject *callable, PyObject *args)
  Return value: New reference.

  튜플 args로 제공된 인자로 콜러블 파이썬 객체 callable을 호출합니다. 인자가 필요하지 않으면, args는 `NULL`일 수 있습니다.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  이것은 파이썬 표현식 `callable(*args)`와 동등합니다.

PyObject* `PyObject_CallFunction`( PyObject *callable, const char *format, ...)
  Return value: New reference.

  가변 개수의 C 인자로 콜러블 파이썬 객체 callable을 호출합니다. C 인자는 `Py_BuildValue()` 스타일 포맷 문자열을 사용하여 기술됩니다. format은 `NULL`일 수 있으며, 인자가 제공되지 않았음을 나타냅니다.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  이것은 파이썬 표현식 `callable(*args)`와 동등합니다.

  Note that if you only pass `PyObject *` args, `PyObject_CallFunctionObjArgs()` is a faster alternative.

  버전 3.4에서 변경: format의 형이 `char *`에서 변경되었습니다.

PyObject* `PyObject_CallMethod`( PyObject *obj, const char *name, const char *format, ...)
  Return value: New reference.

  가변 개수의 C 인자로 객체 obj의 name이라는 메서드를 호출합니다. C 인자는 튜플을 생성해야 하는 `Py_BuildValue()` 포맷 문자열로 기술됩니다.

  format은 `NULL`일 수 있으며, 인자가 제공되지 않았음을 나타냅니다.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  이것은 파이썬 표현식 `obj.name(arg1, arg2, ...)`와 동등합니다.

  Note that if you only pass `PyObject *` args, `PyObject_CallMethodObjArgs()` is a faster alternative.

  버전 3.4에서 변경: name과 format의 형이 `char *`에서 변경되었습니다.

PyObject* `PyObject_CallFunctionObjArgs`( PyObject *callable, ...)
  Return value: New reference.

  Call a callable Python object callable, with a variable number of `PyObject*` arguments. The arguments are provided as a variable number of parameters followed by `NULL`.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  이것은 파이썬 표현식 `callable(arg1, arg2, ...)`와 동등합니다.

PyObject* `PyObject_CallMethodObjArgs`( PyObject *obj, PyObject *name, ...)
  Return value: New reference.

  Calls a method of the Python object obj, where the name of the method is given as a Python string object in name. It is called with a variable number of `PyObject*` arguments. The arguments are provided as a variable number of parameters followed by `NULL`.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

PyObject* `_PyObject_Vectorcall`( PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)

  가능하면 `벡터콜`을 사용하여, 콜러블 파이썬 객체 callable을 호출합니다.

  args는 위치 인자가 있는 C 배열입니다.

  nargsf는 위치 인자의 수와 선택적인 플래그 `PY_VECTORCALL_ARGUMENTS_OFFSET`입니다 (아래를 참조하십시오). 실제 인자의 개수를 얻으려면, `PyVectorcall_NARGS(nargsf)`를 사용하십시오.

  kwnames는 `NULL`(키워드 인자 없음)이나 키워드 이름의 튜플일 수 있습니다. 후자의 경우, 키워드 인자의 값은 위치 인자 다음에 args에 저장됩니다. 키워드 인자의 수는 nargsf에 영향을 미치지 않습니다.

  kwnames는 `str` 형(서브 클래스는 아닙니다)의 객체만 포함해야 하며, 모든 키는 고유해야 합니다.

  성공하면 호출 결과를 반환하고, 실패하면 예외를 발생시키고 `NULL`을 반환합니다.

  callable이 지원한다면 벡터콜 프로토콜을 사용합니다; 그렇지 않으면, 인자는 `tp_call`을 사용하도록 변환됩니다.

  참고

  이 함수는 잠정적이며 파이썬 3.9에서 다른 이름으로 변경되고 어쩌면 의미도 변경되어 공개될 예정입니다. 이 함수를 사용한다면, 파이썬 3.9를 위해 코드를 변경할 준비를 하십시오.

  버전 3.8에 추가.

`PY_VECTORCALL_ARGUMENTS_OFFSET`

  벡터콜 nargsf 인자에 설정되면, 피호출자는 일시적으로 `args[-1]`을 변경할 수 있습니다. 즉, args는 할당된 벡터에서 인자 1(0이 아닙니다)을 가리킵니다. 피호출자는 반환하기 전에 `args[-1]` 값을 복원해야 합니다.

  (추가 할당 없이) 저렴하게 할 수 있을 때마다, 호출자는 `PY_VECTORCALL_ARGUMENTS_OFFSET`을 사용하는 것이 좋습니다. 이렇게 하면 연결된 메서드와 같은 콜러블 항목이 선행 호출(self 인자를 앞에 붙이는 것을 포함합니다)을 저렴하게 만들 수 있습니다.

  버전 3.8에 추가.

Py_ssize_t `PyVectorcall_NARGS`(size_t nargsf)

  주어진 벡터콜 nargsf 인자에서 실제 인자 수를 반환합니다. 현재 `nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET`과 동등합니다.

  버전 3.8에 추가.

PyObject* `_PyObject_FastCallDict`( PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict)

  키워드 인자가 kwdict 딕셔너리로 전달된다는 점을 제외하고는 `_PyObject_Vectorcall()`과 같습니다. 키워드 인자가 없으면 kwdict는 `NULL`일 수 있습니다.

  `벡터콜`을 지원하는 콜러블의 경우, 인자는 내부적으로 벡터콜 규칙으로 변환됩니다. 따라서, 이 함수는 `_PyObject_Vectorcall()`에 비해 약간의 오버헤드를 추가합니다. 호출자에게 이미 사용할 준비가 된 딕셔너리가 있을 때만 사용해야 합니다.

  참고

  이 함수는 잠정적이며 파이썬 3.9에서 다른 이름으로 변경되고 어쩌면 의미도 변경되어 공개될 예정입니다. 이 함수를 사용한다면, 파이썬 3.9를 위해 코드를 변경할 준비를 하십시오.

  버전 3.8에 추가.

Py_hash_t `PyObject_Hash`( PyObject *o)

  객체 o의 해시값을 계산하고 반환합니다. 실패하면 `-1`을 반환합니다. 이것은 파이썬 표현식 `hash(o)`와 동등합니다.

  버전 3.2에서 변경: 반환형은 이제 Py_hash_t입니다. 이것은 Py_ssize_t와 같은 크기의 부호 있는 정수입니다.

Py_hash_t `PyObject_HashNotImplemented`( PyObject *o)

  `type(o)`가 해시 가능하지 않음을 나타내는 `TypeError`를 설정하고 `-1`을 반환합니다. 이 함수는 `tp_hash` 슬롯에 저장될 때 특수한 처방을 받아서, 인터프리터에 형이 해시 가능하지 않음을 명시적으로 알립니다.

int `PyObject_IsTrue`( PyObject *o)

  객체 o를 참으로 간주하면 `1`을, 그렇지 않으면 `0`을 반환합니다. 이것은 파이썬 표현식 `not not o`와 동등합니다. 실패하면 `-1`을 반환합니다.

int `PyObject_Not`( PyObject *o)

  객체 o를 참으로 간주하면 `0`을, 그렇지 않으면 `1`을 반환합니다. 이것은 파이썬 표현식 `not o`와 동등합니다. 실패하면 `-1`을 반환합니다.

PyObject* `PyObject_Type`( PyObject *o)
  Return value: New reference.

  o가 `NULL`이 아니면, 객체 o의 객체 형에 해당하는 형 객체를 반환합니다. 실패하면 `SystemError`를 발생시키고 `NULL`을 반환합니다. 이것은 파이썬 표현식 `type(o)`와 동등합니다. 이 함수는 반환 값의 참조 횟수를 증가시킵니다. 증가한 참조 횟수가 필요할 때를 제외하고, `PyTypeObject*` 형의 포인터를 반환하는 공통 표현식 `o->ob_type` 대신 이 함수를 사용할 이유가 없습니다.

int `PyObject_TypeCheck`( PyObject *o, PyTypeObject *type)

  객체 o가 type 형이거나 type의 서브 형이면 참을 반환합니다. 두 매개 변수 모두 `NULL`이 아니어야 합니다.

Py_ssize_t `PyObject_Size`( PyObject *o)
Py_ssize_t `PyObject_Length`( PyObject *o)

  객체 o의 길이를 반환합니다. 객체 o가 시퀀스와 매핑 프로토콜을 제공하면, 시퀀스 길이가 반환됩니다. 에러가 발생하면 `-1`이 반환됩니다. 이것은 파이썬 표현식 `len(o)`와 동등합니다.

Py_ssize_t `PyObject_LengthHint`( PyObject *o, Py_ssize_t default)

  o 객체의 추정된 길이를 반환합니다. 먼저 실제 길이를 반환하려고 시도한 다음, `__length_hint__()`를 사용하여 추정값을 반환하고, 마지막으로 기본값을 반환합니다. 에러 시 `-1`을 반환합니다. 이것은 파이썬 표현식 `operator.length_hint(o, default)`와 동등합니다.

  버전 3.4에 추가.

PyObject* `PyObject_GetItem`( PyObject *o, PyObject *key)
  Return value: New reference.

  객체 key에 해당하는 o의 요소를 반환하거나 실패 시 `NULL`을 반환합니다. 이것은 파이썬 표현식 `o[key]`와 동등합니다.

int `PyObject_SetItem`( PyObject *o, PyObject *key, PyObject *v)

  객체 key를 값 v에 매핑합니다. 실패 시 예외를 발생시키고 `-1`을 반환합니다; 성공하면 `0`을 반환합니다. 이것은 파이썬 문장 `o[key] = v`와 동등합니다. 이 함수는 v에 대한 참조를 훔치지 않습니다.

int `PyObject_DelItem`( PyObject *o, PyObject *key)

  객체 o에서 객체 key에 대한 매핑을 제거합니다. 실패하면 `-1`을 반환합니다. 이것은 파이썬 문장 `del o[key]`와 동등합니다.

PyObject* `PyObject_Dir`( PyObject *o)
  Return value: New reference.

  이것은 파이썬 표현식 `dir(o)`와 동등하며, 객체 인자에 적합한 문자열의 (비어있을 수 있는) 리스트를 반환하거나, 에러가 있으면 `NULL`을 반환합니다. 인자가 `NULL`이면, 파이썬 `dir()`과 비슷하며, 현재 지역(locals)의 이름들을 반환합니다; 이 경우, 실행 프레임이 활성화되어 있지 않으면 `NULL`이 반환되지만 `PyErr_Occurred()`는 거짓을 반환합니다.

PyObject* `PyObject_GetIter`( PyObject *o)
  Return value: New reference.

  이것은 파이썬 표현식 `iter(o)`와 동등합니다. 객체 인자에 대한 새로운 이터레이터를 반환하거나, 객체가 이미 이터레이터이면 객체 자체를 반환합니다. 객체를 이터레이트 할 수 없으면 `TypeError`를 발생시키고 `NULL`을 반환합니다.