Протокол объектов¶Object Protocol
-
PyObject*
Py_NotImplemented¶ Синглтон
NotImplemented, используемый для указания, что операция не реализована для данной комбинации типов.
-
Py_RETURN_NOTIMPLEMENTED¶ Правильно обрабатывает возврат
Py_NotImplementedиз C-функции (то есть увеличивает счётчик ссылок NotImplemented и возвращает его).
-
int
PyObject_Print(PyObject *o, FILE *fp, int flags)¶ Выводит объект o в файл fp. В случае ошибки возвращает
-1. Аргумент flags используется для включения определённых параметров вывода. Единственный поддерживаемый в настоящее время параметр –Py_PRINT_RAW; если он указан, записываетсяstr()объекта вместоrepr().
-
int
PyObject_HasAttr(PyObject *o, PyObject *attr_name)¶ Возвращает
1, если o имеет атрибут attr_name, и0в противном случае. Это эквивалентно выражению Pythonhasattr(o, attr_name). Эта функция всегда завершается успешно.Обратите внимание, что исключения, возникающие при вызове методов
__getattr__()и__getattribute__(), подавляются. Для получения сообщений об ошибках используйте вместо этогоPyObject_GetAttr().
-
int
PyObject_HasAttrString(PyObject *o, const char *attr_name)¶ Возвращает
1, если o имеет атрибут attr_name, и0в противном случае. Это эквивалентно выражению Pythonhasattr(o, attr_name). Эта функция всегда завершается успешно.Обратите внимание, что исключения, возникающие при вызове методов
__getattr__()и__getattribute__()и при создании временного строкового объекта, подавляются. Для получения сообщений об ошибках используйте вместо этогоPyObject_GetAttrString().
-
PyObject*
PyObject_GetAttr(PyObject *o, PyObject *attr_name)¶ - Возвращаемое значение: новая ссылка.
Извлекает атрибут с именем attr_name из объекта o. Возвращает значение атрибута в случае успеха или
NULLв случае ошибки. Это эквивалентно выражению Pythono.attr_name.
-
PyObject*
PyObject_GetAttrString(PyObject *o, const char *attr_name)¶ - Возвращаемое значение: новая ссылка.
Извлекает атрибут с именем attr_name из объекта o. Возвращает значение атрибута в случае успеха или
NULLпри неудаче. Это эквивалент выражения Pythono.attr_name.
-
PyObject*
PyObject_GenericGetAttr(PyObject *o, PyObject *name)¶ - Возвращаемое значение: новая ссылка.
Обобщённая функция получения атрибута, предназначенная для размещения в слоте
tp_getattroобъекта типа. Она ищет дескриптор в словаре классов в MRO объекта, а также атрибут в__dict__объекта (если он есть). Как описано в Реализация дескрипторов, дескрипторы данных имеют приоритет над атрибутами экземпляра, а дескрипторы не данных – нет. В противном случае вызываетсяAttributeError.
-
int
PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)¶ Устанавливает значение атрибута с именем attr_name для объекта o равным значению v. В случае ошибки возбуждает исключение и возвращает
-1; при успехе возвращает0. Это эквивалент инструкции Pythono.attr_name = v.Если v равно
NULL, атрибут удаляется, однако эта возможность устарела в пользу использованияPyObject_DelAttr().
-
int
PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)¶ Устанавливает значение атрибута с именем attr_name для объекта o равным значению v. В случае ошибки возбуждает исключение и возвращает
-1; при успехе возвращает0. Это эквивалент инструкции Pythono.attr_name = v.Если v равно
NULL, атрибут удаляется, однако эта возможность устарела в пользу использованияPyObject_DelAttrString().
-
int
PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)¶ Универсальная функция установки и удаления атрибута, предназначенная для помещения в слот
tp_setattroобъекта типа. Она ищет дескриптор данных в словаре классов в MRO объекта, и если он найден, то приоритет имеет установка или удаление атрибута в словаре экземпляра. В противном случае атрибут устанавливается или удаляется в__dict__объекта (если он есть). При успехе возвращается0, иначе возбуждаетсяAttributeErrorи возвращается-1.
-
int
PyObject_DelAttr(PyObject *o, PyObject *attr_name)¶ Удаляет атрибут с именем attr_name у объекта o. При ошибке возвращает
-1. Это эквивалент инструкции Pythondel o.attr_name.
-
int
PyObject_DelAttrString(PyObject *o, const char *attr_name)¶ Удаляет атрибут с именем attr_name у объекта o. При ошибке возвращает
-1. Это эквивалент инструкции Pythondel o.attr_name.
-
PyObject*
PyObject_GenericGetDict(PyObject *o, void *context)¶ - Возвращаемое значение: новая ссылка.
Универсальная реализация геттера дескриптора
__dict__. При необходимости создаёт словарь.Новое в версии 3.3.
-
int
PyObject_GenericSetDict(PyObject *o, PyObject *value, void *context)¶ Универсальная реализация сеттера дескриптора
__dict__. Эта реализация не позволяет удалять словарь.Новое в версии 3.3.
-
PyObject*
PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)¶ - Возвращаемое значение: новая ссылка.
Сравнивает значения o1 и o2 с помощью операции, заданной opid, которая должна быть одной из
Py_LT,Py_LE,Py_EQ,Py_NE,Py_GTилиPy_GE, соответствующих<,<=,==,!=,>или>=соответственно. Это эквивалент выражения Pythono1 op o2, гдеop– оператор, соответствующий opid. При успехе возвращает результат сравнения, при ошибке –NULL.
-
int
PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)¶ Сравнивает значения o1 и o2 с помощью операции, заданной в opid, которая должна быть одной из
Py_LT,Py_LE,Py_EQ,Py_NE,Py_GTилиPy_GE, соответствующих<,<=,==,!=,>или>=соответственно. Возвращает-1в случае ошибки,0если результат ложный,1в противном случае. Это эквивалент выражения Pythono1 op o2, гдеop– оператор, соответствующий opid.
Примечание
Если o1 и o2 – один и тот же объект, PyObject_RichCompareBool() всегда будет возвращать 1 для Py_EQ и 0 для Py_NE.
-
PyObject*
PyObject_Repr(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Вычисляет строковое представление объекта o. Возвращает строковое представление в случае успеха и
NULLпри неудаче. Это эквивалент выражения Pythonrepr(o). Вызывается встроенной функциейrepr().Изменено в версии 3.4: Эта функция теперь включает отладочное утверждение, помогающее гарантировать, что она не игнорирует активное исключение без уведомления.
-
PyObject*
PyObject_ASCII(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Как и
PyObject_Repr(), вычисляет строковое представление объекта o, но экранирует не-ASCII символы в строке, возвращаемойPyObject_Repr(), с помощью управляющих последовательностей\x,\uили\U. Это создаёт строку, похожую на ту, что возвращаетсяPyObject_Repr()в Python 2. Вызывается встроенной функциейascii().
-
PyObject*
PyObject_Str(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Вычисляет строковое представление объекта o. Возвращает строковое представление в случае успеха и
NULLпри неудаче. Это эквивалент выражения Pythonstr(o). Вызывается встроенной функциейstr()и, следовательно, функциейprint().Изменено в версии 3.4: Эта функция теперь включает отладочное утверждение, помогающее гарантировать, что она не игнорирует активное исключение без уведомления.
-
PyObject*
PyObject_Bytes(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Вычисляет байтовое представление объекта o. При неудаче возвращается
NULL, а при успехе – объект bytes. Это эквивалентно выражению Pythonbytes(o), когда o не является целым числом. В отличие отbytes(o), возникает TypeError, когда o является целым числом вместо объекта bytes, инициализированного нулями.
-
int
PyObject_IsSubclass(PyObject *derived, PyObject *cls)¶ Возвращает
1, если класс derived идентичен классу cls или является его подклассом, иначе возвращает0. В случае ошибки возвращает-1.Если cls является кортежем, проверка будет выполняться для каждого элемента в cls. Результатом будет
1, если хотя бы одна из проверок вернёт1, иначе0.Если у cls есть метод
__subclasscheck__(), он будет вызван для определения статуса подкласса, как описано в PEP 3119. В противном случае derived является подклассом cls, если он является прямым или косвенным подклассом, т.е. содержится вcls.__mro__.Обычно в качестве классов рассматриваются только объекты классов, т.е. экземпляры
typeили производного класса. Однако объекты могут переопределить это, имея атрибут__bases__(который должен быть кортежем базовых классов).
-
int
PyObject_IsInstance(PyObject *inst, PyObject *cls)¶ Возвращает
1, если inst является экземпляром класса cls или подкласса cls, или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)¶ - Возвращаемое значение: новая ссылка.
Вызывает вызываемый объект Python callable с аргументами, заданными кортежем args, и именованными аргументами, заданными словарём kwargs.
args не должен быть
NULL, используйте пустой кортеж, если аргументы не требуются. Если именованные аргументы не нужны, kwargs может бытьNULL.Возвращает результат вызова в случае успеха или возбуждает исключение и возвращает
NULLв случае неудачи.Это эквивалент выражения Python:
callable(*args, **kwargs).
-
PyObject*
PyObject_CallObject(PyObject *callable, PyObject *args)¶ - Возвращаемое значение: новая ссылка.
Вызывает вызываемый объект Python callable с аргументами, заданными кортежем args. Если аргументы не нужны, args может быть
NULL.Возвращает результат вызова в случае успеха или возбуждает исключение и возвращает
NULLв случае неудачи.Это эквивалент выражения Python:
callable(*args).
-
PyObject*
PyObject_CallFunction(PyObject *callable, const char *format, ...)¶ - Возвращаемое значение: новая ссылка.
Вызывает вызываемый объект Python callable с переменным числом аргументов C. Аргументы C описываются строкой форматирования в стиле
Py_BuildValue(). Формат может бытьNULL, что означает отсутствие аргументов.Возвращает результат вызова в случае успеха или возбуждает исключение и возвращает
NULLв случае неудачи.Это эквивалент выражения Python:
callable(*args).Обратите внимание: если передаются только аргументы
PyObject *, тоPyObject_CallFunctionObjArgs()– более быстрая альтернатива.Изменено в версии 3.4: Тип format был изменён с
char *.
-
PyObject*
PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...)¶ - Возвращаемое значение: новая ссылка.
Вызывает метод name объекта obj с переменным числом аргументов C. Аргументы C описываются строкой форматирования
Py_BuildValue(), которая должна создавать кортеж.Формат может быть
NULL, что означает, что аргументы не предоставляются.Возвращает результат вызова в случае успеха, или возбуждает исключение и возвращает
NULLв случае неудачи.Это эквивалент выражения Python:
obj.name(arg1, arg2, ...).Обратите внимание: если передаются только аргументы
PyObject *, тоPyObject_CallMethodObjArgs()– более быстрая альтернатива.Изменено в версии 3.4: Типы name и format были изменены с
char *.
-
PyObject*
PyObject_CallFunctionObjArgs(PyObject *callable, ...)¶ - Возвращаемое значение: новая ссылка.
Вызывает вызываемый объект Python callable с переменным количеством аргументов
PyObject*. Аргументы передаются как переменное количество параметров, за которыми следуетNULL.Возвращает результат вызова в случае успеха, или возбуждает исключение и возвращает
NULLв случае неудачи.Это эквивалент выражения Python:
callable(arg1, arg2, ...).
-
PyObject*
PyObject_CallMethodObjArgs(PyObject *obj, PyObject *name, ...)¶ - Возвращаемое значение: новая ссылка.
Вызывает метод объекта Python obj, имя которого задаётся как объект строки Python в name. Он вызывается с переменным количеством аргументов
PyObject*. Аргументы передаются как переменное количество параметров, за которыми следуетNULL.Возвращает результат вызова в случае успеха, или возбуждает исключение и возвращает
NULLв случае неудачи.
-
PyObject*
_PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)¶ Вызывает вызываемый объект Python callable, используя
vectorcall, если это возможно.args – это C-массив с позиционными аргументами.
nargsf – это количество позиционных аргументов плюс опционально флаг
PY_VECTORCALL_ARGUMENTS_OFFSET(см. ниже). Чтобы получить фактическое количество аргументов, используйтеPyVectorcall_NARGS(nargsf).kwnames может быть либо
NULL(без именованных аргументов), либо кортежем имен ключевых слов. В последнем случае значения именованных аргументов хранятся в args после позиционных аргументов. Количество именованных аргументов не влияет на nargsf.kwnames должен содержать только объекты типа
str(не подкласса), и все ключи должны быть уникальными.Возвращает результат вызова в случае успеха, или возбуждает исключение и возвращает
NULLв случае неудачи.Для этого используется протокол vectorcall, если вызываемый объект его поддерживает; в противном случае аргументы преобразуются для использования
tp_call.Примечание
Эта функция является временной и ожидается, что она станет публичной в Python 3.9, с другим именем и, возможно, изменённой семантикой. Если вы используете эту функцию, планируйте обновление своего кода для Python 3.9.
Новое в версии 3.8.
-
PY_VECTORCALL_ARGUMENTS_OFFSET¶ Если установлен в аргументе vectorcall nargsf, вызываемому объекту разрешается временно изменять
args[-1]. Другими словами, args указывает на аргумент 1 (не 0) в выделенном векторе. Вызываемый объект должен восстановить значениеargs[-1]перед возвратом.Когда это можно сделать дёшево (без дополнительного выделения памяти), вызывающие стороны рекомендуется использовать
PY_VECTORCALL_ARGUMENTS_OFFSET. Это позволит таким вызываемым объектам, как связанные методы, выполнять свои последующие вызовы (которые включают предварительно добавленный аргумент self) дёшево.Новое в версии 3.8.
-
Py_ssize_t
PyVectorcall_NARGS(size_t nargsf)¶ Получив аргумент vectorcall nargsf, возвращает фактическое количество аргументов. В настоящее время эквивалентно
nargsf & ~PY_VECTORCALL_ARGUMENTS_OFFSET.Новое в версии 3.8.
-
PyObject*
_PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict)¶ То же, что и
_PyObject_Vectorcall(), за исключением того, что именованные аргументы передаются как словарь в kwdict. Это может бытьNULL, если нет именованных аргументов.Для вызываемых объектов, поддерживающих
vectorcall, аргументы внутренне преобразуются в соглашение vectorcall. Поэтому эта функция добавляет некоторые накладные расходы по сравнению с_PyObject_Vectorcall(). Её следует использовать только если вызывающая сторона уже имеет готовый к использованию словарь.Примечание
Эта функция является временной и ожидается, что она станет публичной в Python 3.9, с другим именем и, возможно, изменённой семантикой. Если вы используете эту функцию, планируйте обновление своего кода для Python 3.9.
Новое в версии 3.8.
-
Py_hash_t
PyObject_Hash(PyObject *o)¶ Вычисляет и возвращает хеш-значение объекта o. При неудаче возвращает
-1. Это эквивалент выражения Pythonhash(o).Изменено в версии 3.2: Тип возвращаемого значения теперь Py_hash_t. Это знаковое целое того же размера, что и Py_ssize_t.
-
Py_hash_t
PyObject_HashNotImplemented(PyObject *o)¶ Устанавливает
TypeError, указывающий, чтоtype(o)не хешируется, и возвращает-1. Эта функция получает особую обработку при сохранении в слотеtp_hash, позволяя типу явно указать интерпретатору, что он не хешируется.
-
int
PyObject_IsTrue(PyObject *o)¶ Возвращает
1, если объект o считается истинным, и0в противном случае. Эквивалентно выражению Pythonnot not o. При неудаче возвращает-1.
-
int
PyObject_Not(PyObject *o)¶ Возвращает
0, если объект o считается истинным, и1в противном случае. Эквивалентно выражению Pythonnot o. При неудаче возвращает-1.
-
PyObject*
PyObject_Type(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Когда o не равен
NULL, возвращает объект типа, соответствующий типу объекта o. В случае неудачи возбуждаетSystemErrorи возвращаетNULL. Это эквивалентно выражению Pythontype(o). Эта функция увеличивает счётчик ссылок возвращаемого значения. Нет реальной причины использовать эту функцию вместо обычного выраженияo->ob_type, которое возвращает указатель типаPyTypeObject*, за исключением случаев, когда требуется увеличенный счётчик ссылок.
-
int
PyObject_TypeCheck(PyObject *o, PyTypeObject *type)¶ Возвращает true, если объект o имеет тип type или является подтипом type. Оба параметра должны быть не-
NULL.
-
Py_ssize_t
PyObject_Size(PyObject *o)¶ -
Py_ssize_t
PyObject_Length(PyObject *o)¶ Возвращает длину объекта o. Если объект o предоставляет протоколы последовательности и отображения, возвращается длина последовательности. При ошибке возвращается
-1. Эквивалентно выражению Pythonlen(o).
-
Py_ssize_t
PyObject_LengthHint(PyObject *o, Py_ssize_t default)¶ Возвращает оценочную длину объекта o. Сначала пытается вернуть его фактическую длину, затем оценку с помощью
__length_hint__(), и в итоге возвращает значение по умолчанию. При ошибке возвращает-1. Эквивалентно выражению Pythonoperator.length_hint(o, default).Новое в версии 3.4.
-
PyObject*
PyObject_GetItem(PyObject *o, PyObject *key)¶ - Возвращаемое значение: новая ссылка.
Возвращает элемент o, соответствующий объекту key, или
NULLпри неудаче. Эквивалентно выражению Pythono[key].
-
int
PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)¶ Сопоставляет объекту key значение v. Возбуждает исключение и возвращает
-1при неудаче; возвращает0в случае успеха. Эквивалентно инструкции Pythono[key] = v. Эта функция не крадёт ссылку на v.
-
int
PyObject_DelItem(PyObject *o, PyObject *key)¶ Удаляет сопоставление для объекта key из объекта o. Возвращает
-1при неудаче. Эквивалентно инструкции Pythondel o[key].
-
PyObject*
PyObject_Dir(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Эквивалентно выражению Python
dir(o), возвращает (возможно пустой) список строк, подходящих для аргумента-объекта, илиNULL, если произошла ошибка. Если аргумент равенNULL, это похоже наdir()в Python, возвращает имена текущих локальных переменных; в этом случае, если нет активного фрейма выполнения, возвращаетсяNULL, ноPyErr_Occurred()вернёт false.