first commit

This commit is contained in:
Yura 2024-09-15 15:12:16 +03:00
commit 417e54da96
5696 changed files with 900003 additions and 0 deletions

View file

@ -0,0 +1,184 @@
#####################################################################
#
# These are the Cython pxd files for (most of) the Python/C API.
#
# REFERENCE COUNTING:
#
# JUST TO SCARE YOU:
# If you are going to use any of the Python/C API in your Cython
# program, you might be responsible for doing reference counting.
# Read http://docs.python.org/api/refcounts.html which is so
# important I've copied it below.
#
# For all the declaration below, whenever the Py_ function returns
# a *new reference* to a PyObject*, the return type is "object".
# When the function returns a borrowed reference, the return
# type is PyObject*. When Cython sees "object" as a return type
# it doesn't increment the reference count. When it sees PyObject*
# in order to use the result you must explicitly cast to <object>,
# and when you do that Cython increments the reference count whether
# you want it to or not, forcing you to an explicit DECREF (or leak memory).
# To avoid this we make the above convention. Note, you can
# always locally override this convention by putting something like
#
# cdef extern from "Python.h":
# PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)
#
# in your .pyx file or into a cimported .pxd file. You just have to
# use the one from the right (pxd-)namespace then.
#
# Cython automatically takes care of reference counting for anything
# of type object.
#
## More precisely, I think the correct convention for
## using the Python/C API from Cython is as follows.
##
## (1) Declare all input arguments as type "object". This way no explicit
## <PyObject*> casting is needed, and moreover Cython doesn't generate
## any funny reference counting.
## (2) Declare output as object if a new reference is returned.
## (3) Declare output as PyObject* if a borrowed reference is returned.
##
## This way when you call objects, no cast is needed, and if the api
## calls returns a new reference (which is about 95% of them), then
## you can just assign to a variable of type object. With borrowed
## references if you do an explicit typecast to <object>, Cython generates an
## INCREF and DECREF so you have to be careful. However, you got a
## borrowed reference in this case, so there's got to be another reference
## to your object, so you're OK, as long as you relealize this
## and use the result of an explicit cast to <object> as a borrowed
## reference (and you can call Py_INCREF if you want to turn it
## into another reference for some reason).
#
# "The reference count is important because today's computers have
# a finite (and often severely limited) memory size; it counts how
# many different places there are that have a reference to an
# object. Such a place could be another object, or a global (or
# static) C variable, or a local variable in some C function. When
# an object's reference count becomes zero, the object is
# deallocated. If it contains references to other objects, their
# reference count is decremented. Those other objects may be
# deallocated in turn, if this decrement makes their reference
# count become zero, and so on. (There's an obvious problem with
# objects that reference each other here; for now, the solution is
# ``don't do that.'')
#
# Reference counts are always manipulated explicitly. The normal
# way is to use the macro Py_INCREF() to increment an object's
# reference count by one, and Py_DECREF() to decrement it by
# one. The Py_DECREF() macro is considerably more complex than the
# incref one, since it must check whether the reference count
# becomes zero and then cause the object's deallocator to be
# called. The deallocator is a function pointer contained in the
# object's type structure. The type-specific deallocator takes
# care of decrementing the reference counts for other objects
# contained in the object if this is a compound object type, such
# as a list, as well as performing any additional finalization
# that's needed. There's no chance that the reference count can
# overflow; at least as many bits are used to hold the reference
# count as there are distinct memory locations in virtual memory
# (assuming sizeof(long) >= sizeof(char*)). Thus, the reference
# count increment is a simple operation.
#
# It is not necessary to increment an object's reference count for
# every local variable that contains a pointer to an object. In
# theory, the object's reference count goes up by one when the
# variable is made to point to it and it goes down by one when the
# variable goes out of scope. However, these two cancel each other
# out, so at the end the reference count hasn't changed. The only
# real reason to use the reference count is to prevent the object
# from being deallocated as long as our variable is pointing to
# it. If we know that there is at least one other reference to the
# object that lives at least as long as our variable, there is no
# need to increment the reference count temporarily. An important
# situation where this arises is in objects that are passed as
# arguments to C functions in an extension module that are called
# from Python; the call mechanism guarantees to hold a reference
# to every argument for the duration of the call.
#
# However, a common pitfall is to extract an object from a list
# and hold on to it for a while without incrementing its reference
# count. Some other operation might conceivably remove the object
# from the list, decrementing its reference count and possible
# deallocating it. The real danger is that innocent-looking
# operations may invoke arbitrary Python code which could do this;
# there is a code path which allows control to flow back to the
# user from a Py_DECREF(), so almost any operation is potentially
# dangerous.
#
# A safe approach is to always use the generic operations
# (functions whose name begins with "PyObject_", "PyNumber_",
# "PySequence_" or "PyMapping_"). These operations always
# increment the reference count of the object they return. This
# leaves the caller with the responsibility to call Py_DECREF()
# when they are done with the result; this soon becomes second
# nature.
#
# Now you should read http://docs.python.org/api/refcountDetails.html
# just to be sure you understand what is going on.
#
#################################################################
#################################################################
# BIG FAT DEPRECATION WARNING
#################################################################
# Do NOT cimport any names directly from the cpython package,
# despite of the star-imports below. They will be removed at
# some point.
# Instead, use the correct sub-module to draw your cimports from.
#
# A direct cimport from the package will make your code depend on
# all of the existing declarations. This may have side-effects
# and reduces the portability of your code.
#################################################################
# START OF DEPRECATED SECTION
#################################################################
from cpython.version cimport *
from cpython.ref cimport *
from cpython.exc cimport *
from cpython.module cimport *
from cpython.mem cimport *
from cpython.tuple cimport *
from cpython.list cimport *
from cpython.object cimport *
from cpython.sequence cimport *
from cpython.mapping cimport *
from cpython.iterator cimport *
from cpython.type cimport *
from cpython.number cimport *
from cpython.int cimport *
from cpython.bool cimport *
from cpython.long cimport *
from cpython.float cimport *
from cpython.complex cimport *
from cpython.string cimport *
from cpython.unicode cimport *
from cpython.dict cimport *
from cpython.instance cimport *
from cpython.function cimport *
from cpython.method cimport *
from cpython.weakref cimport *
from cpython.getargs cimport *
from cpython.pythread cimport *
from cpython.pystate cimport *
# Python <= 2.x
from cpython.cobject cimport *
from cpython.oldbuffer cimport *
# Python >= 2.4
from cpython.set cimport *
# Python >= 2.6
from cpython.buffer cimport *
from cpython.bytes cimport *
# Python >= 3.0
from cpython.pycapsule cimport *
#################################################################
# END OF DEPRECATED SECTION
#################################################################

View file

@ -0,0 +1,163 @@
"""
array.pxd
Cython interface to Python's array.array module.
* 1D contiguous data view
* tools for fast array creation, maximum C-speed and handiness
* suitable as allround light weight auto-array within Cython code too
Usage:
>>> cimport array
Usage through Cython buffer interface (Py2.3+):
>>> def f(arg1, unsigned i, double dx)
... array.array[double] a = arg1
... a[i] += dx
Fast C-level new_array(_zeros), resize_array, copy_array, Py_SIZE(obj),
zero_array
cdef array.array[double] k = array.copy(d)
cdef array.array[double] n = array.array(d, Py_SIZE(d) * 2 )
cdef array.array[double] m = array.zeros_like(FLOAT_TEMPLATE)
array.resize(f, 200000)
Zero overhead with naked data pointer views by union:
_f, _d, _i, _c, _u, ...
=> Original C array speed + Python dynamic memory management
cdef array.array a = inarray
if
a._d[2] += 0.66 # use as double array without extra casting
float *subview = vector._f + 10 # starting from 10th element
unsigned char *subview_buffer = vector._B + 4
Suitable as lightweight arrays intra Cython without speed penalty.
Replacement for C stack/malloc arrays; no trouble with refcounting,
mem.leaks; seamless Python compatibility, buffer() optional
last changes: 2009-05-15 rk
: 2009-12-06 bp
: 2012-05-02 andreasvc
: (see revision control)
"""
from libc.string cimport strcat, strncat, \
memset, memchr, memcmp, memcpy, memmove
from cpython.object cimport Py_SIZE
from cpython.ref cimport PyTypeObject, Py_TYPE
from cpython.exc cimport PyErr_BadArgument
from cpython.mem cimport PyObject_Malloc, PyObject_Free
cdef extern from *: # Hard-coded utility code hack.
ctypedef class array.array [object arrayobject]
ctypedef object GETF(array a, Py_ssize_t ix)
ctypedef object SETF(array a, Py_ssize_t ix, object o)
ctypedef struct arraydescr: # [object arraydescr]:
char typecode
int itemsize
GETF getitem # PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
SETF setitem # int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
ctypedef union __data_union:
# views of ob_item:
float* as_floats # direct float pointer access to buffer
double* as_doubles # double ...
int* as_ints
unsigned int *as_uints
unsigned char *as_uchars
signed char *as_schars
char *as_chars
unsigned long *as_ulongs
long *as_longs
unsigned long long *as_ulonglongs
long long *as_longlongs
short *as_shorts
unsigned short *as_ushorts
Py_UNICODE *as_pyunicodes
void *as_voidptr
ctypedef class array.array [object arrayobject]:
cdef __cythonbufferdefaults__ = {'ndim' : 1, 'mode':'c'}
cdef:
Py_ssize_t ob_size
arraydescr* ob_descr # struct arraydescr *ob_descr;
__data_union data
def __getbuffer__(self, Py_buffer* info, int flags):
# This implementation of getbuffer is geared towards Cython
# requirements, and does not yet fulfill the PEP.
# In particular strided access is always provided regardless
# of flags
item_count = Py_SIZE(self)
info.suboffsets = NULL
info.buf = self.data.as_chars
info.readonly = 0
info.ndim = 1
info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float)
info.len = info.itemsize * item_count
info.shape = <Py_ssize_t*> PyObject_Malloc(sizeof(Py_ssize_t) + 2)
if not info.shape:
raise MemoryError()
info.shape[0] = item_count # constant regardless of resizing
info.strides = &info.itemsize
info.format = <char*> (info.shape + 1)
info.format[0] = self.ob_descr.typecode
info.format[1] = 0
info.obj = self
def __releasebuffer__(self, Py_buffer* info):
PyObject_Free(info.shape)
array newarrayobject(PyTypeObject* type, Py_ssize_t size, arraydescr *descr)
# fast resize/realloc
# not suitable for small increments; reallocation 'to the point'
int resize(array self, Py_ssize_t n) except -1
# efficient for small increments (not in Py2.3-)
int resize_smart(array self, Py_ssize_t n) except -1
cdef inline array clone(array template, Py_ssize_t length, bint zero):
""" fast creation of a new array, given a template array.
type will be same as template.
if zero is true, new array will be initialized with zeroes."""
cdef array op = newarrayobject(Py_TYPE(template), length, template.ob_descr)
if zero and op is not None:
memset(op.data.as_chars, 0, length * op.ob_descr.itemsize)
return op
cdef inline array copy(array self):
""" make a copy of an array. """
cdef array op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr)
memcpy(op.data.as_chars, self.data.as_chars, Py_SIZE(op) * op.ob_descr.itemsize)
return op
cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1:
""" efficient appending of new stuff of same type
(e.g. of same array type)
n: number of elements (not number of bytes!) """
cdef Py_ssize_t itemsize = self.ob_descr.itemsize
cdef Py_ssize_t origsize = Py_SIZE(self)
resize_smart(self, origsize + n)
memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize)
return 0
cdef inline int extend(array self, array other) except -1:
""" extend array with data from another array; types must match. """
if self.ob_descr.typecode != other.ob_descr.typecode:
PyErr_BadArgument()
return extend_buffer(self, other.data.as_chars, Py_SIZE(other))
cdef inline void zero(array self):
""" set all elements of array to zero. """
memset(self.data.as_chars, 0, Py_SIZE(self) * self.ob_descr.itemsize)

View file

@ -0,0 +1,38 @@
cdef extern from "Python.h":
############################################################################
# 7.2.2 Boolean Objects
############################################################################
ctypedef class __builtin__.bool [object PyBoolObject]:
pass
# Booleans in Python are implemented as a subclass of
# integers. There are only two booleans, Py_False and Py_True. As
# such, the normal creation and deletion functions don't apply to
# booleans. The following macros are available, however.
bint PyBool_Check(object o)
# Return true if o is of type PyBool_Type.
#PyObject* Py_False
# The Python False object. This object has no methods. It needs to
# be treated just like any other object with respect to reference
# counts.
#PyObject* Py_True
# The Python True object. This object has no methods. It needs to
# be treated just like any other object with respect to reference
# counts.
# Py_RETURN_FALSE
# Return Py_False from a function, properly incrementing its reference count.
# Py_RETURN_TRUE
# Return Py_True from a function, properly incrementing its reference count.
object PyBool_FromLong(long v)
# Return value: New reference.
# Return a new reference to Py_True or Py_False depending on the truth value of v.

View file

@ -0,0 +1,112 @@
# Please see the Python header files (object.h/abstract.h) for docs
cdef extern from "Python.h":
cdef enum:
PyBUF_MAX_NDIM
cdef enum:
PyBUF_SIMPLE,
PyBUF_WRITABLE,
PyBUF_WRITEABLE, # backwards compatibility
PyBUF_FORMAT,
PyBUF_ND,
PyBUF_STRIDES,
PyBUF_C_CONTIGUOUS,
PyBUF_F_CONTIGUOUS,
PyBUF_ANY_CONTIGUOUS,
PyBUF_INDIRECT,
PyBUF_CONTIG,
PyBUF_CONTIG_RO,
PyBUF_STRIDED,
PyBUF_STRIDED_RO,
PyBUF_RECORDS,
PyBUF_RECORDS_RO,
PyBUF_FULL,
PyBUF_FULL_RO,
PyBUF_READ,
PyBUF_WRITE,
PyBUF_SHADOW
bint PyObject_CheckBuffer(object obj)
# Return 1 if obj supports the buffer interface otherwise 0.
int PyObject_GetBuffer(object obj, Py_buffer *view, int flags) except -1
# Export obj into a Py_buffer, view. These arguments must never be
# NULL. The flags argument is a bit field indicating what kind of
# buffer the caller is prepared to deal with and therefore what
# kind of buffer the exporter is allowed to return. The buffer
# interface allows for complicated memory sharing possibilities,
# but some caller may not be able to handle all the complexity but
# may want to see if the exporter will let them take a simpler
# view to its memory.
# Some exporters may not be able to share memory in every possible
# way and may need to raise errors to signal to some consumers
# that something is just not possible. These errors should be a
# BufferError unless there is another error that is actually
# causing the problem. The exporter can use flags information to
# simplify how much of the Py_buffer structure is filled in with
# non-default values and/or raise an error if the object cant
# support a simpler view of its memory.
# 0 is returned on success and -1 on error.
void PyBuffer_Release(Py_buffer *view)
# Release the buffer view. This should be called when the buffer
# is no longer being used as it may free memory from it.
void* PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
# ??
Py_ssize_t PyBuffer_SizeFromFormat(char *) # actually const char
# Return the implied ~Py_buffer.itemsize from the struct-stype
# ~Py_buffer.format
int PyBuffer_ToContiguous(void *buf, Py_buffer *view, Py_ssize_t len, char fort)
# ??
int PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
# ??
int PyObject_CopyToObject(object obj, void *buf, Py_ssize_t len, char fortran) except -1
# Copy len bytes of data pointed to by the contiguous chunk of
# memory pointed to by buf into the buffer exported by obj. The
# buffer must of course be writable. Return 0 on success and
# return -1 and raise an error on failure. If the object does not
# have a writable buffer, then an error is raised. If fortran is
# 'F', then if the object is multi-dimensional, then the data will
# be copied into the array in Fortran-style (first dimension
# varies the fastest). If fortran is 'C', then the data will be
# copied into the array in C-style (last dimension varies the
# fastest). If fortran is 'A', then it does not matter and the
# copy will be made in whatever way is more efficient.
int PyObject_CopyData(object dest, object src) except -1
# Copy the data from the src buffer to the buffer of destination
bint PyBuffer_IsContiguous(Py_buffer *view, char fort)
# Return 1 if the memory defined by the view is C-style (fortran
# is 'C') or Fortran-style (fortran is 'F') contiguous or either
# one (fortran is 'A'). Return 0 otherwise.
void PyBuffer_FillContiguousStrides(int ndims,
Py_ssize_t *shape,
Py_ssize_t *strides,
Py_ssize_t itemsize,
char fort)
# Fill the strides array with byte-strides of a contiguous
# (Fortran-style if fort is 'F' or C-style otherwise) array of the
# given shape with the given number of bytes per element.
int PyBuffer_FillInfo(Py_buffer *view, object exporter, void *buf,
Py_ssize_t len, int readonly, int flags) except -1
# Fill in a buffer-info structure, view, correctly for an exporter
# that can only share a contiguous chunk of memory of “unsigned
# bytes” of the given length. Return 0 on success and -1 (with
# raising an error) on error.
# DEPRECATED HERE: do not cimport from here, cimport from cpython.object instead
object PyObject_Format(object obj, object format_spec)
# Takes an arbitrary object and returns the result of calling
# obj.__format__(format_spec).

View file

@ -0,0 +1,33 @@
from .object cimport PyObject
cdef extern from "Python.h":
bint PyByteArray_Check(object o)
# Return true if the object o is a bytearray object or an instance of a subtype of the bytearray type.
bint PyByteArray_CheckExact(object o)
# Return true if the object o is a bytearray object, but not an instance of a subtype of the bytearray type.
bytearray PyByteArray_FromObject(object o)
# Return a new bytearray object from any object, o, that implements the buffer protocol.
bytearray PyByteArray_FromStringAndSize(char *string, Py_ssize_t len)
# Create a new bytearray object from string and its length, len. On failure, NULL is returned.
bytearray PyByteArray_Concat(object a, object b)
# Concat bytearrays a and b and return a new bytearray with the result.
Py_ssize_t PyByteArray_Size(object bytearray)
# Return the size of bytearray after checking for a NULL pointer.
char* PyByteArray_AsString(object bytearray)
# Return the contents of bytearray as a char array after checking for a NULL pointer.
# The returned array always has an extra null byte appended.
int PyByteArray_Resize(object bytearray, Py_ssize_t len)
# Resize the internal buffer of bytearray to len.
char* PyByteArray_AS_STRING(object bytearray)
# Macro version of PyByteArray_AsString().
Py_ssize_t PyByteArray_GET_SIZE(object bytearray)
# Macro version of PyByteArray_Size().

View file

@ -0,0 +1,198 @@
from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct va_list
############################################################################
# 7.3.1 String Objects
############################################################################
# These functions raise TypeError when expecting a string
# parameter and are called with a non-string parameter.
# PyStringObject
# This subtype of PyObject represents a Python bytes object.
# PyTypeObject PyBytes_Type
# This instance of PyTypeObject represents the Python bytes type;
# it is the same object as bytes and types.BytesType in the Python
# layer.
bint PyBytes_Check(object o)
# Return true if the object o is a string object or an instance of
# a subtype of the string type.
bint PyBytes_CheckExact(object o)
# Return true if the object o is a string object, but not an instance of a subtype of the string type.
bytes PyBytes_FromString(char *v)
# Return value: New reference.
# Return a new string object with the value v on success, and NULL
# on failure. The parameter v must not be NULL; it will not be
# checked.
bytes PyBytes_FromStringAndSize(char *v, Py_ssize_t len)
# Return value: New reference.
# Return a new string object with the value v and length len on
# success, and NULL on failure. If v is NULL, the contents of the
# string are uninitialized.
bytes PyBytes_FromFormat(char *format, ...)
# Return value: New reference.
# Take a C printf()-style format string and a variable number of
# arguments, calculate the size of the resulting Python string and
# return a string with the values formatted into it. The variable
# arguments must be C types and must correspond exactly to the
# format characters in the format string. The following format
# characters are allowed:
# Format Characters Type Comment
# %% n/a The literal % character.
# %c int A single character, represented as an C int.
# %d int Exactly equivalent to printf("%d").
# %u unsigned int Exactly equivalent to printf("%u").
# %ld long Exactly equivalent to printf("%ld").
# %lu unsigned long Exactly equivalent to printf("%lu").
# %zd Py_ssize_t Exactly equivalent to printf("%zd").
# %zu size_t Exactly equivalent to printf("%zu").
# %i int Exactly equivalent to printf("%i").
# %x int Exactly equivalent to printf("%x").
# %s char* A null-terminated C character array.
# %p void* The hex representation of a C pointer.
# Mostly equivalent to printf("%p") except that it is guaranteed to
# start with the literal 0x regardless of what the platform's printf
# yields.
# An unrecognized format character causes all the rest of the
# format string to be copied as-is to the result string, and any
# extra arguments discarded.
bytes PyBytes_FromFormatV(char *format, va_list vargs)
# Return value: New reference.
# Identical to PyBytes_FromFormat() except that it takes exactly two arguments.
Py_ssize_t PyBytes_Size(object string) except -1
# Return the length of the string in string object string.
Py_ssize_t PyBytes_GET_SIZE(object string)
# Macro form of PyBytes_Size() but without error checking.
char* PyBytes_AsString(object string) except NULL
# Return a NUL-terminated representation of the contents of
# string. The pointer refers to the internal buffer of string, not
# a copy. The data must not be modified in any way, unless the
# string was just created using PyBytes_FromStringAndSize(NULL,
# size). It must not be deallocated. If string is a Unicode
# object, this function computes the default encoding of string
# and operates on that. If string is not a string object at all,
# PyBytes_AsString() returns NULL and raises TypeError.
char* PyBytes_AS_STRING(object string)
# Macro form of PyBytes_AsString() but without error
# checking. Only string objects are supported; no Unicode objects
# should be passed.
int PyBytes_AsStringAndSize(object obj, char **buffer, Py_ssize_t *length) except -1
# Return a NULL-terminated representation of the contents of the
# object obj through the output variables buffer and length.
#
# The function accepts both string and Unicode objects as
# input. For Unicode objects it returns the default encoded
# version of the object. If length is NULL, the resulting buffer
# may not contain NUL characters; if it does, the function returns
# -1 and a TypeError is raised.
# The buffer refers to an internal string buffer of obj, not a
# copy. The data must not be modified in any way, unless the
# string was just created using PyBytes_FromStringAndSize(NULL,
# size). It must not be deallocated. If string is a Unicode
# object, this function computes the default encoding of string
# and operates on that. If string is not a string object at all,
# PyBytes_AsStringAndSize() returns -1 and raises TypeError.
void PyBytes_Concat(PyObject **string, object newpart)
# Create a new string object in *string containing the contents of
# newpart appended to string; the caller will own the new
# reference. The reference to the old value of string will be
# stolen. If the new string cannot be created, the old reference
# to string will still be discarded and the value of *string will
# be set to NULL; the appropriate exception will be set.
void PyBytes_ConcatAndDel(PyObject **string, object newpart)
# Create a new string object in *string containing the contents of
# newpart appended to string. This version decrements the
# reference count of newpart.
int _PyBytes_Resize(PyObject **string, Py_ssize_t newsize) except -1
# A way to resize a string object even though it is
# ``immutable''. Only use this to build up a brand new string
# object; don't use this if the string may already be known in
# other parts of the code. It is an error to call this function if
# the refcount on the input string object is not one. Pass the
# address of an existing string object as an lvalue (it may be
# written into), and the new size desired. On success, *string
# holds the resized string object and 0 is returned; the address
# in *string may differ from its input value. If the reallocation
# fails, the original string object at *string is deallocated,
# *string is set to NULL, a memory exception is set, and -1 is
# returned.
bytes PyBytes_Format(object format, object args)
# Return value: New reference. Return a new string object from
# format and args. Analogous to format % args. The args argument
# must be a tuple.
void PyBytes_InternInPlace(PyObject **string)
# Intern the argument *string in place. The argument must be the
# address of a pointer variable pointing to a Python string
# object. If there is an existing interned string that is the same
# as *string, it sets *string to it (decrementing the reference
# count of the old string object and incrementing the reference
# count of the interned string object), otherwise it leaves
# *string alone and interns it (incrementing its reference
# count). (Clarification: even though there is a lot of talk about
# reference counts, think of this function as
# reference-count-neutral; you own the object after the call if
# and only if you owned it before the call.)
bytes PyBytes_InternFromString(char *v)
# Return value: New reference.
# A combination of PyBytes_FromString() and
# PyBytes_InternInPlace(), returning either a new string object
# that has been interned, or a new (``owned'') reference to an
# earlier interned string object with the same value.
object PyBytes_Decode(char *s, Py_ssize_t size, char *encoding, char *errors)
# Return value: New reference.
# Create an object by decoding size bytes of the encoded buffer s
# using the codec registered for encoding. encoding and errors
# have the same meaning as the parameters of the same name in the
# unicode() built-in function. The codec to be used is looked up
# using the Python codec registry. Return NULL if an exception was
# raised by the codec.
object PyBytes_AsDecodedObject(object str, char *encoding, char *errors)
# Return value: New reference.
# Decode a string object by passing it to the codec registered for
# encoding and return the result as Python object. encoding and
# errors have the same meaning as the parameters of the same name
# in the string encode() method. The codec to be used is looked up
# using the Python codec registry. Return NULL if an exception was
# raised by the codec.
object PyBytes_Encode(char *s, Py_ssize_t size, char *encoding, char *errors)
# Return value: New reference.
# Encode the char buffer of the given size by passing it to the
# codec registered for encoding and return a Python
# object. encoding and errors have the same meaning as the
# parameters of the same name in the string encode() method. The
# codec to be used is looked up using the Python codec
# registry. Return NULL if an exception was raised by the codec.
object PyBytes_AsEncodedObject(object str, char *encoding, char *errors)
# Return value: New reference.
# Encode a string object using the codec registered for encoding
# and return the result as Python object. encoding and errors have
# the same meaning as the parameters of the same name in the
# string encode() method. The codec to be used is looked up using
# the Python codec registry. Return NULL if an exception was
# raised by the codec.

View file

@ -0,0 +1,35 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# Cell Objects
############################################################################
bint PyCell_Check(object ob)
# Return true if ob is a cell object; ob must not be NULL.
object PyCell_New(PyObject* ob)
# Return value: New reference.
# Create and return a new cell object containing the value ob. The
# parameter may be NULL.
object PyCell_Get(object cell)
# Return value: New reference.
# Return the contents of the cell object cell.
object PyCell_GET(object cell)
# Return value: Borrowed reference.
# Return the contents of the cell object cell, but without checking that
# cell is non-NULL and is a cell object.
int PyCell_Set(object cell, PyObject* value) except? -1
# Set the contents of the cell object cell to value. This releases the
# reference to any current content of the cell. value may be NULL. cell
# must be non-NULL; if it is not a cell object, -1 will be returned. On
# success, 0 will be returned.
void PyCell_SET(object cell, PyObject* value)
# Sets the value of the cell object cell to value. No reference counts are
# adjusted, and no checks are made for safety; cell must be non-NULL and
# must be a cell object.

View file

@ -0,0 +1,8 @@
cdef extern from "Python.h":
void PyEval_InitThreads()
# Initialize and acquire the global interpreter lock.
int PyEval_ThreadsInitialized()
# Returns a non-zero value if PyEval_InitThreads() has been called.

View file

@ -0,0 +1,36 @@
cdef extern from "Python.h":
###########################################################################
# Warning:
#
# The CObject API is deprecated as of Python 3.1. Please switch to
# the new Capsules API.
###########################################################################
int PyCObject_Check(object p)
# Return true if its argument is a PyCObject.
object PyCObject_FromVoidPtr(void* cobj, void (*destr)(void *))
# Return value: New reference.
#
# Create a PyCObject from the void * cobj. The destr function will
# be called when the object is reclaimed, unless it is NULL.
object PyCObject_FromVoidPtrAndDesc(void* cobj, void* desc, void (*destr)(void *, void *))
# Return value: New reference.
#
# Create a PyCObject from the void * cobj. The destr function will
# be called when the object is reclaimed. The desc argument can be
# used to pass extra callback data for the destructor function.
void* PyCObject_AsVoidPtr(object self) except? NULL
# Return the object void * that the PyCObject self was created with.
void* PyCObject_GetDesc(object self) except? NULL
# Return the description void * that the PyCObject self was created with.
int PyCObject_SetVoidPtr(object self, void* cobj) except 0
# Set the void pointer inside self to cobj. The PyCObject must not
# have an associated destructor. Return true on success, false on
# failure.

View file

@ -0,0 +1,121 @@
cdef extern from "Python.h":
###########################################################################
# Codec registry and support functions
###########################################################################
int PyCodec_Register(object search_function)
# Register a new codec search function.
# As side effect, this tries to load the encodings package, if not yet
# done, to make sure that it is always first in the list of search
# functions.
int PyCodec_KnownEncoding(const char *encoding)
# Return 1 or 0 depending on whether there is a registered codec for the
# given encoding. This function always succeeds.
object PyCodec_Encode(object o, const char *encoding, const char *errors)
# Return value: New reference.
# Generic codec based encoding API.
# o is passed through the encoder function found for the given encoding
# using the error handling method defined by errors. errors may be NULL
# to use the default method defined for the codec. Raises a LookupError
# if no encoder can be found.
object PyCodec_Decode(object o, const char *encoding, const char *errors)
# Return value: New reference.
# Generic codec based decoding API.
# o is passed through the decoder function found for the given encoding
# using the error handling method defined by errors. errors may be NULL
# to use the default method defined for the codec. Raises a LookupError
# if no encoder can be found.
# Codec lookup API
# In the following functions, the encoding string is looked up converted
# to all lower-case characters, which makes encodings looked up through
# this mechanism effectively case-insensitive. If no codec is found, a
# KeyError is set and NULL returned.
object PyCodec_Encoder(const char *encoding)
# Return value: New reference.
# Get an encoder function for the given encoding.
object PyCodec_Decoder(const char *encoding)
# Return value: New reference.
# Get a decoder function for the given encoding.
object PyCodec_IncrementalEncoder(const char *encoding, const char *errors)
# Return value: New reference.
# Get an IncrementalEncoder object for the given encoding.
object PyCodec_IncrementalDecoder(const char *encoding, const char *errors)
# Return value: New reference.
# Get an IncrementalDecoder object for the given encoding.
object PyCodec_StreamReader(const char *encoding, object stream, const char *errors)
# Return value: New reference.
# Get a StreamReader factory function for the given encoding.
object PyCodec_StreamWriter(const char *encoding, object stream, const char *errors)
# Return value: New reference.
# Get a StreamWriter factory function for the given encoding.
# Registry API for Unicode encoding error handlers
int PyCodec_RegisterError(const char *name, object error) except? -1
# Register the error handling callback function error under the given
# name. This callback function will be called by a codec when it
# encounters unencodable characters/undecodable bytes and name is
# specified as the error parameter in the call to the encode/decode
# function.
# The callback gets a single argument, an instance of
# UnicodeEncodeError, UnicodeDecodeError or UnicodeTranslateError that
# holds information about the problematic sequence of characters or bytes
# and their offset in the original string (see Unicode Exception Objects
# for functions to extract this information). The callback must either
# raise the given exception, or return a two-item tuple containing the
# replacement for the problematic sequence, and an integer giving the
# offset in the original string at which encoding/decoding should be
# resumed.
# Return 0 on success, -1 on error.
object PyCodec_LookupError(const char *name)
# Return value: New reference.
# Lookup the error handling callback function registered under name. As a
# special case NULL can be passed, in which case the error handling
# callback for "strict" will be returned.
object PyCodec_StrictErrors(object exc)
# Return value: Always NULL.
# Raise exc as an exception.
object PyCodec_IgnoreErrors(object exc)
# Return value: New reference.
# Ignore the unicode error, skipping the faulty input.
object PyCodec_ReplaceErrors(object exc)
# Return value: New reference.
# Replace the unicode encode error with "?" or "U+FFFD".
object PyCodec_XMLCharRefReplaceErrors(object exc)
# Return value: New reference.
# Replace the unicode encode error with XML character references.
object PyCodec_BackslashReplaceErrors(object exc)
# Return value: New reference.
# Replace the unicode encode error with backslash escapes ("\x", "\u"
# and "\U").
object PyCodec_NameReplaceErrors(object exc)
# Return value: New reference.
# Replace the unicode encode error with "\N{...}" escapes.
# New in version 3.5.

View file

@ -0,0 +1,50 @@
cdef extern from "Python.h":
ctypedef struct Py_complex:
double imag
double real
############################################################################
# 7.2.5.2 Complex Numbers as Python Objects
############################################################################
# PyComplexObject
# This subtype of PyObject represents a Python complex number object.
ctypedef class __builtin__.complex [object PyComplexObject]:
cdef Py_complex cval
# not making these available to keep them read-only:
#cdef double imag "cval.imag"
#cdef double real "cval.real"
# PyTypeObject PyComplex_Type
# This instance of PyTypeObject represents the Python complex
# number type. It is the same object as complex and
# types.ComplexType.
bint PyComplex_Check(object p)
# Return true if its argument is a PyComplexObject or a subtype of
# PyComplexObject.
bint PyComplex_CheckExact(object p)
# Return true if its argument is a PyComplexObject, but not a subtype of PyComplexObject.
object PyComplex_FromCComplex(Py_complex v)
# Return value: New reference.
# Create a new Python complex number object from a C Py_complex value.
object PyComplex_FromDoubles(double real, double imag)
# Return value: New reference.
# Return a new PyComplexObject object from real and imag.
double PyComplex_RealAsDouble(object op) except? -1
# Return the real part of op as a C double.
double PyComplex_ImagAsDouble(object op) except? -1
# Return the imaginary part of op as a C double.
Py_complex PyComplex_AsCComplex(object op)
# Return the Py_complex value of the complex number op.
#
# Returns (-1+0i) in case of an error

View file

@ -0,0 +1,36 @@
# From https://docs.python.org/3/c-api/conversion.html
from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct va_list
int PyOS_snprintf(char *str, size_t size, const char *format, ...)
# Output not more than size bytes to str according to the format
# string format and the extra arguments. See the Unix man page snprintf(2).
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
# Output not more than size bytes to str according to the format
# string format and the variable argument list va. Unix man page vsnprintf(2).
double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) except? -1.0
# Convert a string s to a double, raising a Python exception on failure. The set of
# accepted strings corresponds to the set of strings accepted by Pythons float()
# constructor, except that s must not have leading or trailing whitespace.
# The conversion is independent of the current locale.
enum:
Py_DTSF_SIGN
Py_DTSF_ADD_DOT_0
Py_DTSF_ALT
char* PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype) except NULL
# Convert a double val to a string using supplied format_code, precision, and flags.
int PyOS_stricmp(const char *s1, const char *s2)
# Case insensitive comparison of strings. The function works almost identically
# to strcmp() except that it ignores the case.
int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size)
# Case insensitive comparison of strings. The function works almost identically
# to strncmp() except that it ignores the case.

View file

@ -0,0 +1,212 @@
from cpython.object cimport PyObject
cdef extern from "Python.h":
ctypedef struct PyTypeObject:
pass
cdef extern from "datetime.h":
ctypedef extern class datetime.date[object PyDateTime_Date]:
pass
ctypedef extern class datetime.time[object PyDateTime_Time]:
pass
ctypedef extern class datetime.datetime[object PyDateTime_DateTime]:
pass
ctypedef extern class datetime.timedelta[object PyDateTime_Delta]:
pass
ctypedef extern class datetime.tzinfo[object PyDateTime_TZInfo]:
pass
ctypedef struct PyDateTime_Date:
pass
ctypedef struct PyDateTime_Time:
char hastzinfo
PyObject *tzinfo
ctypedef struct PyDateTime_DateTime:
char hastzinfo
PyObject *tzinfo
ctypedef struct PyDateTime_Delta:
int days
int seconds
int microseconds
# Define structure for C API.
ctypedef struct PyDateTime_CAPI:
# type objects
PyTypeObject *DateType
PyTypeObject *DateTimeType
PyTypeObject *TimeType
PyTypeObject *DeltaType
PyTypeObject *TZInfoType
# constructors
object (*Date_FromDate)(int, int, int, PyTypeObject*)
object (*DateTime_FromDateAndTime)(int, int, int, int, int, int, int, object, PyTypeObject*)
object (*Time_FromTime)(int, int, int, int, object, PyTypeObject*)
object (*Delta_FromDelta)(int, int, int, int, PyTypeObject*)
# constructors for the DB API
object (*DateTime_FromTimestamp)(object, object, object)
object (*Date_FromTimestamp)(object, object)
# Check type of the object.
bint PyDate_Check(object op)
bint PyDate_CheckExact(object op)
bint PyDateTime_Check(object op)
bint PyDateTime_CheckExact(object op)
bint PyTime_Check(object op)
bint PyTime_CheckExact(object op)
bint PyDelta_Check(object op)
bint PyDelta_CheckExact(object op)
bint PyTZInfo_Check(object op)
bint PyTZInfo_CheckExact(object op)
# Getters for date and datetime (C macros).
int PyDateTime_GET_YEAR(object o)
int PyDateTime_GET_MONTH(object o)
int PyDateTime_GET_DAY(object o)
# Getters for datetime (C macros).
int PyDateTime_DATE_GET_HOUR(object o)
int PyDateTime_DATE_GET_MINUTE(object o)
int PyDateTime_DATE_GET_SECOND(object o)
int PyDateTime_DATE_GET_MICROSECOND(object o)
# Getters for time (C macros).
int PyDateTime_TIME_GET_HOUR(object o)
int PyDateTime_TIME_GET_MINUTE(object o)
int PyDateTime_TIME_GET_SECOND(object o)
int PyDateTime_TIME_GET_MICROSECOND(object o)
# Getters for timedelta (C macros).
int PyDateTime_DELTA_GET_DAYS(object o)
int PyDateTime_DELTA_GET_SECONDS(object o)
int PyDateTime_DELTA_GET_MICROSECONDS(object o)
# PyDateTime CAPI object.
PyDateTime_CAPI *PyDateTimeAPI
void PyDateTime_IMPORT()
# Datetime C API initialization function.
# You have to call it before any usage of DateTime CAPI functions.
cdef inline void import_datetime():
PyDateTime_IMPORT
# Create date object using DateTime CAPI factory function.
# Note, there are no range checks for any of the arguments.
cdef inline object date_new(int year, int month, int day):
return PyDateTimeAPI.Date_FromDate(year, month, day, PyDateTimeAPI.DateType)
# Create time object using DateTime CAPI factory function
# Note, there are no range checks for any of the arguments.
cdef inline object time_new(int hour, int minute, int second, int microsecond, object tz):
return PyDateTimeAPI.Time_FromTime(hour, minute, second, microsecond, tz, PyDateTimeAPI.TimeType)
# Create datetime object using DateTime CAPI factory function.
# Note, there are no range checks for any of the arguments.
cdef inline object datetime_new(int year, int month, int day, int hour, int minute, int second, int microsecond, object tz):
return PyDateTimeAPI.DateTime_FromDateAndTime(year, month, day, hour, minute, second, microsecond, tz, PyDateTimeAPI.DateTimeType)
# Create timedelta object using DateTime CAPI factory function.
# Note, there are no range checks for any of the arguments.
cdef inline object timedelta_new(int days, int seconds, int useconds):
return PyDateTimeAPI.Delta_FromDelta(days, seconds, useconds, 1, PyDateTimeAPI.DeltaType)
# More recognizable getters for date/time/datetime/timedelta.
# There are no setters because datetime.h hasn't them.
# This is because of immutable nature of these objects by design.
# If you would change time/date/datetime/timedelta object you need to recreate.
# Get tzinfo of time
cdef inline object time_tzinfo(object o):
if (<PyDateTime_Time*>o).hastzinfo:
return <object>(<PyDateTime_Time*>o).tzinfo
else:
return None
# Get tzinfo of datetime
cdef inline object datetime_tzinfo(object o):
if (<PyDateTime_DateTime*>o).hastzinfo:
return <object>(<PyDateTime_DateTime*>o).tzinfo
else:
return None
# Get year of date
cdef inline int date_year(object o):
return PyDateTime_GET_YEAR(o)
# Get month of date
cdef inline int date_month(object o):
return PyDateTime_GET_MONTH(o)
# Get day of date
cdef inline int date_day(object o):
return PyDateTime_GET_DAY(o)
# Get year of datetime
cdef inline int datetime_year(object o):
return PyDateTime_GET_YEAR(o)
# Get month of datetime
cdef inline int datetime_month(object o):
return PyDateTime_GET_MONTH(o)
# Get day of datetime
cdef inline int datetime_day(object o):
return PyDateTime_GET_DAY(o)
# Get hour of time
cdef inline int time_hour(object o):
return PyDateTime_TIME_GET_HOUR(o)
# Get minute of time
cdef inline int time_minute(object o):
return PyDateTime_TIME_GET_MINUTE(o)
# Get second of time
cdef inline int time_second(object o):
return PyDateTime_TIME_GET_SECOND(o)
# Get microsecond of time
cdef inline int time_microsecond(object o):
return PyDateTime_TIME_GET_MICROSECOND(o)
# Get hour of datetime
cdef inline int datetime_hour(object o):
return PyDateTime_DATE_GET_HOUR(o)
# Get minute of datetime
cdef inline int datetime_minute(object o):
return PyDateTime_DATE_GET_MINUTE(o)
# Get second of datetime
cdef inline int datetime_second(object o):
return PyDateTime_DATE_GET_SECOND(o)
# Get microsecond of datetime
cdef inline int datetime_microsecond(object o):
return PyDateTime_DATE_GET_MICROSECOND(o)
# Get days of timedelta
cdef inline int timedelta_days(object o):
return (<PyDateTime_Delta*>o).days
# Get seconds of timedelta
cdef inline int timedelta_seconds(object o):
return (<PyDateTime_Delta*>o).seconds
# Get microseconds of timedelta
cdef inline int timedelta_microseconds(object o):
return (<PyDateTime_Delta*>o).microseconds

View file

@ -0,0 +1,165 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# 7.4.1 Dictionary Objects
############################################################################
# PyDictObject
#
# This subtype of PyObject represents a Python dictionary object
# (i.e. the 'dict' type).
# PyTypeObject PyDict_Type
#
# This instance of PyTypeObject represents the Python dictionary
# type. This is exposed to Python programs as dict and
# types.DictType.
bint PyDict_Check(object p)
# Return true if p is a dict object or an instance of a subtype of
# the dict type.
bint PyDict_CheckExact(object p)
# Return true if p is a dict object, but not an instance of a
# subtype of the dict type.
dict PyDict_New()
# Return value: New reference.
# Return a new empty dictionary, or NULL on failure.
object PyDictProxy_New(object dict)
# Return value: New reference.
# Return a proxy object for a mapping which enforces read-only
# behavior. This is normally used to create a proxy to prevent
# modification of the dictionary for non-dynamic class types.
void PyDict_Clear(object p)
# Empty an existing dictionary of all key-value pairs.
int PyDict_Contains(object p, object key) except -1
# Determine if dictionary p contains key. If an item in p is
# matches key, return 1, otherwise return 0. On error, return
# -1. This is equivalent to the Python expression "key in p".
dict PyDict_Copy(object p)
# Return value: New reference.
# Return a new dictionary that contains the same key-value pairs as p.
int PyDict_SetItem(object p, object key, object val) except -1
# Insert value into the dictionary p with a key of key. key must
# be hashable; if it isn't, TypeError will be raised. Return 0 on
# success or -1 on failure.
int PyDict_SetItemString(object p, const char *key, object val) except -1
# Insert value into the dictionary p using key as a key. key
# should be a char*. The key object is created using
# PyString_FromString(key). Return 0 on success or -1 on failure.
int PyDict_DelItem(object p, object key) except -1
# Remove the entry in dictionary p with key key. key must be
# hashable; if it isn't, TypeError is raised. Return 0 on success
# or -1 on failure.
int PyDict_DelItemString(object p, const char *key) except -1
# Remove the entry in dictionary p which has a key specified by
# the string key. Return 0 on success or -1 on failure.
PyObject* PyDict_GetItem(object p, object key)
# Return value: Borrowed reference.
# Return the object from dictionary p which has a key key. Return
# NULL if the key key is not present, but without setting an
# exception.
PyObject* PyDict_GetItemString(object p, const char *key)
# Return value: Borrowed reference.
# This is the same as PyDict_GetItem(), but key is specified as a
# char*, rather than a PyObject*.
list PyDict_Items(object p)
# Return value: New reference.
# Return a PyListObject containing all the items from the
# dictionary, as in the dictionary method items() (see the Python
# Library Reference).
list PyDict_Keys(object p)
# Return value: New reference.
# Return a PyListObject containing all the keys from the
# dictionary, as in the dictionary method keys() (see the Python
# Library Reference).
list PyDict_Values(object p)
# Return value: New reference.
# Return a PyListObject containing all the values from the
# dictionary p, as in the dictionary method values() (see the
# Python Library Reference).
Py_ssize_t PyDict_Size(object p) except -1
# Return the number of items in the dictionary. This is equivalent
# to "len(p)" on a dictionary.
int PyDict_Next(object p, Py_ssize_t *ppos, PyObject* *pkey, PyObject* *pvalue)
# Iterate over all key-value pairs in the dictionary p. The int
# referred to by ppos must be initialized to 0 prior to the first
# call to this function to start the iteration; the function
# returns true for each pair in the dictionary, and false once all
# pairs have been reported. The parameters pkey and pvalue should
# either point to PyObject* variables that will be filled in with
# each key and value, respectively, or may be NULL. Any references
# returned through them are borrowed. ppos should not be altered
# during iteration. Its value represents offsets within the
# internal dictionary structure, and since the structure is
# sparse, the offsets are not consecutive.
# For example:
#
#object key, *value;
#int pos = 0;
#
#while (PyDict_Next(self->dict, &pos, &key, &value)) {
# /* do something interesting with the values... */
# ...
#}
# The dictionary p should not be mutated during iteration. It is
# safe (since Python 2.1) to modify the values of the keys as you
# iterate over the dictionary, but only so long as the set of keys
# does not change. For example:
# object key, *value;
# int pos = 0;
# while (PyDict_Next(self->dict, &pos, &key, &value)) {
# int i = PyInt_AS_LONG(value) + 1;
# object o = PyInt_FromLong(i);
# if (o == NULL)
# return -1;
# if (PyDict_SetItem(self->dict, key, o) < 0) {
# Py_DECREF(o);
# return -1;
# }
# Py_DECREF(o);
# }
int PyDict_Merge(object a, object b, int override) except -1
# Iterate over mapping object b adding key-value pairs to
# dictionary a. b may be a dictionary, or any object supporting
# PyMapping_Keys() and PyObject_GetItem(). If override is true,
# existing pairs in a will be replaced if a matching key is found
# in b, otherwise pairs will only be added if there is not a
# matching key in a. Return 0 on success or -1 if an exception was
# raised.
int PyDict_Update(object a, object b) except -1
# This is the same as PyDict_Merge(a, b, 1) in C, or a.update(b)
# in Python. Return 0 on success or -1 if an exception was raised.
int PyDict_MergeFromSeq2(object a, object seq2, int override) except -1
# Update or merge into dictionary a, from the key-value pairs in
# seq2. seq2 must be an iterable object producing iterable objects
# of length 2, viewed as key-value pairs. In case of duplicate
# keys, the last wins if override is true, else the first
# wins. Return 0 on success or -1 if an exception was
# raised. Equivalent Python (except for the return value):
#
#def PyDict_MergeFromSeq2(a, seq2, override):
# for key, value in seq2:
# if override or key not in a:
# a[key] = value

View file

@ -0,0 +1,257 @@
from .object cimport PyObject
cdef extern from "Python.h":
#####################################################################
# 3. Exception Handling
#####################################################################
# The functions described in this chapter will let you handle and
# raise Python exceptions. It is important to understand some of
# the basics of Python exception handling. It works somewhat like
# the Unix errno variable: there is a global indicator (per
# thread) of the last error that occurred. Most functions don't
# clear this on success, but will set it to indicate the cause of
# the error on failure. Most functions also return an error
# indicator, usually NULL if they are supposed to return a
# pointer, or -1 if they return an integer (exception: the
# PyArg_*() functions return 1 for success and 0 for failure).
# When a function must fail because some function it called
# failed, it generally doesn't set the error indicator; the
# function it called already set it. It is responsible for either
# handling the error and clearing the exception or returning after
# cleaning up any resources it holds (such as object references or
# memory allocations); it should not continue normally if it is
# not prepared to handle the error. If returning due to an error,
# it is important to indicate to the caller that an error has been
# set. If the error is not handled or carefully propagated,
# additional calls into the Python/C API may not behave as
# intended and may fail in mysterious ways.
# The error indicator consists of three Python objects
# corresponding to the Python variables sys.exc_type,
# sys.exc_value and sys.exc_traceback. API functions exist to
# interact with the error indicator in various ways. There is a
# separate error indicator for each thread.
void PyErr_Print()
# Print a standard traceback to sys.stderr and clear the error
# indicator. Call this function only when the error indicator is
# set. (Otherwise it will cause a fatal error!)
PyObject* PyErr_Occurred()
# Return value: Borrowed reference.
# Test whether the error indicator is set. If set, return the
# exception type (the first argument to the last call to one of
# the PyErr_Set*() functions or to PyErr_Restore()). If not set,
# return NULL. You do not own a reference to the return value, so
# you do not need to Py_DECREF() it. Note: Do not compare the
# return value to a specific exception; use
# PyErr_ExceptionMatches() instead, shown below. (The comparison
# could easily fail since the exception may be an instance instead
# of a class, in the case of a class exception, or it may be a
# subclass of the expected exception.)
bint PyErr_ExceptionMatches(object exc)
# Equivalent to "PyErr_GivenExceptionMatches(PyErr_Occurred(),
# exc)". This should only be called when an exception is actually
# set; a memory access violation will occur if no exception has
# been raised.
bint PyErr_GivenExceptionMatches(object given, object exc)
# Return true if the given exception matches the exception in
# exc. If exc is a class object, this also returns true when given
# is an instance of a subclass. If exc is a tuple, all exceptions
# in the tuple (and recursively in subtuples) are searched for a
# match. If given is NULL, a memory access violation will occur.
void PyErr_NormalizeException(PyObject** exc, PyObject** val, PyObject** tb)
# Under certain circumstances, the values returned by
# PyErr_Fetch() below can be ``unnormalized'', meaning that *exc
# is a class object but *val is not an instance of the same
# class. This function can be used to instantiate the class in
# that case. If the values are already normalized, nothing
# happens. The delayed normalization is implemented to improve
# performance.
void PyErr_Clear()
# Clear the error indicator. If the error indicator is not set, there is no effect.
void PyErr_Fetch(PyObject** ptype, PyObject** pvalue, PyObject** ptraceback)
# Retrieve the error indicator into three variables whose
# addresses are passed. If the error indicator is not set, set all
# three variables to NULL. If it is set, it will be cleared and
# you own a reference to each object retrieved. The value and
# traceback object may be NULL even when the type object is
# not. Note: This function is normally only used by code that
# needs to handle exceptions or by code that needs to save and
# restore the error indicator temporarily.
void PyErr_Restore(PyObject* type, PyObject* value, PyObject* traceback)
# Set the error indicator from the three objects. If the error
# indicator is already set, it is cleared first. If the objects
# are NULL, the error indicator is cleared. Do not pass a NULL
# type and non-NULL value or traceback. The exception type should
# be a class. Do not pass an invalid exception type or
# value. (Violating these rules will cause subtle problems later.)
# This call takes away a reference to each object: you must own a
# reference to each object before the call and after the call you
# no longer own these references. (If you don't understand this,
# don't use this function. I warned you.) Note: This function is
# normally only used by code that needs to save and restore the
# error indicator temporarily; use PyErr_Fetch() to save the
# current exception state.
void PyErr_SetString(object type, char *message)
# This is the most common way to set the error indicator. The
# first argument specifies the exception type; it is normally one
# of the standard exceptions, e.g. PyExc_RuntimeError. You need
# not increment its reference count. The second argument is an
# error message; it is converted to a string object.
void PyErr_SetObject(object type, object value)
# This function is similar to PyErr_SetString() but lets you
# specify an arbitrary Python object for the ``value'' of the
# exception.
PyObject* PyErr_Format(object exception, char *format, ...) except NULL
# Return value: Always NULL.
# This function sets the error indicator and returns
# NULL. exception should be a Python exception (class, not an
# instance). format should be a string, containing format codes,
# similar to printf(). The width.precision before a format code is
# parsed, but the width part is ignored.
void PyErr_SetNone(object type)
# This is a shorthand for "PyErr_SetObject(type, Py_None)".
int PyErr_BadArgument() except 0
# This is a shorthand for "PyErr_SetString(PyExc_TypeError,
# message)", where message indicates that a built-in operation was
# invoked with an illegal argument. It is mostly for internal use.
PyObject* PyErr_NoMemory() except NULL
# Return value: Always NULL.
# This is a shorthand for "PyErr_SetNone(PyExc_MemoryError)"; it
# returns NULL so an object allocation function can write "return
# PyErr_NoMemory();" when it runs out of memory.
PyObject* PyErr_SetFromErrno(object type) except NULL
# Return value: Always NULL.
# This is a convenience function to raise an exception when a C
# library function has returned an error and set the C variable
# errno. It constructs a tuple object whose first item is the
# integer errno value and whose second item is the corresponding
# error message (gotten from strerror()), and then calls
# "PyErr_SetObject(type, object)". On Unix, when the errno value
# is EINTR, indicating an interrupted system call, this calls
# PyErr_CheckSignals(), and if that set the error indicator,
# leaves it set to that. The function always returns NULL, so a
# wrapper function around a system call can write "return
# PyErr_SetFromErrno(type);" when the system call returns an
# error.
PyObject* PyErr_SetFromErrnoWithFilenameObject(object type, object filenameObject) except NULL
# Similar to PyErr_SetFromErrno(), with the additional behavior
# that if filenameObject is not NULL, it is passed to the
# constructor of type as a third parameter.
# In the case of OSError exception, this is used to define
# the filename attribute of the exception instance.
PyObject* PyErr_SetFromErrnoWithFilename(object type, char *filename) except NULL
# Return value: Always NULL. Similar to PyErr_SetFromErrno(),
# with the additional behavior that if filename is not NULL, it is
# passed to the constructor of type as a third parameter. In the
# case of exceptions such as IOError and OSError, this is used to
# define the filename attribute of the exception instance.
PyObject* PyErr_SetFromWindowsErr(int ierr) except NULL
# Return value: Always NULL. This is a convenience function to
# raise WindowsError. If called with ierr of 0, the error code
# returned by a call to GetLastError() is used instead. It calls
# the Win32 function FormatMessage() to retrieve the Windows
# description of error code given by ierr or GetLastError(), then
# it constructs a tuple object whose first item is the ierr value
# and whose second item is the corresponding error message (gotten
# from FormatMessage()), and then calls
# "PyErr_SetObject(PyExc_WindowsError, object)". This function
# always returns NULL. Availability: Windows.
PyObject* PyErr_SetExcFromWindowsErr(object type, int ierr) except NULL
# Return value: Always NULL. Similar to
# PyErr_SetFromWindowsErr(), with an additional parameter
# specifying the exception type to be raised. Availability:
# Windows. New in version 2.3.
PyObject* PyErr_SetFromWindowsErrWithFilename(int ierr, char *filename) except NULL
# Return value: Always NULL. Similar to
# PyErr_SetFromWindowsErr(), with the additional behavior that if
# filename is not NULL, it is passed to the constructor of
# WindowsError as a third parameter. Availability: Windows.
PyObject* PyErr_SetExcFromWindowsErrWithFilename(object type, int ierr, char *filename) except NULL
# Return value: Always NULL.
# Similar to PyErr_SetFromWindowsErrWithFilename(), with an
# additional parameter specifying the exception type to be
# raised. Availability: Windows.
void PyErr_BadInternalCall()
# This is a shorthand for "PyErr_SetString(PyExc_TypeError,
# message)", where message indicates that an internal operation
# (e.g. a Python/C API function) was invoked with an illegal
# argument. It is mostly for internal use.
int PyErr_WarnEx(object category, char *message, int stacklevel) except -1
# Issue a warning message. The category argument is a warning
# category (see below) or NULL; the message argument is a message
# string. stacklevel is a positive number giving a number of stack
# frames; the warning will be issued from the currently executing
# line of code in that stack frame. A stacklevel of 1 is the
# function calling PyErr_WarnEx(), 2 is the function above that,
# and so forth.
int PyErr_WarnExplicit(object category, char *message, char *filename, int lineno, char *module, object registry) except -1
# Issue a warning message with explicit control over all warning
# attributes. This is a straightforward wrapper around the Python
# function warnings.warn_explicit(), see there for more
# information. The module and registry arguments may be set to
# NULL to get the default effect described there.
int PyErr_CheckSignals() except -1
# This function interacts with Python's signal handling. It checks
# whether a signal has been sent to the processes and if so,
# invokes the corresponding signal handler. If the signal module
# is supported, this can invoke a signal handler written in
# Python. In all cases, the default effect for SIGINT is to raise
# the KeyboardInterrupt exception. If an exception is raised the
# error indicator is set and the function returns 1; otherwise the
# function returns 0. The error indicator may or may not be
# cleared if it was previously set.
void PyErr_SetInterrupt() nogil
# This function simulates the effect of a SIGINT signal arriving
# -- the next time PyErr_CheckSignals() is called,
# KeyboardInterrupt will be raised. It may be called without
# holding the interpreter lock.
object PyErr_NewException(char *name, object base, object dict)
# Return value: New reference.
# This utility function creates and returns a new exception
# object. The name argument must be the name of the new exception,
# a C string of the form module.class. The base and dict arguments
# are normally NULL. This creates a class object derived from
# Exception (accessible in C as PyExc_Exception).
void PyErr_WriteUnraisable(object obj)
# This utility function prints a warning message to sys.stderr
# when an exception has been set but it is impossible for the
# interpreter to actually raise the exception. It is used, for
# example, when an exception occurs in an __del__() method.
#
# The function is called with a single argument obj that
# identifies the context in which the unraisable exception
# occurred. The repr of obj will be printed in the warning
# message.

View file

@ -0,0 +1,39 @@
cdef extern from "Python.h":
############################################################################
# 7.2.3
############################################################################
# PyFloatObject
#
# This subtype of PyObject represents a Python floating point object.
# PyTypeObject PyFloat_Type
#
# This instance of PyTypeObject represents the Python floating
# point type. This is the same object as float and
# types.FloatType.
bint PyFloat_Check(object p)
# Return true if its argument is a PyFloatObject or a subtype of
# PyFloatObject.
bint PyFloat_CheckExact(object p)
# Return true if its argument is a PyFloatObject, but not a
# subtype of PyFloatObject.
object PyFloat_FromString(object str, char **pend)
# Return value: New reference.
# Create a PyFloatObject object based on the string value in str,
# or NULL on failure. The pend argument is ignored. It remains
# only for backward compatibility.
object PyFloat_FromDouble(double v)
# Return value: New reference.
# Create a PyFloatObject object from v, or NULL on failure.
double PyFloat_AsDouble(object pyfloat) except? -1
# Return a C double representation of the contents of pyfloat.
double PyFloat_AS_DOUBLE(object pyfloat)
# Return a C double representation of the contents of pyfloat, but
# without error checking.

View file

@ -0,0 +1,65 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# 7.5.3 Function Objects
############################################################################
# There are a few functions specific to Python functions.
# PyFunctionObject
#
# The C structure used for functions.
# PyTypeObject PyFunction_Type
#
# This is an instance of PyTypeObject and represents the Python
# function type. It is exposed to Python programmers as
# types.FunctionType.
bint PyFunction_Check(object o)
# Return true if o is a function object (has type
# PyFunction_Type). The parameter must not be NULL.
object PyFunction_New(object code, object globals)
# Return value: New reference.
# Return a new function object associated with the code object
# code. globals must be a dictionary with the global variables
# accessible to the function.
# The function's docstring, name and __module__ are retrieved from
# the code object, the argument defaults and closure are set to
# NULL.
PyObject* PyFunction_GetCode(object op) except? NULL
# Return value: Borrowed reference.
# Return the code object associated with the function object op.
PyObject* PyFunction_GetGlobals(object op) except? NULL
# Return value: Borrowed reference.
# Return the globals dictionary associated with the function object op.
PyObject* PyFunction_GetModule(object op) except? NULL
# Return value: Borrowed reference.
# Return the __module__ attribute of the function object op. This
# is normally a string containing the module name, but can be set
# to any other object by Python code.
PyObject* PyFunction_GetDefaults(object op) except? NULL
# Return value: Borrowed reference.
# Return the argument default values of the function object
# op. This can be a tuple of arguments or NULL.
int PyFunction_SetDefaults(object op, object defaults) except -1
# Set the argument default values for the function object
# op. defaults must be Py_None or a tuple.
# Raises SystemError and returns -1 on failure.
PyObject* PyFunction_GetClosure(object op) except? NULL
# Return value: Borrowed reference.
# Return the closure associated with the function object op. This
# can be NULL or a tuple of cell objects.
int PyFunction_SetClosure(object op, object closure) except -1
# Set the closure associated with the function object op. closure
# must be Py_None or a tuple of cell objects.
# Raises SystemError and returns -1 on failure.

View file

@ -0,0 +1,25 @@
from .pystate cimport PyFrameObject
cdef extern from "Python.h":
###########################################################################
# Generator Objects
###########################################################################
bint PyGen_Check(object ob)
# Return true if ob is a generator object; ob must not be NULL.
bint PyGen_CheckExact(object ob)
# Return true if ob's type is PyGen_Type; ob must not be NULL.
object PyGen_New(PyFrameObject *frame)
# Return value: New reference.
# Create and return a new generator object based on the frame object. A
# reference to frame is stolen by this function. The argument must not be
# NULL.
object PyGen_NewWithQualName(PyFrameObject *frame, object name, object qualname)
# Return value: New reference.
# Create and return a new generator object based on the frame object, with
# __name__ and __qualname__ set to name and qualname. A reference to frame
# is stolen by this function. The frame argument must not be NULL.

View file

@ -0,0 +1,12 @@
cdef extern from "Python.h":
#####################################################################
# 5.5 Parsing arguments and building values
#####################################################################
ctypedef struct va_list
int PyArg_ParseTuple(object args, char *format, ...) except 0
int PyArg_VaParse(object args, char *format, va_list vargs) except 0
int PyArg_ParseTupleAndKeywords(object args, object kw, char *format, char *keywords[], ...) except 0
int PyArg_VaParseTupleAndKeywords(object args, object kw, char *format, char *keywords[], va_list vargs) except 0
int PyArg_Parse(object args, char *format, ...) except 0
int PyArg_UnpackTuple(object args, char *name, Py_ssize_t min, Py_ssize_t max, ...) except 0

View file

@ -0,0 +1,25 @@
cdef extern from "Python.h":
############################################################################
# 7.5.2 Instance Objects
############################################################################
# PyTypeObject PyInstance_Type
#
# Type object for class instances.
int PyInstance_Check(object obj)
# Return true if obj is an instance.
object PyInstance_New(object cls, object arg, object kw)
# Return value: New reference.
# Create a new instance of a specific class. The parameters arg
# and kw are used as the positional and keyword parameters to the
# object's constructor.
object PyInstance_NewRaw(object cls, object dict)
# Return value: New reference.
# Create a new instance of a specific class without calling its
# constructor. class is the class of new object. The dict
# parameter will be used as the object's __dict__; if NULL, a new
# dictionary will be created for the instance.

View file

@ -0,0 +1,89 @@
cdef extern from "Python.h":
ctypedef unsigned long long PY_LONG_LONG
############################################################################
# Integer Objects
############################################################################
# PyTypeObject PyInt_Type
# This instance of PyTypeObject represents the Python plain
# integer type. This is the same object as int and types.IntType.
bint PyInt_Check(object o)
# Return true if o is of type PyInt_Type or a subtype of
# PyInt_Type.
bint PyInt_CheckExact(object o)
# Return true if o is of type PyInt_Type, but not a subtype of
# PyInt_Type.
object PyInt_FromString(char *str, char **pend, int base)
# Return value: New reference.
# Return a new PyIntObject or PyLongObject based on the string
# value in str, which is interpreted according to the radix in
# base. If pend is non-NULL, *pend will point to the first
# character in str which follows the representation of the
# number. If base is 0, the radix will be determined based on the
# leading characters of str: if str starts with '0x' or '0X',
# radix 16 will be used; if str starts with '0', radix 8 will be
# used; otherwise radix 10 will be used. If base is not 0, it must
# be between 2 and 36, inclusive. Leading spaces are ignored. If
# there are no digits, ValueError will be raised. If the string
# represents a number too large to be contained within the
# machine's long int type and overflow warnings are being
# suppressed, a PyLongObject will be returned. If overflow
# warnings are not being suppressed, NULL will be returned in this
# case.
object PyInt_FromLong(long ival)
# Return value: New reference.
# Create a new integer object with a value of ival.
# The current implementation keeps an array of integer objects for
# all integers between -5 and 256, when you create an int in that
# range you actually just get back a reference to the existing
# object. So it should be possible to change the value of 1. I
# suspect the behaviour of Python in this case is undefined. :-)
object PyInt_FromSsize_t(Py_ssize_t ival)
# Return value: New reference.
# Create a new integer object with a value of ival. If the value
# is larger than LONG_MAX or smaller than LONG_MIN, a long integer
# object is returned.
object PyInt_FromSize_t(size_t ival)
# Return value: New reference.
# Create a new integer object with a value of ival. If the value
# exceeds LONG_MAX, a long integer object is returned.
long PyInt_AsLong(object io) except? -1
# Will first attempt to cast the object to a PyIntObject, if it is
# not already one, and then return its value. If there is an
# error, -1 is returned, and the caller should check
# PyErr_Occurred() to find out whether there was an error, or
# whether the value just happened to be -1.
long PyInt_AS_LONG(object io)
# Return the value of the object io. No error checking is performed.
unsigned long PyInt_AsUnsignedLongMask(object io) except? -1
# Will first attempt to cast the object to a PyIntObject or
# PyLongObject, if it is not already one, and then return its
# value as unsigned long. This function does not check for
# overflow.
PY_LONG_LONG PyInt_AsUnsignedLongLongMask(object io) except? -1
# Will first attempt to cast the object to a PyIntObject or
# PyLongObject, if it is not already one, and then return its
# value as unsigned long long, without checking for overflow.
Py_ssize_t PyInt_AsSsize_t(object io) except? -1
# Will first attempt to cast the object to a PyIntObject or
# PyLongObject, if it is not already one, and then return its
# value as Py_ssize_t.
long PyInt_GetMax()
# Return the system's idea of the largest integer it can handle
# (LONG_MAX, as defined in the system header files).
int PyInt_ClearFreeList()
# Clear the integer free list. Return the number of items that could not be freed.
# New in version 2.6.

View file

@ -0,0 +1,36 @@
cdef extern from "Python.h":
############################################################################
# 6.5 Iterator Protocol
############################################################################
bint PyIter_Check(object o)
# Return true if the object o supports the iterator protocol.
object PyIter_Next(object o)
# Return value: New reference.
# Return the next value from the iteration o. If the object is an
# iterator, this retrieves the next value from the iteration, and
# returns NULL with no exception set if there are no remaining
# items. If the object is not an iterator, TypeError is raised, or
# if there is an error in retrieving the item, returns NULL and
# passes along the exception.
# To write a loop which iterates over an iterator, the C code should look something like this:
# PyObject *iterator = PyObject_GetIter(obj);
# PyObject *item;
# if (iterator == NULL) {
# /* propagate error */
# }
# while (item = PyIter_Next(iterator)) {
# /* do something with item */
# ...
# /* release reference when done */
# Py_DECREF(item);
# }
# Py_DECREF(iterator);
# if (PyErr_Occurred()) {
# /* propagate error */
# }
# else {
# /* continue doing useful work */
# }

View file

@ -0,0 +1,24 @@
cdef extern from "Python.h":
###########################################################################
# Iterator Objects
###########################################################################
bint PySeqIter_Check(object op)
# Return true if the type of op is PySeqIter_Type.
object PySeqIter_New(object seq)
# Return value: New reference.
# Return an iterator that works with a general sequence object, seq. The
# iteration ends when the sequence raises IndexError for the subscripting
# operation.
bint PyCallIter_Check(object op)
# Return true if the type of op is PyCallIter_Type.
object PyCallIter_New(object callable, object sentinel)
# Return value: New reference.
# Return a new iterator. The first parameter, callable, can be any Python
# callable object that can be called with no parameters; each call to it
# should return the next item in the iteration. When callable returns a
# value equal to sentinel, the iteration will be terminated.

View file

@ -0,0 +1,92 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# Lists
############################################################################
list PyList_New(Py_ssize_t len)
# Return a new list of length len on success, or NULL on failure.
#
# Note: If length is greater than zero, the returned list object's
# items are set to NULL. Thus you cannot use abstract API
# functions such as PySequence_SetItem() or expose the object to
# Python code before setting all items to a real object with
# PyList_SetItem().
bint PyList_Check(object p)
# Return true if p is a list object or an instance of a subtype of
# the list type.
bint PyList_CheckExact(object p)
# Return true if p is a list object, but not an instance of a
# subtype of the list type.
Py_ssize_t PyList_Size(object list) except -1
# Return the length of the list object in list; this is equivalent
# to "len(list)" on a list object.
Py_ssize_t PyList_GET_SIZE(object list)
# Macro form of PyList_Size() without error checking.
PyObject* PyList_GetItem(object list, Py_ssize_t index) except NULL
# Return value: Borrowed reference.
# Return the object at position pos in the list pointed to by
# p. The position must be positive, indexing from the end of the
# list is not supported. If pos is out of bounds, return NULL and
# set an IndexError exception.
PyObject* PyList_GET_ITEM(object list, Py_ssize_t i)
# Return value: Borrowed reference.
# Macro form of PyList_GetItem() without error checking.
int PyList_SetItem(object list, Py_ssize_t index, object item) except -1
# Set the item at index index in list to item. Return 0 on success
# or -1 on failure. Note: This function ``steals'' a reference to
# item and discards a reference to an item already in the list at
# the affected position.
void PyList_SET_ITEM(object list, Py_ssize_t i, object o)
# Macro form of PyList_SetItem() without error checking. This is
# normally only used to fill in new lists where there is no
# previous content. Note: This function ``steals'' a reference to
# item, and, unlike PyList_SetItem(), does not discard a reference
# to any item that it being replaced; any reference in list at
# position i will be *leaked*.
int PyList_Insert(object list, Py_ssize_t index, object item) except -1
# Insert the item item into list list in front of index
# index. Return 0 if successful; return -1 and set an exception if
# unsuccessful. Analogous to list.insert(index, item).
int PyList_Append(object list, object item) except -1
# Append the object item at the end of list list. Return 0 if
# successful; return -1 and set an exception if
# unsuccessful. Analogous to list.append(item).
list PyList_GetSlice(object list, Py_ssize_t low, Py_ssize_t high)
# Return value: New reference.
# Return a list of the objects in list containing the objects
# between low and high. Return NULL and set an exception if
# unsuccessful. Analogous to list[low:high].
int PyList_SetSlice(object list, Py_ssize_t low, Py_ssize_t high, object itemlist) except -1
# Set the slice of list between low and high to the contents of
# itemlist. Analogous to list[low:high] = itemlist. The itemlist
# may be NULL, indicating the assignment of an empty list (slice
# deletion). Return 0 on success, -1 on failure.
int PyList_Sort(object list) except -1
# Sort the items of list in place. Return 0 on success, -1 on
# failure. This is equivalent to "list.sort()".
int PyList_Reverse(object list) except -1
# Reverse the items of list in place. Return 0 on success, -1 on
# failure. This is the equivalent of "list.reverse()".
tuple PyList_AsTuple(object list)
# Return value: New reference.
# Return a new tuple object containing the contents of list;
# equivalent to "tuple(list)".

View file

@ -0,0 +1,149 @@
cdef extern from "Python.h":
ctypedef long long PY_LONG_LONG
ctypedef unsigned long long uPY_LONG_LONG "unsigned PY_LONG_LONG"
############################################################################
# 7.2.3 Long Integer Objects
############################################################################
# PyLongObject
#
# This subtype of PyObject represents a Python long integer object.
# PyTypeObject PyLong_Type
#
# This instance of PyTypeObject represents the Python long integer
# type. This is the same object as long and types.LongType.
bint PyLong_Check(object p)
# Return true if its argument is a PyLongObject or a subtype of PyLongObject.
bint PyLong_CheckExact(object p)
# Return true if its argument is a PyLongObject, but not a subtype of PyLongObject.
object PyLong_FromLong(long v)
# Return value: New reference.
# Return a new PyLongObject object from v, or NULL on failure.
object PyLong_FromUnsignedLong(unsigned long v)
# Return value: New reference.
# Return a new PyLongObject object from a C unsigned long, or NULL on failure.
object PyLong_FromSsize_t(Py_ssize_t v)
# Return value: New reference.
# Return a new PyLongObject object from a C Py_ssize_t, or NULL on failure.)
object PyLong_FromSize_t(size_t v)
# Return value: New reference.
# Return a new PyLongObject object from a C size_t, or NULL on failure.
object PyLong_FromLongLong(PY_LONG_LONG v)
# Return value: New reference.
# Return a new PyLongObject object from a C long long, or NULL on failure.
object PyLong_FromUnsignedLongLong(uPY_LONG_LONG v)
# Return value: New reference.
# Return a new PyLongObject object from a C unsigned long long, or NULL on failure.
object PyLong_FromDouble(double v)
# Return value: New reference.
# Return a new PyLongObject object from the integer part of v, or NULL on failure.
object PyLong_FromString(char *str, char **pend, int base)
# Return value: New reference.
# Return a new PyLongObject based on the string value in str,
# which is interpreted according to the radix in base. If pend is
# non-NULL, *pend will point to the first character in str which
# follows the representation of the number. If base is 0, the
# radix will be determined based on the leading characters of str:
# if str starts with '0x' or '0X', radix 16 will be used; if str
# starts with '0', radix 8 will be used; otherwise radix 10 will
# be used. If base is not 0, it must be between 2 and 36,
# inclusive. Leading spaces are ignored. If there are no digits,
# ValueError will be raised.
object PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base)
# Return value: New reference.
# Convert a sequence of Unicode digits to a Python long integer
# value. The first parameter, u, points to the first character of
# the Unicode string, length gives the number of characters, and
# base is the radix for the conversion. The radix must be in the
# range [2, 36]; if it is out of range, ValueError will be
# raised.
# object PyLong_FromUnicodeObject(object u, int base)
# Convert a sequence of Unicode digits in the string u to a Python integer
# value. The Unicode string is first encoded to a byte string using
# PyUnicode_EncodeDecimal() and then converted using PyLong_FromString().
# New in version 3.3.
object PyLong_FromVoidPtr(void *p)
# Return value: New reference.
# Create a Python integer or long integer from the pointer p. The
# pointer value can be retrieved from the resulting value using
# PyLong_AsVoidPtr(). If the integer is larger than LONG_MAX, a
# positive long integer is returned.
long PyLong_AsLong(object pylong) except? -1
# Return a C long representation of the contents of pylong. If
# pylong is greater than LONG_MAX, an OverflowError is raised.
# long PyLong_AsLongAndOverflow(object pylong, int *overflow) except? -1
# Return a C long representation of the contents of pylong. If pylong is
# greater than LONG_MAX or less than LONG_MIN, set *overflow to 1 or -1,
# respectively, and return -1; otherwise, set *overflow to 0. If any other
# exception occurs (for example a TypeError or MemoryError), then -1 will
# be returned and *overflow will be 0.
# New in version 2.7.
# PY_LONG_LONG PyLong_AsLongLongAndOverflow(object pylong, int *overflow) except? -1
# Return a C long long representation of the contents of pylong. If pylong
# is greater than PY_LLONG_MAX or less than PY_LLONG_MIN, set *overflow to
# 1 or -1, respectively, and return -1; otherwise, set *overflow to 0. If
# any other exception occurs (for example a TypeError or MemoryError), then
# -1 will be returned and *overflow will be 0.
# New in version 2.7.
Py_ssize_t PyLong_AsSsize_t(object pylong) except? -1
# Return a C Py_ssize_t representation of the contents of pylong. If pylong
# is greater than PY_SSIZE_T_MAX, an OverflowError is raised and -1 will be
# returned.
unsigned long PyLong_AsUnsignedLong(object pylong) except? -1
# Return a C unsigned long representation of the contents of
# pylong. If pylong is greater than ULONG_MAX, an OverflowError is
# raised.
PY_LONG_LONG PyLong_AsLongLong(object pylong) except? -1
# Return a C long long from a Python long integer. If pylong
# cannot be represented as a long long, an OverflowError will be
# raised.
uPY_LONG_LONG PyLong_AsUnsignedLongLong(object pylong) except? -1
#unsigned PY_LONG_LONG PyLong_AsUnsignedLongLong(object pylong)
# Return a C unsigned long long from a Python long integer. If
# pylong cannot be represented as an unsigned long long, an
# OverflowError will be raised if the value is positive, or a
# TypeError will be raised if the value is negative.
unsigned long PyLong_AsUnsignedLongMask(object io) except? -1
# Return a C unsigned long from a Python long integer, without
# checking for overflow.
uPY_LONG_LONG PyLong_AsUnsignedLongLongMask(object io) except? -1
#unsigned PY_LONG_LONG PyLong_AsUnsignedLongLongMask(object io)
# Return a C unsigned long long from a Python long integer,
# without checking for overflow.
double PyLong_AsDouble(object pylong) except? -1.0
# Return a C double representation of the contents of pylong. If
# pylong cannot be approximately represented as a double, an
# OverflowError exception is raised and -1.0 will be returned.
void* PyLong_AsVoidPtr(object pylong) except? NULL
# Convert a Python integer or long integer pylong to a C void
# pointer. If pylong cannot be converted, an OverflowError will be
# raised. This is only assured to produce a usable void pointer
# for values created with PyLong_FromVoidPtr(). For values outside
# 0..LONG_MAX, both signed and unsigned integers are accepted.

View file

@ -0,0 +1,19 @@
# Internals of the "long" type (Python 2) or "int" type (Python 3).
cdef extern from "Python.h":
"""
#if PY_MAJOR_VERSION < 3
#include "longintrepr.h"
#endif
"""
ctypedef unsigned int digit
ctypedef int sdigit # Python >= 2.7 only
ctypedef class __builtin__.py_long [object PyLongObject]:
cdef digit* ob_digit
cdef py_long _PyLong_New(Py_ssize_t s)
cdef long PyLong_SHIFT
cdef digit PyLong_BASE
cdef digit PyLong_MASK

View file

@ -0,0 +1,64 @@
cdef extern from "Python.h":
############################################################################
# 6.4 Mapping Protocol
############################################################################
bint PyMapping_Check(object o)
# Return 1 if the object provides mapping protocol, and 0
# otherwise. This function always succeeds.
Py_ssize_t PyMapping_Length(object o) except -1
# Returns the number of keys in object o on success, and -1 on
# failure. For objects that do not provide mapping protocol, this
# is equivalent to the Python expression "len(o)".
int PyMapping_DelItemString(object o, char *key) except -1
# Remove the mapping for object key from the object o. Return -1
# on failure. This is equivalent to the Python statement "del
# o[key]".
int PyMapping_DelItem(object o, object key) except -1
# Remove the mapping for object key from the object o. Return -1
# on failure. This is equivalent to the Python statement "del
# o[key]".
bint PyMapping_HasKeyString(object o, char *key)
# On success, return 1 if the mapping object has the key key and 0
# otherwise. This is equivalent to the Python expression
# "o.has_key(key)". This function always succeeds.
bint PyMapping_HasKey(object o, object key)
# Return 1 if the mapping object has the key key and 0
# otherwise. This is equivalent to the Python expression
# "o.has_key(key)". This function always succeeds.
object PyMapping_Keys(object o)
# Return value: New reference.
# On success, return a list of the keys in object o. On failure,
# return NULL. This is equivalent to the Python expression
# "o.keys()".
object PyMapping_Values(object o)
# Return value: New reference.
# On success, return a list of the values in object o. On failure,
# return NULL. This is equivalent to the Python expression
# "o.values()".
object PyMapping_Items(object o)
# Return value: New reference.
# On success, return a list of the items in object o, where each
# item is a tuple containing a key-value pair. On failure, return
# NULL. This is equivalent to the Python expression "o.items()".
object PyMapping_GetItemString(object o, char *key)
# Return value: New reference.
# Return element of o corresponding to the object key or NULL on
# failure. This is the equivalent of the Python expression
# "o[key]".
int PyMapping_SetItemString(object o, char *key, object v) except -1
# Map the object key to the value v in object o. Returns -1 on
# failure. This is the equivalent of the Python statement "o[key]
# = v".

View file

@ -0,0 +1,111 @@
cdef extern from "Python.h":
#####################################################################
# 9.2 Memory Interface
#####################################################################
# You are definitely *supposed* to use these: "In most situations,
# however, it is recommended to allocate memory from the Python
# heap specifically because the latter is under control of the
# Python memory manager. For example, this is required when the
# interpreter is extended with new object types written in
# C. Another reason for using the Python heap is the desire to
# inform the Python memory manager about the memory needs of the
# extension module. Even when the requested memory is used
# exclusively for internal, highly-specific purposes, delegating
# all memory requests to the Python memory manager causes the
# interpreter to have a more accurate image of its memory
# footprint as a whole. Consequently, under certain circumstances,
# the Python memory manager may or may not trigger appropriate
# actions, like garbage collection, memory compaction or other
# preventive procedures. Note that by using the C library
# allocator as shown in the previous example, the allocated memory
# for the I/O buffer escapes completely the Python memory
# manager."
# The following function sets, modeled after the ANSI C standard,
# but specifying behavior when requesting zero bytes, are
# available for allocating and releasing memory from the Python
# heap:
void* PyMem_RawMalloc(size_t n) nogil
void* PyMem_Malloc(size_t n)
# Allocates n bytes and returns a pointer of type void* to the
# allocated memory, or NULL if the request fails. Requesting zero
# bytes returns a distinct non-NULL pointer if possible, as if
# PyMem_Malloc(1) had been called instead. The memory will not
# have been initialized in any way.
void* PyMem_RawRealloc(void *p, size_t n) nogil
void* PyMem_Realloc(void *p, size_t n)
# Resizes the memory block pointed to by p to n bytes. The
# contents will be unchanged to the minimum of the old and the new
# sizes. If p is NULL, the call is equivalent to PyMem_Malloc(n);
# else if n is equal to zero, the memory block is resized but is
# not freed, and the returned pointer is non-NULL. Unless p is
# NULL, it must have been returned by a previous call to
# PyMem_Malloc() or PyMem_Realloc().
void PyMem_RawFree(void *p) nogil
void PyMem_Free(void *p)
# Frees the memory block pointed to by p, which must have been
# returned by a previous call to PyMem_Malloc() or
# PyMem_Realloc(). Otherwise, or if PyMem_Free(p) has been called
# before, undefined behavior occurs. If p is NULL, no operation is
# performed.
# The following type-oriented macros are provided for
# convenience. Note that TYPE refers to any C type.
# TYPE* PyMem_New(TYPE, size_t n)
# Same as PyMem_Malloc(), but allocates (n * sizeof(TYPE)) bytes
# of memory. Returns a pointer cast to TYPE*. The memory will not
# have been initialized in any way.
# TYPE* PyMem_Resize(void *p, TYPE, size_t n)
# Same as PyMem_Realloc(), but the memory block is resized to (n *
# sizeof(TYPE)) bytes. Returns a pointer cast to TYPE*.
void PyMem_Del(void *p)
# Same as PyMem_Free().
# In addition, the following macro sets are provided for calling
# the Python memory allocator directly, without involving the C
# API functions listed above. However, note that their use does
# not preserve binary compatibility across Python versions and is
# therefore deprecated in extension modules.
# PyMem_MALLOC(), PyMem_REALLOC(), PyMem_FREE().
# PyMem_NEW(), PyMem_RESIZE(), PyMem_DEL().
#####################################################################
# Raw object memory interface
#####################################################################
# Functions to call the same malloc/realloc/free as used by Python's
# object allocator. If WITH_PYMALLOC is enabled, these may differ from
# the platform malloc/realloc/free. The Python object allocator is
# designed for fast, cache-conscious allocation of many "small" objects,
# and with low hidden memory overhead.
#
# PyObject_Malloc(0) returns a unique non-NULL pointer if possible.
#
# PyObject_Realloc(NULL, n) acts like PyObject_Malloc(n).
# PyObject_Realloc(p != NULL, 0) does not return NULL, or free the memory
# at p.
#
# Returned pointers must be checked for NULL explicitly; no action is
# performed on failure other than to return NULL (no warning it printed, no
# exception is set, etc).
#
# For allocating objects, use PyObject_{New, NewVar} instead whenever
# possible. The PyObject_{Malloc, Realloc, Free} family is exposed
# so that you can exploit Python's small-block allocator for non-object
# uses. If you must use these routines to allocate object memory, make sure
# the object gets initialized via PyObject_{Init, InitVar} after obtaining
# the raw memory.
void* PyObject_Malloc(size_t size)
void* PyObject_Calloc(size_t nelem, size_t elsize)
void* PyObject_Realloc(void *ptr, size_t new_size)
void PyObject_Free(void *ptr)

View file

@ -0,0 +1,50 @@
cdef extern from "Python.h":
###########################################################################
# MemoryView Objects
###########################################################################
# A memoryview object exposes the C level buffer interface as a Python
# object which can then be passed around like any other object
object PyMemoryView_FromObject(object obj)
# Return value: New reference.
# Create a memoryview object from an object that provides the buffer
# interface. If obj supports writable buffer exports, the memoryview object
# will be read/write, otherwise it may be either read-only or read/write at
# the discretion of the exporter.
object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
# Return value: New reference.
# Create a memoryview object using mem as the underlying buffer. flags can
# be one of PyBUF_READ or PyBUF_WRITE.
# New in version 3.3.
object PyMemoryView_FromBuffer(Py_buffer *view)
# Return value: New reference.
# Create a memoryview object wrapping the given buffer structure view. For
# simple byte buffers, PyMemoryView_FromMemory() is the preferred function.
object PyMemoryView_GetContiguous(object obj,
int buffertype,
char order)
# Return value: New reference.
# Create a memoryview object to a contiguous chunk of memory (in either C
# or Fortran order) from an object that defines the buffer interface. If
# memory is contiguous, the memoryview object points to the original
# memory. Otherwise, a copy is made and the memoryview points to a new
# bytes object.
bint PyMemoryView_Check(object obj)
# Return true if the object obj is a memoryview object. It is not currently
# allowed to create subclasses of memoryview.
Py_buffer *PyMemoryView_GET_BUFFER(object mview)
# Return a pointer to the memoryviews private copy of the exporters
# buffer. mview must be a memoryview instance; this macro doesnt check its
# type, you must do it yourself or you will risk crashes.
Py_buffer *PyMemoryView_GET_BASE(object mview)
# Return either a pointer to the exporting object that the memoryview is
# based on or NULL if the memoryview has been created by one of the
# functions PyMemoryView_FromMemory() or PyMemoryView_FromBuffer(). mview
# must be a memoryview instance.

View file

@ -0,0 +1,49 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# 7.5.4 Method Objects
############################################################################
# There are some useful functions that are useful for working with method objects.
# PyTypeObject PyMethod_Type
# This instance of PyTypeObject represents the Python method type. This is exposed to Python programs as types.MethodType.
bint PyMethod_Check(object o)
# Return true if o is a method object (has type
# PyMethod_Type). The parameter must not be NULL.
object PyMethod_New(object func, object self, object cls)
# Return value: New reference.
# Return a new method object, with func being any callable object;
# this is the function that will be called when the method is
# called. If this method should be bound to an instance, self
# should be the instance and class should be the class of self,
# otherwise self should be NULL and class should be the class
# which provides the unbound method..
PyObject* PyMethod_Class(object meth) except NULL
# Return value: Borrowed reference.
# Return the class object from which the method meth was created;
# if this was created from an instance, it will be the class of
# the instance.
PyObject* PyMethod_GET_CLASS(object meth)
# Return value: Borrowed reference.
# Macro version of PyMethod_Class() which avoids error checking.
PyObject* PyMethod_Function(object meth) except NULL
# Return value: Borrowed reference.
# Return the function object associated with the method meth.
PyObject* PyMethod_GET_FUNCTION(object meth)
# Return value: Borrowed reference.
# Macro version of PyMethod_Function() which avoids error checking.
PyObject* PyMethod_Self(object meth) except? NULL
# Return value: Borrowed reference.
# Return the instance associated with the method meth if it is bound, otherwise return NULL.
PyObject* PyMethod_GET_SELF(object meth)
# Return value: Borrowed reference.
# Macro version of PyMethod_Self() which avoids error checking.

View file

@ -0,0 +1,188 @@
from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct _inittab
#####################################################################
# 5.3 Importing Modules
#####################################################################
object PyImport_ImportModule(const char *name)
# Return value: New reference.
# This is a simplified interface to PyImport_ImportModuleEx()
# below, leaving the globals and locals arguments set to
# NULL. When the name argument contains a dot (when it specifies a
# submodule of a package), the fromlist argument is set to the
# list ['*'] so that the return value is the named module rather
# than the top-level package containing it as would otherwise be
# the case. (Unfortunately, this has an additional side effect
# when name in fact specifies a subpackage instead of a submodule:
# the submodules specified in the package's __all__ variable are
# loaded.) Return a new reference to the imported module, or NULL
# with an exception set on failure.
object PyImport_ImportModuleEx(const char *name, object globals, object locals, object fromlist)
# Return value: New reference.
# Import a module. This is best described by referring to the
# built-in Python function __import__(), as the standard
# __import__() function calls this function directly.
# The return value is a new reference to the imported module or
# top-level package, or NULL with an exception set on failure
# (before Python 2.4, the module may still be created in this
# case). Like for __import__(), the return value when a submodule
# of a package was requested is normally the top-level package,
# unless a non-empty fromlist was given. Changed in version 2.4:
# failing imports remove incomplete module objects.
object PyImport_ImportModuleLevel(char *name, object globals, object locals, object fromlist, int level)
# Return value: New reference.
# Import a module. This is best described by referring to the
# built-in Python function __import__(), as the standard
# __import__() function calls this function directly.
# The return value is a new reference to the imported module or
# top-level package, or NULL with an exception set on failure. Like
# for __import__(), the return value when a submodule of a package
# was requested is normally the top-level package, unless a
# non-empty fromlist was given.
object PyImport_Import(object name)
# Return value: New reference.
# This is a higher-level interface that calls the current ``import
# hook function''. It invokes the __import__() function from the
# __builtins__ of the current globals. This means that the import
# is done using whatever import hooks are installed in the current
# environment, e.g. by rexec or ihooks.
object PyImport_ReloadModule(object m)
# Return value: New reference.
# Reload a module. This is best described by referring to the
# built-in Python function reload(), as the standard reload()
# function calls this function directly. Return a new reference to
# the reloaded module, or NULL with an exception set on failure
# (the module still exists in this case).
PyObject* PyImport_AddModule(const char *name) except NULL
# Return value: Borrowed reference.
# Return the module object corresponding to a module name. The
# name argument may be of the form package.module. First check the
# modules dictionary if there's one there, and if not, create a
# new one and insert it in the modules dictionary. Return NULL
# with an exception set on failure. Note: This function does not
# load or import the module; if the module wasn't already loaded,
# you will get an empty module object. Use PyImport_ImportModule()
# or one of its variants to import a module. Package structures
# implied by a dotted name for name are not created if not already
# present.
object PyImport_ExecCodeModule(char *name, object co)
# Return value: New reference.
# Given a module name (possibly of the form package.module) and a
# code object read from a Python bytecode file or obtained from
# the built-in function compile(), load the module. Return a new
# reference to the module object, or NULL with an exception set if
# an error occurred. Name is removed from sys.modules in error
# cases, and even if name was already in sys.modules on entry to
# PyImport_ExecCodeModule(). Leaving incompletely initialized
# modules in sys.modules is dangerous, as imports of such modules
# have no way to know that the module object is an unknown (and
# probably damaged with respect to the module author's intents)
# state.
# This function will reload the module if it was already
# imported. See PyImport_ReloadModule() for the intended way to
# reload a module.
# If name points to a dotted name of the form package.module, any
# package structures not already created will still not be
# created.
long PyImport_GetMagicNumber()
# Return the magic number for Python bytecode files (a.k.a. .pyc
# and .pyo files). The magic number should be present in the first
# four bytes of the bytecode file, in little-endian byte order.
PyObject* PyImport_GetModuleDict() except NULL
# Return value: Borrowed reference.
# Return the dictionary used for the module administration
# (a.k.a. sys.modules). Note that this is a per-interpreter
# variable.
int PyImport_ImportFrozenModule(char *name) except -1
# Load a frozen module named name. Return 1 for success, 0 if the
# module is not found, and -1 with an exception set if the
# initialization failed. To access the imported module on a
# successful load, use PyImport_ImportModule(). (Note the misnomer
# -- this function would reload the module if it was already
# imported.)
int PyImport_ExtendInittab(_inittab *newtab) except -1
# Add a collection of modules to the table of built-in
# modules. The newtab array must end with a sentinel entry which
# contains NULL for the name field; failure to provide the
# sentinel value can result in a memory fault. Returns 0 on
# success or -1 if insufficient memory could be allocated to
# extend the internal table. In the event of failure, no modules
# are added to the internal table. This should be called before
# Py_Initialize().
#####################################################################
# 7.5.5 Module Objects
#####################################################################
# PyTypeObject PyModule_Type
#
# This instance of PyTypeObject represents the Python module
# type. This is exposed to Python programs as types.ModuleType.
bint PyModule_Check(object p)
# Return true if p is a module object, or a subtype of a module
# object.
bint PyModule_CheckExact(object p)
# Return true if p is a module object, but not a subtype of PyModule_Type.
object PyModule_New(const char *name)
# Return value: New reference.
# Return a new module object with the __name__ attribute set to
# name. Only the module's __doc__ and __name__ attributes are
# filled in; the caller is responsible for providing a __file__
# attribute.
PyObject* PyModule_GetDict(object module) except NULL
# Return value: Borrowed reference.
# Return the dictionary object that implements module's namespace;
# this object is the same as the __dict__ attribute of the module
# object. This function never fails. It is recommended extensions
# use other PyModule_*() and PyObject_*() functions rather than
# directly manipulate a module's __dict__.
char* PyModule_GetName(object module) except NULL
# Return module's __name__ value. If the module does not provide
# one, or if it is not a string, SystemError is raised and NULL is
# returned.
char* PyModule_GetFilename(object module) except NULL
# Return the name of the file from which module was loaded using
# module's __file__ attribute. If this is not defined, or if it is
# not a string, raise SystemError and return NULL.
int PyModule_AddObject(object module, const char *name, object value) except -1
# Add an object to module as name. This is a convenience function
# which can be used from the module's initialization
# function. This steals a reference to value. Return -1 on error,
# 0 on success.
int PyModule_AddIntConstant(object module, const char *name, long value) except -1
# Add an integer constant to module as name. This convenience
# function can be used from the module's initialization
# function. Return -1 on error, 0 on success.
int PyModule_AddStringConstant(object module, const char *name, const char *value) except -1
# Add a string constant to module as name. This convenience
# function can be used from the module's initialization
# function. The string value must be null-terminated. Return -1 on
# error, 0 on success.

View file

@ -0,0 +1,265 @@
from .object cimport PyObject
cdef extern from "Python.h":
#####################################################################
# 6.2 Number Protocol
#####################################################################
bint PyNumber_Check(object o)
# Returns 1 if the object o provides numeric protocols, and false
# otherwise. This function always succeeds.
object PyNumber_Add(object o1, object o2)
# Return value: New reference.
# Returns the result of adding o1 and o2, or NULL on failure. This
# is the equivalent of the Python expression "o1 + o2".
object PyNumber_Subtract(object o1, object o2)
# Return value: New reference.
# Returns the result of subtracting o2 from o1, or NULL on
# failure. This is the equivalent of the Python expression "o1 -
# o2".
object PyNumber_Multiply(object o1, object o2)
# Return value: New reference.
# Returns the result of multiplying o1 and o2, or NULL on
# failure. This is the equivalent of the Python expression "o1 *
# o2".
object PyNumber_MatrixMultiply(object o1, object o2)
# Return value: New reference.
# Returns the result of matrix multiplication on o1 and o2, or
# NULL on failure. This is the equivalent of the Python
# expression "o1 @ o2".
# New in version 3.5.
object PyNumber_Divide(object o1, object o2)
# Return value: New reference.
# Returns the result of dividing o1 by o2, or NULL on
# failure. This is the equivalent of the Python expression "o1 /
# o2".
object PyNumber_FloorDivide(object o1, object o2)
# Return value: New reference.
# Return the floor of o1 divided by o2, or NULL on failure. This
# is equivalent to the ``classic'' division of integers.
object PyNumber_TrueDivide(object o1, object o2)
# Return value: New reference.
# Return a reasonable approximation for the mathematical value of
# o1 divided by o2, or NULL on failure. The return value is
# ``approximate'' because binary floating point numbers are
# approximate; it is not possible to represent all real numbers in
# base two. This function can return a floating point value when
# passed two integers.
object PyNumber_Remainder(object o1, object o2)
# Return value: New reference.
# Returns the remainder of dividing o1 by o2, or NULL on
# failure. This is the equivalent of the Python expression "o1 %
# o2".
object PyNumber_Divmod(object o1, object o2)
# Return value: New reference.
# See the built-in function divmod(). Returns NULL on
# failure. This is the equivalent of the Python expression
# "divmod(o1, o2)".
object PyNumber_Power(object o1, object o2, object o3)
# Return value: New reference.
# See the built-in function pow(). Returns NULL on failure. This
# is the equivalent of the Python expression "pow(o1, o2, o3)",
# where o3 is optional. If o3 is to be ignored, pass Py_None in
# its place (passing NULL for o3 would cause an illegal memory
# access).
object PyNumber_Negative(object o)
# Return value: New reference.
# Returns the negation of o on success, or NULL on failure. This
# is the equivalent of the Python expression "-o".
object PyNumber_Positive(object o)
# Return value: New reference.
# Returns o on success, or NULL on failure. This is the equivalent
# of the Python expression "+o".
object PyNumber_Absolute(object o)
# Return value: New reference.
# Returns the absolute value of o, or NULL on failure. This is the
# equivalent of the Python expression "abs(o)".
object PyNumber_Invert(object o)
# Return value: New reference.
# Returns the bitwise negation of o on success, or NULL on
# failure. This is the equivalent of the Python expression "~o".
object PyNumber_Lshift(object o1, object o2)
# Return value: New reference.
# Returns the result of left shifting o1 by o2 on success, or NULL
# on failure. This is the equivalent of the Python expression "o1
# << o2".
object PyNumber_Rshift(object o1, object o2)
# Return value: New reference.
# Returns the result of right shifting o1 by o2 on success, or
# NULL on failure. This is the equivalent of the Python expression
# "o1 >> o2".
object PyNumber_And(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise and'' of o1 and o2 on success and NULL on
# failure. This is the equivalent of the Python expression "o1 &
# o2".
object PyNumber_Xor(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise exclusive or'' of o1 by o2 on success, or
# NULL on failure. This is the equivalent of the Python expression
# "o1 ^ o2".
object PyNumber_Or(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise or'' of o1 and o2 on success, or NULL on failure. This is the equivalent of the Python expression "o1 | o2".
object PyNumber_InPlaceAdd(object o1, object o2)
# Return value: New reference.
# Returns the result of adding o1 and o2, or NULL on failure. The
# operation is done in-place when o1 supports it. This is the
# equivalent of the Python statement "o1 += o2".
object PyNumber_InPlaceSubtract(object o1, object o2)
# Return value: New reference.
# Returns the result of subtracting o2 from o1, or NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 -= o2".
object PyNumber_InPlaceMultiply(object o1, object o2)
# Return value: New reference.
# Returns the result of multiplying o1 and o2, or NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 *= o2".
object PyNumber_InPlaceMatrixMultiply(object o1, object o2)
# Return value: New reference.
# Returns the result of matrix multiplication on o1 and o2, or
# NULL on failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 @= o2".
# New in version 3.5.
object PyNumber_InPlaceDivide(object o1, object o2)
# Return value: New reference.
# Returns the result of dividing o1 by o2, or NULL on failure. The
# operation is done in-place when o1 supports it. This is the
# equivalent of the Python statement "o1 /= o2".
object PyNumber_InPlaceFloorDivide(object o1, object o2)
# Return value: New reference.
# Returns the mathematical floor of dividing o1 by o2, or NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 //=
# o2".
object PyNumber_InPlaceTrueDivide(object o1, object o2)
# Return value: New reference.
# Return a reasonable approximation for the mathematical value of
# o1 divided by o2, or NULL on failure. The return value is
# ``approximate'' because binary floating point numbers are
# approximate; it is not possible to represent all real numbers in
# base two. This function can return a floating point value when
# passed two integers. The operation is done in-place when o1
# supports it.
object PyNumber_InPlaceRemainder(object o1, object o2)
# Return value: New reference.
# Returns the remainder of dividing o1 by o2, or NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 %= o2".
object PyNumber_InPlacePower(object o1, object o2, object o3)
# Return value: New reference.
# See the built-in function pow(). Returns NULL on failure. The
# operation is done in-place when o1 supports it. This is the
# equivalent of the Python statement "o1 **= o2" when o3 is
# Py_None, or an in-place variant of "pow(o1, o2, o3)"
# otherwise. If o3 is to be ignored, pass Py_None in its place
# (passing NULL for o3 would cause an illegal memory access).
object PyNumber_InPlaceLshift(object o1, object o2)
# Return value: New reference.
# Returns the result of left shifting o1 by o2 on success, or NULL
# on failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 <<= o2".
object PyNumber_InPlaceRshift(object o1, object o2)
# Return value: New reference.
# Returns the result of right shifting o1 by o2 on success, or
# NULL on failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 >>= o2".
object PyNumber_InPlaceAnd(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise and'' of o1 and o2 on success and NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 &= o2".
object PyNumber_InPlaceXor(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise exclusive or'' of o1 by o2 on success, or
# NULL on failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 ^= o2".
object PyNumber_InPlaceOr(object o1, object o2)
# Return value: New reference.
# Returns the ``bitwise or'' of o1 and o2 on success, or NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python statement "o1 |= o2".
int PyNumber_Coerce(PyObject **p1, PyObject **p2) except -1
# This function takes the addresses of two variables of type
# PyObject*. If the objects pointed to by *p1 and *p2 have the
# same type, increment their reference count and return 0
# (success). If the objects can be converted to a common numeric
# type, replace *p1 and *p2 by their converted value (with 'new'
# reference counts), and return 0. If no conversion is possible,
# or if some other error occurs, return -1 (failure) and don't
# increment the reference counts. The call PyNumber_Coerce(&o1,
# &o2) is equivalent to the Python statement "o1, o2 = coerce(o1,
# o2)".
object PyNumber_Int(object o)
# Return value: New reference.
# Returns the o converted to an integer object on success, or NULL
# on failure. If the argument is outside the integer range a long
# object will be returned instead. This is the equivalent of the
# Python expression "int(o)".
object PyNumber_Long(object o)
# Return value: New reference.
# Returns the o converted to a long integer object on success, or
# NULL on failure. This is the equivalent of the Python expression
# "long(o)".
object PyNumber_Float(object o)
# Return value: New reference.
# Returns the o converted to a float object on success, or NULL on
# failure. This is the equivalent of the Python expression
# "float(o)".
object PyNumber_Index(object o)
# Returns the o converted to a Python int or long on success or
# NULL with a TypeError exception raised on failure.
Py_ssize_t PyNumber_AsSsize_t(object o, object exc) except? -1
# Returns o converted to a Py_ssize_t value if o can be
# interpreted as an integer. If o can be converted to a Python int
# or long but the attempt to convert to a Py_ssize_t value would
# raise an OverflowError, then the exc argument is the type of
# exception that will be raised (usually IndexError or
# OverflowError). If exc is NULL, then the exception is cleared
# and the value is clipped to PY_SSIZE_T_MIN for a negative
# integer or PY_SSIZE_T_MAX for a positive integer.
bint PyIndex_Check(object)
# Returns True if o is an index integer (has the nb_index slot of
# the tp_as_number structure filled in).

View file

@ -0,0 +1,399 @@
from libc.stdio cimport FILE
cimport cpython.type
cdef extern from "Python.h":
ctypedef struct PyObject # forward declaration
ctypedef object (*newfunc)(cpython.type.type, object, object) # (type, args, kwargs)
ctypedef object (*unaryfunc)(object)
ctypedef object (*binaryfunc)(object, object)
ctypedef object (*ternaryfunc)(object, object, object)
ctypedef int (*inquiry)(object) except -1
ctypedef Py_ssize_t (*lenfunc)(object) except -1
ctypedef object (*ssizeargfunc)(object, Py_ssize_t)
ctypedef object (*ssizessizeargfunc)(object, Py_ssize_t, Py_ssize_t)
ctypedef int (*ssizeobjargproc)(object, Py_ssize_t, object) except -1
ctypedef int (*ssizessizeobjargproc)(object, Py_ssize_t, Py_ssize_t, object) except -1
ctypedef int (*objobjargproc)(object, object, object) except -1
ctypedef int (*objobjproc)(object, object) except -1
ctypedef Py_hash_t (*hashfunc)(object) except -1
ctypedef object (*reprfunc)(object)
ctypedef int (*cmpfunc)(object, object) except -2
ctypedef object (*richcmpfunc)(object, object, int)
# The following functions use 'PyObject*' as first argument instead of 'object' to prevent
# accidental reference counting when calling them during a garbage collection run.
ctypedef void (*destructor)(PyObject*)
ctypedef int (*visitproc)(PyObject*, void *) except -1
ctypedef int (*traverseproc)(PyObject*, visitproc, void*) except -1
ctypedef void (*freefunc)(void*)
ctypedef object (*descrgetfunc)(object, object, object)
ctypedef int (*descrsetfunc)(object, object, object) except -1
ctypedef struct PyTypeObject:
const char* tp_name
const char* tp_doc
Py_ssize_t tp_basicsize
Py_ssize_t tp_itemsize
Py_ssize_t tp_dictoffset
unsigned long tp_flags
newfunc tp_new
destructor tp_dealloc
traverseproc tp_traverse
inquiry tp_clear
freefunc tp_free
ternaryfunc tp_call
hashfunc tp_hash
reprfunc tp_str
reprfunc tp_repr
cmpfunc tp_compare
richcmpfunc tp_richcompare
PyTypeObject* tp_base
PyObject* tp_dict
descrgetfunc tp_descr_get
descrsetfunc tp_descr_set
ctypedef struct PyObject:
Py_ssize_t ob_refcnt
PyTypeObject *ob_type
cdef PyTypeObject *Py_TYPE(object)
void* PyObject_Malloc(size_t)
void* PyObject_Realloc(void *, size_t)
void PyObject_Free(void *)
#####################################################################
# 6.1 Object Protocol
#####################################################################
int PyObject_Print(object o, FILE *fp, int flags) except -1
# Print an object o, on file fp. Returns -1 on error. The flags
# argument is used to enable certain printing options. The only
# option currently supported is Py_PRINT_RAW; if given, the str()
# of the object is written instead of the repr().
bint PyObject_HasAttrString(object o, const char *attr_name)
# Returns 1 if o has the attribute attr_name, and 0
# otherwise. This is equivalent to the Python expression
# "hasattr(o, attr_name)". This function always succeeds.
object PyObject_GetAttrString(object o, const char *attr_name)
# Return value: New reference. Retrieve an attribute named
# attr_name from object o. Returns the attribute value on success,
# or NULL on failure. This is the equivalent of the Python
# expression "o.attr_name".
bint PyObject_HasAttr(object o, object attr_name)
# Returns 1 if o has the attribute attr_name, and 0
# otherwise. This is equivalent to the Python expression
# "hasattr(o, attr_name)". This function always succeeds.
object PyObject_GetAttr(object o, object attr_name)
# Return value: New reference. Retrieve an attribute named
# attr_name from object o. Returns the attribute value on success,
# or NULL on failure. This is the equivalent of the Python
# expression "o.attr_name".
object PyObject_GenericGetAttr(object o, object attr_name)
int PyObject_SetAttrString(object o, const char *attr_name, object v) except -1
# Set the value of the attribute named attr_name, for object o, to
# the value v. Returns -1 on failure. This is the equivalent of
# the Python statement "o.attr_name = v".
int PyObject_SetAttr(object o, object attr_name, object v) except -1
# Set the value of the attribute named attr_name, for object o, to
# the value v. Returns -1 on failure. This is the equivalent of
# the Python statement "o.attr_name = v".
int PyObject_GenericSetAttr(object o, object attr_name, object v) except -1
int PyObject_DelAttrString(object o, const char *attr_name) except -1
# Delete attribute named attr_name, for object o. Returns -1 on
# failure. This is the equivalent of the Python statement: "del
# o.attr_name".
int PyObject_DelAttr(object o, object attr_name) except -1
# Delete attribute named attr_name, for object o. Returns -1 on
# failure. This is the equivalent of the Python statement "del
# o.attr_name".
int Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE
object PyObject_RichCompare(object o1, object o2, int opid)
# Return value: New reference.
# Compare the values of o1 and o2 using the operation specified by
# opid, which must be one of Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, or
# Py_GE, corresponding to <, <=, ==, !=, >, or >=
# respectively. This is the equivalent of the Python expression
# "o1 op o2", where op is the operator corresponding to
# opid. Returns the value of the comparison on success, or NULL on
# failure.
bint PyObject_RichCompareBool(object o1, object o2, int opid) except -1
# Compare the values of o1 and o2 using the operation specified by
# opid, which must be one of Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, or
# Py_GE, corresponding to <, <=, ==, !=, >, or >=
# respectively. Returns -1 on error, 0 if the result is false, 1
# otherwise. This is the equivalent of the Python expression "o1
# op o2", where op is the operator corresponding to opid.
int PyObject_Cmp(object o1, object o2, int *result) except -1
# Compare the values of o1 and o2 using a routine provided by o1,
# if one exists, otherwise with a routine provided by o2. The
# result of the comparison is returned in result. Returns -1 on
# failure. This is the equivalent of the Python statement "result
# = cmp(o1, o2)".
int PyObject_Compare(object o1, object o2) except *
# Compare the values of o1 and o2 using a routine provided by o1,
# if one exists, otherwise with a routine provided by o2. Returns
# the result of the comparison on success. On error, the value
# returned is undefined; use PyErr_Occurred() to detect an
# error. This is equivalent to the Python expression "cmp(o1,
# o2)".
object PyObject_Repr(object o)
# Return value: New reference.
# Compute a string representation of object o. Returns the string
# representation on success, NULL on failure. This is the
# equivalent of the Python expression "repr(o)". Called by the
# repr() built-in function and by reverse quotes.
object PyObject_Str(object o)
# Return value: New reference.
# Compute a string representation of object o. Returns the string
# representation on success, NULL on failure. This is the
# equivalent of the Python expression "str(o)". Called by the
# str() built-in function and by the print statement.
object PyObject_Unicode(object o)
# Return value: New reference.
# Compute a Unicode string representation of object o. Returns the
# Unicode string representation on success, NULL on failure. This
# is the equivalent of the Python expression "unicode(o)". Called
# by the unicode() built-in function.
bint PyObject_IsInstance(object inst, object cls) except -1
# Returns 1 if inst is an instance of the class cls or a subclass
# of cls, or 0 if not. On error, returns -1 and sets an
# exception. If cls is a type object rather than a class object,
# PyObject_IsInstance() returns 1 if inst is of type cls. If cls
# is a tuple, the check will be done against every entry in
# cls. The result will be 1 when at least one of the checks
# returns 1, otherwise it will be 0. If inst is not a class
# instance and cls is neither a type object, nor a class object,
# nor a tuple, inst must have a __class__ attribute -- the class
# relationship of the value of that attribute with cls will be
# used to determine the result of this function.
# Subclass determination is done in a fairly straightforward way,
# but includes a wrinkle that implementors of extensions to the
# class system may want to be aware of. If A and B are class
# objects, B is a subclass of A if it inherits from A either
# directly or indirectly. If either is not a class object, a more
# general mechanism is used to determine the class relationship of
# the two objects. When testing if B is a subclass of A, if A is
# B, PyObject_IsSubclass() returns true. If A and B are different
# objects, B's __bases__ attribute is searched in a depth-first
# fashion for A -- the presence of the __bases__ attribute is
# considered sufficient for this determination.
bint PyObject_IsSubclass(object derived, object cls) except -1
# Returns 1 if the class derived is identical to or derived from
# the class cls, otherwise returns 0. In case of an error, returns
# -1. If cls is a tuple, the check will be done against every
# entry in cls. The result will be 1 when at least one of the
# checks returns 1, otherwise it will be 0. If either derived or
# cls is not an actual class object (or tuple), this function uses
# the generic algorithm described above. New in version
# 2.1. Changed in version 2.3: Older versions of Python did not
# support a tuple as the second argument.
bint PyCallable_Check(object o)
# Determine if the object o is callable. Return 1 if the object is
# callable and 0 otherwise. This function always succeeds.
object PyObject_Call(object callable_object, object args, object kw)
# Return value: New reference.
# Call a callable Python object callable_object, with arguments
# given by the tuple args, and named arguments given by the
# dictionary kw. If no named arguments are needed, kw may be
# NULL. args must not be NULL, use an empty tuple if no arguments
# are needed. Returns the result of the call on success, or NULL
# on failure. This is the equivalent of the Python expression
# "apply(callable_object, args, kw)" or "callable_object(*args,
# **kw)".
object PyObject_CallObject(object callable_object, object args)
# Return value: New reference.
# Call a callable Python object callable_object, with arguments
# given by the tuple args. If no arguments are needed, then args
# may be NULL. Returns the result of the call on success, or NULL
# on failure. This is the equivalent of the Python expression
# "apply(callable_object, args)" or "callable_object(*args)".
object PyObject_CallFunction(object callable, char *format, ...)
# Return value: New reference.
# Call a callable Python object callable, with a variable number
# of C arguments. The C arguments are described using a
# Py_BuildValue() style format string. The format may be NULL,
# indicating that no arguments are provided. Returns the result of
# the call on success, or NULL on failure. This is the equivalent
# of the Python expression "apply(callable, args)" or
# "callable(*args)". Note that if you only pass object args,
# PyObject_CallFunctionObjArgs is a faster alternative.
object PyObject_CallMethod(object o, char *method, char *format, ...)
# Return value: New reference.
# Call the method named method of object o with a variable number
# of C arguments. The C arguments are described by a
# Py_BuildValue() format string that should produce a tuple. The
# format may be NULL, indicating that no arguments are
# provided. Returns the result of the call on success, or NULL on
# failure. This is the equivalent of the Python expression
# "o.method(args)". Note that if you only pass object args,
# PyObject_CallMethodObjArgs is a faster alternative.
#object PyObject_CallFunctionObjArgs(object callable, ..., NULL)
object PyObject_CallFunctionObjArgs(object 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. Returns the result of the
# call on success, or NULL on failure.
#PyObject* PyObject_CallMethodObjArgs(object o, object name, ..., NULL)
object PyObject_CallMethodObjArgs(object o, object name, ...)
# Return value: New reference.
# Calls a method of the object o, 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. Returns the result of the call on success, or NULL on
# failure.
long PyObject_Hash(object o) except? -1
# Compute and return the hash value of an object o. On failure,
# return -1. This is the equivalent of the Python expression
# "hash(o)".
bint PyObject_IsTrue(object o) except -1
# Returns 1 if the object o is considered to be true, and 0
# otherwise. This is equivalent to the Python expression "not not
# o". On failure, return -1.
bint PyObject_Not(object o) except -1
# Returns 0 if the object o is considered to be true, and 1
# otherwise. This is equivalent to the Python expression "not
# o". On failure, return -1.
object PyObject_Type(object o)
# Return value: New reference.
# When o is non-NULL, returns a type object corresponding to the
# object type of object o. On failure, raises SystemError and
# returns NULL. This is equivalent to the Python expression
# type(o). This function increments the reference count of the
# return value. There's really no reason to use this function
# instead of the common expression o->ob_type, which returns a
# pointer of type PyTypeObject*, except when the incremented
# reference count is needed.
bint PyObject_TypeCheck(object o, PyTypeObject *type)
# Return true if the object o is of type type or a subtype of
# type. Both parameters must be non-NULL.
Py_ssize_t PyObject_Length(object o) except -1
Py_ssize_t PyObject_Size(object o) except -1
# Return the length of object o. If the object o provides either
# the sequence and mapping protocols, the sequence length is
# returned. On error, -1 is returned. This is the equivalent to
# the Python expression "len(o)".
object PyObject_GetItem(object o, object key)
# Return value: New reference.
# Return element of o corresponding to the object key or NULL on
# failure. This is the equivalent of the Python expression
# "o[key]".
int PyObject_SetItem(object o, object key, object v) except -1
# Map the object key to the value v. Returns -1 on failure. This
# is the equivalent of the Python statement "o[key] = v".
int PyObject_DelItem(object o, object key) except -1
# Delete the mapping for key from o. Returns -1 on failure. This
# is the equivalent of the Python statement "del o[key]".
int PyObject_AsFileDescriptor(object o) except -1
# Derives a file-descriptor from a Python object. If the object is
# an integer or long integer, its value is returned. If not, the
# object's fileno() method is called if it exists; the method must
# return an integer or long integer, which is returned as the file
# descriptor value. Returns -1 on failure.
object PyObject_Dir(object o)
# Return value: New reference.
# This is equivalent to the Python expression "dir(o)", returning
# a (possibly empty) list of strings appropriate for the object
# argument, or NULL if there was an error. If the argument is
# NULL, this is like the Python "dir()", returning the names of
# the current locals; in this case, if no execution frame is
# active then NULL is returned but PyErr_Occurred() will return
# false.
object PyObject_GetIter(object o)
# Return value: New reference.
# This is equivalent to the Python expression "iter(o)". It
# returns a new iterator for the object argument, or the object
# itself if the object is already an iterator. Raises TypeError
# and returns NULL if the object cannot be iterated.
Py_ssize_t Py_SIZE(object o)
object PyObject_Format(object obj, object format_spec)
# Takes an arbitrary object and returns the result of calling
# obj.__format__(format_spec).
# Added in Py2.6
# Type flags (tp_flags of PyTypeObject)
long Py_TPFLAGS_HAVE_GETCHARBUFFER
long Py_TPFLAGS_HAVE_SEQUENCE_IN
long Py_TPFLAGS_HAVE_INPLACEOPS
long Py_TPFLAGS_CHECKTYPES
long Py_TPFLAGS_HAVE_RICHCOMPARE
long Py_TPFLAGS_HAVE_WEAKREFS
long Py_TPFLAGS_HAVE_ITER
long Py_TPFLAGS_HAVE_CLASS
long Py_TPFLAGS_HEAPTYPE
long Py_TPFLAGS_BASETYPE
long Py_TPFLAGS_READY
long Py_TPFLAGS_READYING
long Py_TPFLAGS_HAVE_GC
long Py_TPFLAGS_HAVE_STACKLESS_EXTENSION
long Py_TPFLAGS_HAVE_INDEX
long Py_TPFLAGS_HAVE_VERSION_TAG
long Py_TPFLAGS_VALID_VERSION_TAG
long Py_TPFLAGS_IS_ABSTRACT
long Py_TPFLAGS_HAVE_NEWBUFFER
long Py_TPFLAGS_INT_SUBCLASS
long Py_TPFLAGS_LONG_SUBCLASS
long Py_TPFLAGS_LIST_SUBCLASS
long Py_TPFLAGS_TUPLE_SUBCLASS
long Py_TPFLAGS_STRING_SUBCLASS
long Py_TPFLAGS_UNICODE_SUBCLASS
long Py_TPFLAGS_DICT_SUBCLASS
long Py_TPFLAGS_BASE_EXC_SUBCLASS
long Py_TPFLAGS_TYPE_SUBCLASS
long Py_TPFLAGS_DEFAULT_EXTERNAL
long Py_TPFLAGS_DEFAULT_CORE
long Py_TPFLAGS_DEFAULT

View file

@ -0,0 +1,63 @@
# Legacy Python 2 buffer interface.
#
# These functions are no longer available in Python 3, use the new
# buffer interface instead.
cdef extern from "Python.h":
cdef enum _:
Py_END_OF_BUFFER
# This constant may be passed as the size parameter to
# PyBuffer_FromObject() or PyBuffer_FromReadWriteObject(). It
# indicates that the new PyBufferObject should refer to base object
# from the specified offset to the end of its exported
# buffer. Using this enables the caller to avoid querying the base
# object for its length.
bint PyBuffer_Check(object p)
# Return true if the argument has type PyBuffer_Type.
object PyBuffer_FromObject(object base, Py_ssize_t offset, Py_ssize_t size)
# Return value: New reference.
#
# Return a new read-only buffer object. This raises TypeError if
# base doesn't support the read-only buffer protocol or doesn't
# provide exactly one buffer segment, or it raises ValueError if
# offset is less than zero. The buffer will hold a reference to the
# base object, and the buffer's contents will refer to the base
# object's buffer interface, starting as position offset and
# extending for size bytes. If size is Py_END_OF_BUFFER, then the
# new buffer's contents extend to the length of the base object's
# exported buffer data.
object PyBuffer_FromReadWriteObject(object base, Py_ssize_t offset, Py_ssize_t size)
# Return value: New reference.
#
# Return a new writable buffer object. Parameters and exceptions
# are similar to those for PyBuffer_FromObject(). If the base
# object does not export the writeable buffer protocol, then
# TypeError is raised.
object PyBuffer_FromMemory(void *ptr, Py_ssize_t size)
# Return value: New reference.
#
# Return a new read-only buffer object that reads from a specified
# location in memory, with a specified size. The caller is
# responsible for ensuring that the memory buffer, passed in as
# ptr, is not deallocated while the returned buffer object
# exists. Raises ValueError if size is less than zero. Note that
# Py_END_OF_BUFFER may not be passed for the size parameter;
# ValueError will be raised in that case.
object PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size)
# Return value: New reference.
#
# Similar to PyBuffer_FromMemory(), but the returned buffer is
# writable.
object PyBuffer_New(Py_ssize_t size)
# Return value: New reference.
#
# Return a new writable buffer object that maintains its own memory
# buffer of size bytes. ValueError is returned if size is not zero
# or positive. Note that the memory buffer (as returned by
# PyObject_AsWriteBuffer()) is not specifically aligned.

View file

@ -0,0 +1,144 @@
# available since Python 3.1!
cdef extern from "Python.h":
ctypedef struct PyCapsule_Type
# This subtype of PyObject represents an opaque value, useful for
# C extension modules who need to pass an opaque value (as a void*
# pointer) through Python code to other C code. It is often used
# to make a C function pointer defined in one module available to
# other modules, so the regular import mechanism can be used to
# access C APIs defined in dynamically loaded modules.
ctypedef void (*PyCapsule_Destructor)(object o)
# The type of a destructor callback for a capsule.
#
# See PyCapsule_New() for the semantics of PyCapsule_Destructor
# callbacks.
bint PyCapsule_CheckExact(object o)
# Return true if its argument is a PyCapsule.
object PyCapsule_New(void *pointer, const char *name,
PyCapsule_Destructor destructor)
# Return value: New reference.
#
# Create a PyCapsule encapsulating the pointer. The pointer
# argument may not be NULL.
#
# On failure, set an exception and return NULL.
#
# The name string may either be NULL or a pointer to a valid C
# string. If non-NULL, this string must outlive the
# capsule. (Though it is permitted to free it inside the
# destructor.)
#
# If the destructor argument is not NULL, it will be called with
# the capsule as its argument when it is destroyed.
#
# If this capsule will be stored as an attribute of a module, the
# name should be specified as modulename.attributename. This will
# enable other modules to import the capsule using
# PyCapsule_Import().
void* PyCapsule_GetPointer(object capsule, const char *name) except? NULL
# Retrieve the pointer stored in the capsule. On failure, set an
# exception and return NULL.
#
# The name parameter must compare exactly to the name stored in
# the capsule. If the name stored in the capsule is NULL, the name
# passed in must also be NULL. Python uses the C function strcmp()
# to compare capsule names.
PyCapsule_Destructor PyCapsule_GetDestructor(object capsule) except? NULL
# Return the current destructor stored in the capsule. On failure,
# set an exception and return NULL.
#
# It is legal for a capsule to have a NULL destructor. This makes
# a NULL return code somewhat ambiguous; use PyCapsule_IsValid()
# or PyErr_Occurred() to disambiguate.
const char* PyCapsule_GetName(object capsule) except? NULL
# Return the current name stored in the capsule. On failure, set
# an exception and return NULL.
#
# It is legal for a capsule to have a NULL name. This makes a NULL
# return code somewhat ambiguous; use PyCapsule_IsValid() or
# PyErr_Occurred() to disambiguate.
void* PyCapsule_GetContext(object capsule) except? NULL
# Return the current context stored in the capsule. On failure,
# set an exception and return NULL.
#
# It is legal for a capsule to have a NULL context. This makes a
# NULL return code somewhat ambiguous; use PyCapsule_IsValid() or
# PyErr_Occurred() to disambiguate.
bint PyCapsule_IsValid(object capsule, const char *name)
# Determines whether or not capsule is a valid capsule. A valid
# capsule is non-NULL, passes PyCapsule_CheckExact(), has a
# non-NULL pointer stored in it, and its internal name matches the
# name parameter. (See PyCapsule_GetPointer() for information on
# how capsule names are compared.)
#
# In other words, if PyCapsule_IsValid() returns a true value,
# calls to any of the accessors (any function starting with
# PyCapsule_Get()) are guaranteed to succeed.
#
# Return a nonzero value if the object is valid and matches the
# name passed in. Return 0 otherwise. This function will not fail.
int PyCapsule_SetPointer(object capsule, void *pointer) except -1
# Set the void pointer inside capsule to pointer. The pointer may
# not be NULL.
#
# Return 0 on success. Return nonzero and set an exception on
# failure.
int PyCapsule_SetDestructor(object capsule, PyCapsule_Destructor destructor) except -1
# Set the destructor inside capsule to destructor.
#
# Return 0 on success. Return nonzero and set an exception on
# failure.
int PyCapsule_SetName(object capsule, const char *name) except -1
# Set the name inside capsule to name. If non-NULL, the name must
# outlive the capsule. If the previous name stored in the capsule
# was not NULL, no attempt is made to free it.
#
# Return 0 on success. Return nonzero and set an exception on
# failure.
int PyCapsule_SetContext(object capsule, void *context) except -1
# Set the context pointer inside capsule to context. Return 0 on
# success. Return nonzero and set an exception on failure.
void* PyCapsule_Import(const char *name, int no_block) except? NULL
# Import a pointer to a C object from a capsule attribute in a
# module. The name parameter should specify the full name to the
# attribute, as in module.attribute. The name stored in the
# capsule must match this string exactly. If no_block is true,
# import the module without blocking (using
# PyImport_ImportModuleNoBlock()). If no_block is false, import
# the module conventionally (using PyImport_ImportModule()).
#
# Return the capsules internal pointer on success. On failure,
# set an exception and return NULL. However, if PyCapsule_Import()
# failed to import the module, and no_block was true, no exception
# is set.

View file

@ -0,0 +1,68 @@
# Interfaces to configure, query, create & destroy the Python runtime
from libc.stdio cimport FILE
from .pystate cimport PyThreadState
cdef extern from "Python.h":
ctypedef int wchar_t
void Py_SetProgramName(wchar_t *)
wchar_t *Py_GetProgramName()
void Py_SetPythonHome(wchar_t *)
wchar_t *Py_GetPythonHome()
# Only used by applications that embed the interpreter and need to
# override the standard encoding determination mechanism
int Py_SetStandardStreamEncoding(const char *encoding, const char *errors)
void Py_Initialize()
void Py_InitializeEx(int)
void _Py_InitializeEx_Private(int, int)
void Py_Finalize()
int Py_FinalizeEx()
int Py_IsInitialized()
PyThreadState *Py_NewInterpreter()
void Py_EndInterpreter(PyThreadState *)
# _Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
# exit functions.
void _Py_PyAtExit(void (*func)(object), object)
int Py_AtExit(void (*func)())
void Py_Exit(int)
# Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
void _Py_RestoreSignals()
int Py_FdIsInteractive(FILE *, const char *)
# Bootstrap __main__ (defined in Modules/main.c)
int Py_Main(int argc, wchar_t **argv)
# In getpath.c
wchar_t *Py_GetProgramFullPath()
wchar_t *Py_GetPrefix()
wchar_t *Py_GetExecPrefix()
wchar_t *Py_GetPath()
void Py_SetPath(const wchar_t *)
int _Py_CheckPython3()
# In their own files
const char *Py_GetVersion()
const char *Py_GetPlatform()
const char *Py_GetCopyright()
const char *Py_GetCompiler()
const char *Py_GetBuildInfo()
const char *_Py_gitidentifier()
const char *_Py_gitversion()
ctypedef void (*PyOS_sighandler_t)(int)
PyOS_sighandler_t PyOS_getsig(int)
PyOS_sighandler_t PyOS_setsig(int, PyOS_sighandler_t)
# Random
int _PyOS_URandom(void *buffer, Py_ssize_t size)
int _PyOS_URandomNonblock(void *buffer, Py_ssize_t size)

View file

@ -0,0 +1,92 @@
# Thread and interpreter state structures and their interfaces
from .object cimport PyObject
cdef extern from "Python.h":
# We make these an opaque types. If the user wants specific attributes,
# they can be declared manually.
ctypedef long PY_INT64_T # FIXME: Py2.7+, not defined here but used here
ctypedef struct PyInterpreterState:
pass
ctypedef struct PyThreadState:
pass
ctypedef struct PyFrameObject:
pass
# This is not actually a struct, but make sure it can never be coerced to
# an int or used in arithmetic expressions
ctypedef struct PyGILState_STATE:
pass
# The type of the trace function registered using PyEval_SetProfile() and
# PyEval_SetTrace().
# Py_tracefunc return -1 when raising an exception, or 0 for success.
ctypedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *)
# The following values are used for 'what' for tracefunc functions
enum:
PyTrace_CALL
PyTrace_EXCEPTION
PyTrace_LINE
PyTrace_RETURN
PyTrace_C_CALL
PyTrace_C_EXCEPTION
PyTrace_C_RETURN
PyInterpreterState * PyInterpreterState_New()
void PyInterpreterState_Clear(PyInterpreterState *)
void PyInterpreterState_Delete(PyInterpreterState *)
PY_INT64_T PyInterpreterState_GetID(PyInterpreterState *)
PyThreadState * PyThreadState_New(PyInterpreterState *)
void PyThreadState_Clear(PyThreadState *)
void PyThreadState_Delete(PyThreadState *)
PyThreadState * PyThreadState_Get()
PyThreadState * PyThreadState_Swap(PyThreadState *) # NOTE: DO NOT USE IN CYTHON CODE !
PyObject * PyThreadState_GetDict()
int PyThreadState_SetAsyncExc(long, PyObject *)
# Ensure that the current thread is ready to call the Python
# C API, regardless of the current state of Python, or of its
# thread lock. This may be called as many times as desired
# by a thread so long as each call is matched with a call to
# PyGILState_Release(). In general, other thread-state APIs may
# be used between _Ensure() and _Release() calls, so long as the
# thread-state is restored to its previous state before the Release().
# For example, normal use of the Py_BEGIN_ALLOW_THREADS/
# Py_END_ALLOW_THREADS macros are acceptable.
# The return value is an opaque "handle" to the thread state when
# PyGILState_Ensure() was called, and must be passed to
# PyGILState_Release() to ensure Python is left in the same state. Even
# though recursive calls are allowed, these handles can *not* be shared -
# each unique call to PyGILState_Ensure must save the handle for its
# call to PyGILState_Release.
# When the function returns, the current thread will hold the GIL.
# Failure is a fatal error.
PyGILState_STATE PyGILState_Ensure()
# Release any resources previously acquired. After this call, Python's
# state will be the same as it was prior to the corresponding
# PyGILState_Ensure() call (but generally this state will be unknown to
# the caller, hence the use of the GILState API.)
# Every call to PyGILState_Ensure must be matched by a call to
# PyGILState_Release on the same thread.
void PyGILState_Release(PyGILState_STATE)
# Routines for advanced debuggers, requested by David Beazley.
# Don't use unless you know what you are doing!
PyInterpreterState * PyInterpreterState_Head()
PyInterpreterState * PyInterpreterState_Next(PyInterpreterState *)
PyThreadState * PyInterpreterState_ThreadHead(PyInterpreterState *)
PyThreadState * PyThreadState_Next(PyThreadState *)

View file

@ -0,0 +1,53 @@
cdef extern from "pythread.h":
ctypedef void *PyThread_type_lock
ctypedef void *PyThread_type_sema
void PyThread_init_thread()
long PyThread_start_new_thread(void (*)(void *), void *) # FIXME: legacy
#unsigned long PyThread_start_new_thread(void (*)(void *), void *) # returned 'long' before Py3.7
void PyThread_exit_thread()
long PyThread_get_thread_ident() # FIXME: legacy
#unsigned long PyThread_get_thread_ident() # returned 'long' before Py3.7
PyThread_type_lock PyThread_allocate_lock()
void PyThread_free_lock(PyThread_type_lock)
int PyThread_acquire_lock(PyThread_type_lock, int mode) nogil
void PyThread_release_lock(PyThread_type_lock) nogil
enum:
# 'mode' in PyThread_acquire_lock()
WAIT_LOCK # 1
NOWAIT_LOCK # 0
ctypedef enum PyLockStatus:
# return values of PyThread_acquire_lock() in CPython 3.2+
PY_LOCK_FAILURE = 0
PY_LOCK_ACQUIRED = 1
PY_LOCK_INTR
size_t PyThread_get_stacksize()
int PyThread_set_stacksize(size_t)
# Thread Local Storage (TLS) API deprecated in CPython 3.7+
int PyThread_create_key()
void PyThread_delete_key(int)
int PyThread_set_key_value(int, void *)
void * PyThread_get_key_value(int)
void PyThread_delete_key_value(int key)
# Cleanup after a fork
void PyThread_ReInitTLS()
# Thread Specific Storage (TSS) API in CPython 3.7+ (also backported)
#ctypedef struct Py_tss_t: pass # Cython built-in type
Py_tss_t Py_tss_NEEDS_INIT # Not normally useful: Cython auto-initialises declared "Py_tss_t" variables.
Py_tss_t * PyThread_tss_alloc()
void PyThread_tss_free(Py_tss_t *key)
int PyThread_tss_is_created(Py_tss_t *key)
int PyThread_tss_create(Py_tss_t *key)
void PyThread_tss_delete(Py_tss_t *key)
int PyThread_tss_set(Py_tss_t *key, void *value)
void * PyThread_tss_get(Py_tss_t *key)

View file

@ -0,0 +1,51 @@
from .object cimport PyObject, PyTypeObject, Py_TYPE # legacy imports for re-export
cdef extern from "Python.h":
#####################################################################
# 3. Reference Counts
#####################################################################
# The macros in this section are used for managing reference counts of Python objects.
void Py_INCREF(object o)
# Increment the reference count for object o. The object must not
# be NULL; if you aren't sure that it isn't NULL, use
# Py_XINCREF().
void Py_XINCREF(PyObject* o)
# Increment the reference count for object o. The object may be NULL, in which case the macro has no effect.
void Py_DECREF(object o)
# Decrement the reference count for object o. The object must not
# be NULL; if you aren't sure that it isn't NULL, use
# Py_XDECREF(). If the reference count reaches zero, the object's
# type's deallocation function (which must not be NULL) is
# invoked.
# Warning: The deallocation function can cause arbitrary Python
# code to be invoked (e.g. when a class instance with a __del__()
# method is deallocated). While exceptions in such code are not
# propagated, the executed code has free access to all Python
# global variables. This means that any object that is reachable
# from a global variable should be in a consistent state before
# Py_DECREF() is invoked. For example, code to delete an object
# from a list should copy a reference to the deleted object in a
# temporary variable, update the list data structure, and then
# call Py_DECREF() for the temporary variable.
void Py_XDECREF(PyObject* o)
# Decrement the reference count for object o. The object may be
# NULL, in which case the macro has no effect; otherwise the
# effect is the same as for Py_DECREF(), and the same warning
# applies.
void Py_CLEAR(PyObject* o)
# Decrement the reference count for object o. The object may be
# NULL, in which case the macro has no effect; otherwise the
# effect is the same as for Py_DECREF(), except that the argument
# is also set to NULL. The warning for Py_DECREF() does not apply
# with respect to the object passed because the macro carefully
# uses a temporary variable and sets the argument to NULL before
# decrementing its reference count.
# It is a good idea to use this macro whenever decrementing the
# value of a variable that might be traversed during garbage
# collection.

View file

@ -0,0 +1,136 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# 6.3 Sequence Protocol
############################################################################
bint PySequence_Check(object o)
# Return 1 if the object provides sequence protocol, and 0
# otherwise. This function always succeeds.
Py_ssize_t PySequence_Size(object o) except -1
# Returns the number of objects in sequence o on success, and -1
# on failure. For objects that do not provide sequence protocol,
# this is equivalent to the Python expression "len(o)".
Py_ssize_t PySequence_Length(object o) except -1
# Alternate name for PySequence_Size().
object PySequence_Concat(object o1, object o2)
# Return value: New reference.
# Return the concatenation of o1 and o2 on success, and NULL on
# failure. This is the equivalent of the Python expression "o1 +
# o2".
object PySequence_Repeat(object o, Py_ssize_t count)
# Return value: New reference.
# Return the result of repeating sequence object o count times, or
# NULL on failure. This is the equivalent of the Python expression
# "o * count".
object PySequence_InPlaceConcat(object o1, object o2)
# Return value: New reference.
# Return the concatenation of o1 and o2 on success, and NULL on
# failure. The operation is done in-place when o1 supports
# it. This is the equivalent of the Python expression "o1 += o2".
object PySequence_InPlaceRepeat(object o, Py_ssize_t count)
# Return value: New reference.
# Return the result of repeating sequence object o count times, or
# NULL on failure. The operation is done in-place when o supports
# it. This is the equivalent of the Python expression "o *=
# count".
object PySequence_GetItem(object o, Py_ssize_t i)
# Return value: New reference.
# Return the ith element of o, or NULL on failure. This is the
# equivalent of the Python expression "o[i]".
object PySequence_GetSlice(object o, Py_ssize_t i1, Py_ssize_t i2)
# Return value: New reference.
# Return the slice of sequence object o between i1 and i2, or NULL
# on failure. This is the equivalent of the Python expression
# "o[i1:i2]".
int PySequence_SetItem(object o, Py_ssize_t i, object v) except -1
# Assign object v to the ith element of o. Returns -1 on
# failure. This is the equivalent of the Python statement "o[i] =
# v". This function does not steal a reference to v.
int PySequence_DelItem(object o, Py_ssize_t i) except -1
# Delete the ith element of object o. Returns -1 on failure. This
# is the equivalent of the Python statement "del o[i]".
int PySequence_SetSlice(object o, Py_ssize_t i1, Py_ssize_t i2, object v) except -1
# Assign the sequence object v to the slice in sequence object o
# from i1 to i2. This is the equivalent of the Python statement
# "o[i1:i2] = v".
int PySequence_DelSlice(object o, Py_ssize_t i1, Py_ssize_t i2) except -1
# Delete the slice in sequence object o from i1 to i2. Returns -1
# on failure. This is the equivalent of the Python statement "del
# o[i1:i2]".
int PySequence_Count(object o, object value) except -1
# Return the number of occurrences of value in o, that is, return
# the number of keys for which o[key] == value. On failure, return
# -1. This is equivalent to the Python expression
# "o.count(value)".
int PySequence_Contains(object o, object value) except -1
# Determine if o contains value. If an item in o is equal to
# value, return 1, otherwise return 0. On error, return -1. This
# is equivalent to the Python expression "value in o".
Py_ssize_t PySequence_Index(object o, object value) except -1
# Return the first index i for which o[i] == value. On error,
# return -1. This is equivalent to the Python expression
# "o.index(value)".
object PySequence_List(object o)
# Return value: New reference.
# Return a list object with the same contents as the arbitrary
# sequence o. The returned list is guaranteed to be new.
object PySequence_Tuple(object o)
# Return value: New reference.
# Return a tuple object with the same contents as the arbitrary
# sequence o or NULL on failure. If o is a tuple, a new reference
# will be returned, otherwise a tuple will be constructed with the
# appropriate contents. This is equivalent to the Python
# expression "tuple(o)".
object PySequence_Fast(object o, char *m)
# Return value: New reference.
# Returns the sequence o as a tuple, unless it is already a tuple
# or list, in which case o is returned. Use
# PySequence_Fast_GET_ITEM() to access the members of the
# result. Returns NULL on failure. If the object is not a
# sequence, raises TypeError with m as the message text.
PyObject* PySequence_Fast_GET_ITEM(object o, Py_ssize_t i)
# Return value: Borrowed reference.
# Return the ith element of o, assuming that o was returned by
# PySequence_Fast(), o is not NULL, and that i is within bounds.
PyObject** PySequence_Fast_ITEMS(object o)
# Return the underlying array of PyObject pointers. Assumes that o
# was returned by PySequence_Fast() and o is not NULL.
object PySequence_ITEM(object o, Py_ssize_t i)
# Return value: New reference.
# Return the ith element of o or NULL on failure. Macro form of
# PySequence_GetItem() but without checking that
# PySequence_Check(o) is true and without adjustment for negative
# indices.
Py_ssize_t PySequence_Fast_GET_SIZE(object o)
# Returns the length of o, assuming that o was returned by
# PySequence_Fast() and that o is not NULL. The size can also be
# gotten by calling PySequence_Size() on o, but
# PySequence_Fast_GET_SIZE() is faster because it can assume o is
# a list or tuple.

View file

@ -0,0 +1,119 @@
cdef extern from "Python.h":
############################################################################
# 7.5.14 Set Objects
############################################################################
# This section details the public API for set and frozenset
# objects. Any functionality not listed below is best accessed
# using the either the abstract object protocol (including
# PyObject_CallMethod(), PyObject_RichCompareBool(),
# PyObject_Hash(), PyObject_Repr(), PyObject_IsTrue(),
# PyObject_Print(), and PyObject_GetIter()) or the abstract number
# protocol (including PyNumber_Add(), PyNumber_Subtract(),
# PyNumber_Or(), PyNumber_Xor(), PyNumber_InPlaceAdd(),
# PyNumber_InPlaceSubtract(), PyNumber_InPlaceOr(), and
# PyNumber_InPlaceXor()).
# PySetObject
# This subtype of PyObject is used to hold the internal data for
# both set and frozenset objects. It is like a PyDictObject in
# that it is a fixed size for small sets (much like tuple storage)
# and will point to a separate, variable sized block of memory for
# medium and large sized sets (much like list storage). None of
# the fields of this structure should be considered public and are
# subject to change. All access should be done through the
# documented API rather than by manipulating the values in the
# structure.
# PyTypeObject PySet_Type
# This is an instance of PyTypeObject representing the Python set type.
# PyTypeObject PyFrozenSet_Type
# This is an instance of PyTypeObject representing the Python frozenset type.
# The following type check macros work on pointers to any Python
# object. Likewise, the constructor functions work with any
# iterable Python object.
bint PyAnySet_Check(object p)
# Return true if p is a set object, a frozenset object, or an
# instance of a subtype.
bint PyAnySet_CheckExact(object p)
# Return true if p is a set object or a frozenset object but not
# an instance of a subtype.
bint PyFrozenSet_Check(object p)
# Return true if p is a frozenset object or an instance of a subtype.
bint PyFrozenSet_CheckExact(object p)
# Return true if p is a frozenset object but not an instance of a subtype.
bint PySet_Check(object p)
# Return true if p is a set object or an instance of a subtype.
object PySet_New(object iterable)
# Return value: New reference.
# Return a new set containing objects returned by the
# iterable. The iterable may be NULL to create a new empty
# set. Return the new set on success or NULL on failure. Raise
# TypeError if iterable is not actually iterable. The constructor
# is also useful for copying a set (c=set(s)).
object PyFrozenSet_New(object iterable)
# Return value: New reference.
# Return a new frozenset containing objects returned by the
# iterable. The iterable may be NULL to create a new empty
# frozenset. Return the new set on success or NULL on
# failure. Raise TypeError if iterable is not actually iterable.
# The following functions and macros are available for instances
# of set or frozenset or instances of their subtypes.
Py_ssize_t PySet_Size(object anyset) except -1
# Return the length of a set or frozenset object. Equivalent to
# "len(anyset)". Raises a PyExc_SystemError if anyset is not a
# set, frozenset, or an instance of a subtype.
Py_ssize_t PySet_GET_SIZE(object anyset)
# Macro form of PySet_Size() without error checking.
bint PySet_Contains(object anyset, object key) except -1
# Return 1 if found, 0 if not found, and -1 if an error is
# encountered. Unlike the Python __contains__() method, this
# function does not automatically convert unhashable sets into
# temporary frozensets. Raise a TypeError if the key is
# unhashable. Raise PyExc_SystemError if anyset is not a set,
# frozenset, or an instance of a subtype.
# The following functions are available for instances of set or
# its subtypes but not for instances of frozenset or its subtypes.
int PySet_Add(object set, object key) except -1
# Add key to a set instance. Does not apply to frozenset
# instances. Return 0 on success or -1 on failure. Raise a
# TypeError if the key is unhashable. Raise a MemoryError if there
# is no room to grow. Raise a SystemError if set is an not an
# instance of set or its subtype.
bint PySet_Discard(object set, object key) except -1
# Return 1 if found and removed, 0 if not found (no action taken),
# and -1 if an error is encountered. Does not raise KeyError for
# missing keys. Raise a TypeError if the key is unhashable. Unlike
# the Python discard() method, this function does not
# automatically convert unhashable sets into temporary
# frozensets. Raise PyExc_SystemError if set is an not an instance
# of set or its subtype.
object PySet_Pop(object set)
# Return value: New reference.
# Return a new reference to an arbitrary object in the set, and
# removes the object from the set. Return NULL on failure. Raise
# KeyError if the set is empty. Raise a SystemError if set is an
# not an instance of set or its subtype.
int PySet_Clear(object set)
# Empty an existing set of all elements.

View file

@ -0,0 +1,70 @@
cdef extern from "Python.h":
# PyTypeObject PySlice_Type
#
# The type object for slice objects. This is the same as slice and types.SliceType
bint PySlice_Check(object ob)
#
# Return true if ob is a slice object; ob must not be NULL.
slice PySlice_New(object start, object stop, object step)
#
# Return a new slice object with the given values. The start, stop, and step
# parameters are used as the values of the slice object attributes of the same
# names. Any of the values may be NULL, in which case the None will be used
# for the corresponding attribute. Return NULL if the new object could not be
# allocated.
int PySlice_GetIndices(object slice, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step) except? -1
#
# Retrieve the start, stop and step indices from the slice object slice,
# assuming a sequence of length length. Treats indices greater than length
# as errors.
#
# Returns 0 on success and -1 on error with no exception set (unless one
# of the indices was not None and failed to be converted to an integer,
# in which case -1 is returned with an exception set).
#
# You probably do not want to use this function.
#
# Changed in version 3.2: The parameter type for the slice parameter was
# PySliceObject* before.
int PySlice_GetIndicesEx(object slice, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
Py_ssize_t *slicelength) except -1
#
# Usable replacement for PySlice_GetIndices(). Retrieve the start, stop, and step
# indices from the slice object slice assuming a sequence of length length, and
# store the length of the slice in slicelength. Out of bounds indices are clipped
# in a manner consistent with the handling of normal slices.
#
# Returns 0 on success and -1 on error with exception set.
#
# Changed in version 3.2: The parameter type for the slice parameter was
# PySliceObject* before.
int PySlice_Unpack(object slice, Py_ssize_t *start, Py_ssize_t *stop,
Py_ssize_t *step) except -1
# Extract the start, stop and step data members from a slice object as C
# integers. Silently reduce values larger than PY_SSIZE_T_MAX to
# PY_SSIZE_T_MAX, silently boost the start and stop values less than
# PY_SSIZE_T_MIN to PY_SSIZE_T_MIN, and silently boost the step values
# less than -PY_SSIZE_T_MAX to -PY_SSIZE_T_MAX.
# Return -1 on error, 0 on success.
# New in version 3.6.1.
Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start,
Py_ssize_t *stop, Py_ssize_t step)
# Adjust start/end slice indices assuming a sequence of the specified
# length. Out of bounds indices are clipped in a manner consistent with
# the handling of normal slices.
# Return the length of the slice. Always successful. Doesnt call Python
# code.
# New in version 3.6.1.

View file

@ -0,0 +1,198 @@
from .object cimport PyObject
cdef extern from "Python.h":
ctypedef struct va_list
############################################################################
# 7.3.1 String Objects
############################################################################
# These functions raise TypeError when expecting a string
# parameter and are called with a non-string parameter.
# PyStringObject
# This subtype of PyObject represents a Python string object.
# PyTypeObject PyString_Type
# This instance of PyTypeObject represents the Python string type;
# it is the same object as str and types.StringType in the Python
# layer.
bint PyString_Check(object o)
# Return true if the object o is a string object or an instance of
# a subtype of the string type.
bint PyString_CheckExact(object o)
# Return true if the object o is a string object, but not an instance of a subtype of the string type.
object PyString_FromString(char *v)
# Return value: New reference.
# Return a new string object with the value v on success, and NULL
# on failure. The parameter v must not be NULL; it will not be
# checked.
object PyString_FromStringAndSize(char *v, Py_ssize_t len)
# Return value: New reference.
# Return a new string object with the value v and length len on
# success, and NULL on failure. If v is NULL, the contents of the
# string are uninitialized.
object PyString_FromFormat(char *format, ...)
# Return value: New reference.
# Take a C printf()-style format string and a variable number of
# arguments, calculate the size of the resulting Python string and
# return a string with the values formatted into it. The variable
# arguments must be C types and must correspond exactly to the
# format characters in the format string. The following format
# characters are allowed:
# Format Characters Type Comment
# %% n/a The literal % character.
# %c int A single character, represented as an C int.
# %d int Exactly equivalent to printf("%d").
# %u unsigned int Exactly equivalent to printf("%u").
# %ld long Exactly equivalent to printf("%ld").
# %lu unsigned long Exactly equivalent to printf("%lu").
# %zd Py_ssize_t Exactly equivalent to printf("%zd").
# %zu size_t Exactly equivalent to printf("%zu").
# %i int Exactly equivalent to printf("%i").
# %x int Exactly equivalent to printf("%x").
# %s char* A null-terminated C character array.
# %p void* The hex representation of a C pointer.
# Mostly equivalent to printf("%p") except that it is guaranteed to
# start with the literal 0x regardless of what the platform's printf
# yields.
# An unrecognized format character causes all the rest of the
# format string to be copied as-is to the result string, and any
# extra arguments discarded.
object PyString_FromFormatV(char *format, va_list vargs)
# Return value: New reference.
# Identical to PyString_FromFormat() except that it takes exactly two arguments.
Py_ssize_t PyString_Size(object string) except -1
# Return the length of the string in string object string.
Py_ssize_t PyString_GET_SIZE(object string)
# Macro form of PyString_Size() but without error checking.
char* PyString_AsString(object string) except NULL
# Return a NUL-terminated representation of the contents of
# string. The pointer refers to the internal buffer of string, not
# a copy. The data must not be modified in any way, unless the
# string was just created using PyString_FromStringAndSize(NULL,
# size). It must not be deallocated. If string is a Unicode
# object, this function computes the default encoding of string
# and operates on that. If string is not a string object at all,
# PyString_AsString() returns NULL and raises TypeError.
char* PyString_AS_STRING(object string)
# Macro form of PyString_AsString() but without error
# checking. Only string objects are supported; no Unicode objects
# should be passed.
int PyString_AsStringAndSize(object obj, char **buffer, Py_ssize_t *length) except -1
# Return a NULL-terminated representation of the contents of the
# object obj through the output variables buffer and length.
#
# The function accepts both string and Unicode objects as
# input. For Unicode objects it returns the default encoded
# version of the object. If length is NULL, the resulting buffer
# may not contain NUL characters; if it does, the function returns
# -1 and a TypeError is raised.
# The buffer refers to an internal string buffer of obj, not a
# copy. The data must not be modified in any way, unless the
# string was just created using PyString_FromStringAndSize(NULL,
# size). It must not be deallocated. If string is a Unicode
# object, this function computes the default encoding of string
# and operates on that. If string is not a string object at all,
# PyString_AsStringAndSize() returns -1 and raises TypeError.
void PyString_Concat(PyObject **string, object newpart)
# Create a new string object in *string containing the contents of
# newpart appended to string; the caller will own the new
# reference. The reference to the old value of string will be
# stolen. If the new string cannot be created, the old reference
# to string will still be discarded and the value of *string will
# be set to NULL; the appropriate exception will be set.
void PyString_ConcatAndDel(PyObject **string, object newpart)
# Create a new string object in *string containing the contents of
# newpart appended to string. This version decrements the
# reference count of newpart.
int _PyString_Resize(PyObject **string, Py_ssize_t newsize) except -1
# A way to resize a string object even though it is
# ``immutable''. Only use this to build up a brand new string
# object; don't use this if the string may already be known in
# other parts of the code. It is an error to call this function if
# the refcount on the input string object is not one. Pass the
# address of an existing string object as an lvalue (it may be
# written into), and the new size desired. On success, *string
# holds the resized string object and 0 is returned; the address
# in *string may differ from its input value. If the reallocation
# fails, the original string object at *string is deallocated,
# *string is set to NULL, a memory exception is set, and -1 is
# returned.
object PyString_Format(object format, object args)
# Return value: New reference. Return a new string object from
# format and args. Analogous to format % args. The args argument
# must be a tuple.
void PyString_InternInPlace(PyObject **string)
# Intern the argument *string in place. The argument must be the
# address of a pointer variable pointing to a Python string
# object. If there is an existing interned string that is the same
# as *string, it sets *string to it (decrementing the reference
# count of the old string object and incrementing the reference
# count of the interned string object), otherwise it leaves
# *string alone and interns it (incrementing its reference
# count). (Clarification: even though there is a lot of talk about
# reference counts, think of this function as
# reference-count-neutral; you own the object after the call if
# and only if you owned it before the call.)
object PyString_InternFromString(char *v)
# Return value: New reference.
# A combination of PyString_FromString() and
# PyString_InternInPlace(), returning either a new string object
# that has been interned, or a new (``owned'') reference to an
# earlier interned string object with the same value.
object PyString_Decode(char *s, Py_ssize_t size, char *encoding, char *errors)
# Return value: New reference.
# Create an object by decoding size bytes of the encoded buffer s
# using the codec registered for encoding. encoding and errors
# have the same meaning as the parameters of the same name in the
# unicode() built-in function. The codec to be used is looked up
# using the Python codec registry. Return NULL if an exception was
# raised by the codec.
object PyString_AsDecodedObject(object str, char *encoding, char *errors)
# Return value: New reference.
# Decode a string object by passing it to the codec registered for
# encoding and return the result as Python object. encoding and
# errors have the same meaning as the parameters of the same name
# in the string encode() method. The codec to be used is looked up
# using the Python codec registry. Return NULL if an exception was
# raised by the codec.
object PyString_Encode(char *s, Py_ssize_t size, char *encoding, char *errors)
# Return value: New reference.
# Encode the char buffer of the given size by passing it to the
# codec registered for encoding and return a Python
# object. encoding and errors have the same meaning as the
# parameters of the same name in the string encode() method. The
# codec to be used is looked up using the Python codec
# registry. Return NULL if an exception was raised by the codec.
object PyString_AsEncodedObject(object str, char *encoding, char *errors)
# Return value: New reference.
# Encode a string object using the codec registered for encoding
# and return the result as Python object. encoding and errors have
# the same meaning as the parameters of the same name in the
# string encode() method. The codec to be used is looked up using
# the Python codec registry. Return NULL if an exception was
# raised by the codec.

View file

@ -0,0 +1,71 @@
from .object cimport PyObject
cdef extern from "Python.h":
############################################################################
# Tuples
############################################################################
bint PyTuple_Check(object p)
# Return true if p is a tuple object or an instance of a subtype
# of the tuple type.
bint PyTuple_CheckExact(object p)
# Return true if p is a tuple object, but not an instance of a subtype of the tuple type.
tuple PyTuple_New(Py_ssize_t len)
# Return value: New reference.
# Return a new tuple object of size len, or NULL on failure.
tuple PyTuple_Pack(Py_ssize_t n, ...)
# Return value: New reference.
# Return a new tuple object of size n, or NULL on failure. The
# tuple values are initialized to the subsequent n C arguments
# pointing to Python objects. "PyTuple_Pack(2, a, b)" is
# equivalent to "Py_BuildValue("(OO)", a, b)".
Py_ssize_t PyTuple_Size(object p) except -1
# Take a pointer to a tuple object, and return the size of that tuple.
Py_ssize_t PyTuple_GET_SIZE(object p)
# Return the size of the tuple p, which must be non-NULL and point
# to a tuple; no error checking is performed.
PyObject* PyTuple_GetItem(object p, Py_ssize_t pos) except NULL
# Return value: Borrowed reference.
# Return the object at position pos in the tuple pointed to by
# p. If pos is out of bounds, return NULL and sets an IndexError
# exception.
PyObject* PyTuple_GET_ITEM(object p, Py_ssize_t pos)
# Return value: Borrowed reference.
# Like PyTuple_GetItem(), but does no checking of its arguments.
tuple PyTuple_GetSlice(object p, Py_ssize_t low, Py_ssize_t high)
# Return value: New reference.
# Take a slice of the tuple pointed to by p from low to high and return it as a new tuple.
int PyTuple_SetItem(object p, Py_ssize_t pos, object o) except -1
# Insert a reference to object o at position pos of the tuple
# pointed to by p. Return 0 on success. Note: This function
# ``steals'' a reference to o.
void PyTuple_SET_ITEM(object p, Py_ssize_t pos, object o)
# Like PyTuple_SetItem(), but does no error checking, and should
# only be used to fill in brand new tuples. Note: This function
# ``steals'' a reference to o.
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize) except -1
# Can be used to resize a tuple. newsize will be the new length of
# the tuple. Because tuples are supposed to be immutable, this
# should only be used if there is only one reference to the
# object. Do not use this if the tuple may already be known to
# some other part of the code. The tuple will always grow or
# shrink at the end. Think of this as destroying the old tuple and
# creating a new one, only more efficiently. Returns 0 on
# success. Client code should never assume that the resulting
# value of *p will be the same as before calling this function. If
# the object referenced by *p is replaced, the original *p is
# destroyed. On failure, returns -1 and sets *p to NULL, and
# raises MemoryError or SystemError.

View file

@ -0,0 +1,48 @@
cdef extern from "Python.h":
# The C structure of the objects used to describe built-in types.
############################################################################
# 7.1.1 Type Objects
############################################################################
ctypedef class __builtin__.type [object PyTypeObject]:
pass
# PyObject* PyType_Type
# This is the type object for type objects; it is the same object
# as type and types.TypeType in the Python layer.
bint PyType_Check(object o)
# Return true if the object o is a type object, including
# instances of types derived from the standard type object. Return
# false in all other cases.
bint PyType_CheckExact(object o)
# Return true if the object o is a type object, but not a subtype
# of the standard type object. Return false in all other
# cases.
bint PyType_HasFeature(object o, int feature)
# Return true if the type object o sets the feature feature. Type
# features are denoted by single bit flags.
bint PyType_IS_GC(object o)
# Return true if the type object includes support for the cycle
# detector; this tests the type flag Py_TPFLAGS_HAVE_GC.
bint PyType_IsSubtype(type a, type b)
# Return true if a is a subtype of b.
object PyType_GenericAlloc(object type, Py_ssize_t nitems)
# Return value: New reference.
object PyType_GenericNew(type type, object args, object kwds)
# Return value: New reference.
bint PyType_Ready(type type) except -1
# Finalize a type object. This should be called on all type
# objects to finish their initialization. This function is
# responsible for adding inherited slots from a type's base
# class. Return 0 on success, or return -1 and sets an exception
# on error.

View file

@ -0,0 +1,572 @@
cdef extern from *:
# Return true if the object o is a Unicode object or an instance
# of a Unicode subtype. Changed in version 2.2: Allowed subtypes
# to be accepted.
bint PyUnicode_Check(object o)
# Return true if the object o is a Unicode object, but not an
# instance of a subtype. New in version 2.2.
bint PyUnicode_CheckExact(object o)
# Return the size of the object. o has to be a PyUnicodeObject
# (not checked).
#
# Deprecated since version 3.3, will be removed in version 3.10:
# Part of the old-style Unicode API, please migrate to using
# PyUnicode_GET_LENGTH().
Py_ssize_t PyUnicode_GET_SIZE(object o)
# Return the length of the Unicode string, in code points. o has
# to be a Unicode object in the “canonical” representation (not
# checked).
#
# New in version 3.3.
Py_ssize_t PyUnicode_GET_LENGTH(object o)
# Return the size of the object's internal buffer in bytes. o has
# to be a PyUnicodeObject (not checked).
Py_ssize_t PyUnicode_GET_DATA_SIZE(object o)
# Return a pointer to the internal Py_UNICODE buffer of the
# object. o has to be a PyUnicodeObject (not checked).
Py_UNICODE* PyUnicode_AS_UNICODE(object o)
# Return a pointer to the internal buffer of the object. o has to
# be a PyUnicodeObject (not checked).
char* PyUnicode_AS_DATA(object o)
# Return 1 or 0 depending on whether ch is a whitespace character.
bint Py_UNICODE_ISSPACE(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a lowercase character.
bint Py_UNICODE_ISLOWER(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an uppercase character.
bint Py_UNICODE_ISUPPER(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a titlecase character.
bint Py_UNICODE_ISTITLE(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a linebreak character.
bint Py_UNICODE_ISLINEBREAK(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a decimal character.
bint Py_UNICODE_ISDECIMAL(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a digit character.
bint Py_UNICODE_ISDIGIT(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is a numeric character.
bint Py_UNICODE_ISNUMERIC(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an alphabetic character.
bint Py_UNICODE_ISALPHA(Py_UCS4 ch)
# Return 1 or 0 depending on whether ch is an alphanumeric character.
bint Py_UNICODE_ISALNUM(Py_UCS4 ch)
# Return the character ch converted to lower case.
# Used to return a Py_UNICODE value before Py3.3.
Py_UCS4 Py_UNICODE_TOLOWER(Py_UCS4 ch)
# Return the character ch converted to upper case.
# Used to return a Py_UNICODE value before Py3.3.
Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch)
# Return the character ch converted to title case.
# Used to return a Py_UNICODE value before Py3.3.
Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch)
# Return the character ch converted to a decimal positive
# integer. Return -1 if this is not possible. This macro does not
# raise exceptions.
int Py_UNICODE_TODECIMAL(Py_UCS4 ch)
# Return the character ch converted to a single digit
# integer. Return -1 if this is not possible. This macro does not
# raise exceptions.
int Py_UNICODE_TODIGIT(Py_UCS4 ch)
# Return the character ch converted to a double. Return -1.0 if
# this is not possible. This macro does not raise exceptions.
double Py_UNICODE_TONUMERIC(Py_UCS4 ch)
# To create Unicode objects and access their basic sequence
# properties, use these APIs:
# Create a Unicode Object from the Py_UNICODE buffer u of the
# given size. u may be NULL which causes the contents to be
# undefined. It is the user's responsibility to fill in the needed
# data. The buffer is copied into the new object. If the buffer is
# not NULL, the return value might be a shared object. Therefore,
# modification of the resulting Unicode object is only allowed
# when u is NULL.
unicode PyUnicode_FromUnicode(Py_UNICODE *u, Py_ssize_t size)
# Create a Unicode Object from the given Unicode code point ordinal.
#
# The ordinal must be in range(0x10000) on narrow Python builds
# (UCS2), and range(0x110000) on wide builds (UCS4). A ValueError
# is raised in case it is not.
unicode PyUnicode_FromOrdinal(int ordinal)
# Return a read-only pointer to the Unicode object's internal
# Py_UNICODE buffer, NULL if unicode is not a Unicode object.
Py_UNICODE* PyUnicode_AsUnicode(object o) except NULL
# Return the length of the Unicode object.
Py_ssize_t PyUnicode_GetSize(object o) except -1
# Coerce an encoded object obj to an Unicode object and return a
# reference with incremented refcount.
# String and other char buffer compatible objects are decoded
# according to the given encoding and using the error handling
# defined by errors. Both can be NULL to have the interface use
# the default values (see the next section for details).
# All other objects, including Unicode objects, cause a TypeError
# to be set.
object PyUnicode_FromEncodedObject(object o, char *encoding, char *errors)
# Shortcut for PyUnicode_FromEncodedObject(obj, NULL, "strict")
# which is used throughout the interpreter whenever coercion to
# Unicode is needed.
object PyUnicode_FromObject(object obj)
# If the platform supports wchar_t and provides a header file
# wchar.h, Python can interface directly to this type using the
# following functions. Support is optimized if Python's own
# Py_UNICODE type is identical to the system's wchar_t.
#ctypedef int wchar_t
# Create a Unicode object from the wchar_t buffer w of the given
# size. Return NULL on failure.
#PyObject* PyUnicode_FromWideChar(wchar_t *w, Py_ssize_t size)
#Py_ssize_t PyUnicode_AsWideChar(object o, wchar_t *w, Py_ssize_t size)
# Unicode Methods
# Concat two strings giving a new Unicode string.
# Return value: New reference.
unicode PyUnicode_Concat(object left, object right)
# Split a string giving a list of Unicode strings. If sep is NULL,
# splitting will be done at all whitespace substrings. Otherwise,
# splits occur at the given separator. At most maxsplit splits will
# be done. If negative, no limit is set. Separators are not included
# in the resulting list.
# Return value: New reference.
list PyUnicode_Split(object s, object sep, Py_ssize_t maxsplit)
# Split a Unicode string at line breaks, returning a list of Unicode
# strings. CRLF is considered to be one line break. If keepend is 0,
# the Line break characters are not included in the resulting strings.
# Return value: New reference.
list PyUnicode_Splitlines(object s, bint keepend)
# Translate a string by applying a character mapping table to it and
# return the resulting Unicode object.
#
# The mapping table must map Unicode ordinal integers to Unicode ordinal
# integers or None (causing deletion of the character).
#
# Mapping tables need only provide the __getitem__() interface;
# dictionaries and sequences work well. Unmapped character ordinals (ones
# which cause a LookupError) are left untouched and are copied as-is.
#
# errors has the usual meaning for codecs. It may be NULL which indicates
# to use the default error handling.
# Return value: New reference.
unicode PyUnicode_Translate(object str, object table, const char *errors)
# Join a sequence of strings using the given separator and return the
# resulting Unicode string.
# Return value: New reference.
unicode PyUnicode_Join(object separator, object seq)
# Return 1 if substr matches str[start:end] at the given tail end
# (direction == -1 means to do a prefix match, direction == 1 a
# suffix match), 0 otherwise.
# Return -1 if an error occurred.
Py_ssize_t PyUnicode_Tailmatch(object str, object substr,
Py_ssize_t start, Py_ssize_t end, int direction) except -1
# Return the first position of substr in str[start:end] using the given
# direction (direction == 1 means to do a forward search, direction == -1
# a backward search). The return value is the index of the first match;
# a value of -1 indicates that no match was found, and -2 indicates that an
# error occurred and an exception has been set.
Py_ssize_t PyUnicode_Find(object str, object substr, Py_ssize_t start, Py_ssize_t end, int direction) except -2
# Return the first position of the character ch in str[start:end] using
# the given direction (direction == 1 means to do a forward search,
# direction == -1 a backward search). The return value is the index of
# the first match; a value of -1 indicates that no match was found, and
# -2 indicates that an error occurred and an exception has been set.
# New in version 3.3.
Py_ssize_t PyUnicode_FindChar(object str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) except -2
# Return the number of non-overlapping occurrences of substr in
# str[start:end]. Return -1 if an error occurred.
Py_ssize_t PyUnicode_Count(object str, object substr, Py_ssize_t start, Py_ssize_t end) except -1
# Replace at most maxcount occurrences of substr in str with replstr and
# return the resulting Unicode object. maxcount == -1 means replace all
# occurrences.
# Return value: New reference.
unicode PyUnicode_Replace(object str, object substr, object replstr, Py_ssize_t maxcount)
# Compare two strings and return -1, 0, 1 for less than,
# equal, and greater than, respectively.
int PyUnicode_Compare(object left, object right) except? -1
# Compare a unicode object, uni, with string and return -1, 0, 1 for less than,
# equal, and greater than, respectively. It is best to pass only ASCII-encoded
# strings, but the function interprets the input string as ISO-8859-1 if it
# contains non-ASCII characters.
int PyUnicode_CompareWithASCIIString(object uni, const char *string)
# Rich compare two unicode strings and return one of the following:
#
# NULL in case an exception was raised
# Py_True or Py_False for successful comparisons
# Py_NotImplemented in case the type combination is unknown
#
# Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in case
# the conversion of the arguments to Unicode fails with a UnicodeDecodeError.
#
# Possible values for op are Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, and Py_LE.
object PyUnicode_RichCompare(object left, object right, int op)
# Return a new string object from format and args; this is analogous to
# format % args.
# Return value: New reference.
unicode PyUnicode_Format(object format, object args)
# Check whether element is contained in container and return true or false
# accordingly.
#
# element has to coerce to a one element Unicode string. -1 is returned
# if there was an error.
int PyUnicode_Contains(object container, object element) except -1
# Intern the argument *string in place. The argument must be the address
# of a pointer variable pointing to a Python unicode string object. If
# there is an existing interned string that is the same as *string, it sets
# *string to it (decrementing the reference count of the old string object
# and incrementing the reference count of the interned string object),
# otherwise it leaves *string alone and interns it (incrementing its reference
# count). (Clarification: even though there is a lot of talk about reference
# counts, think of this function as reference-count-neutral; you own the object
# after the call if and only if you owned it before the call.)
#void PyUnicode_InternInPlace(PyObject **string)
# A combination of PyUnicode_FromString() and PyUnicode_InternInPlace(),
# returning either a new unicode string object that has been interned, or
# a new ("owned") reference to an earlier interned string object with the
# same value.
unicode PyUnicode_InternFromString(const char *v)
# Codecs
# Create a Unicode object by decoding size bytes of the encoded
# string s. encoding and errors have the same meaning as the
# parameters of the same name in the unicode() builtin
# function. The codec to be used is looked up using the Python
# codec registry. Return NULL if an exception was raised by the
# codec.
object PyUnicode_Decode(char *s, Py_ssize_t size, char *encoding, char *errors)
# Encode the Py_UNICODE buffer of the given size and return a
# Python string object. encoding and errors have the same meaning
# as the parameters of the same name in the Unicode encode()
# method. The codec to be used is looked up using the Python codec
# registry. Return NULL if an exception was raised by the codec.
object PyUnicode_Encode(Py_UNICODE *s, Py_ssize_t size,
char *encoding, char *errors)
# Encode a Unicode object and return the result as Python string
# object. encoding and errors have the same meaning as the
# parameters of the same name in the Unicode encode() method. The
# codec to be used is looked up using the Python codec
# registry. Return NULL if an exception was raised by the codec.
object PyUnicode_AsEncodedString(object unicode, char *encoding, char *errors)
# These are the UTF-8 codec APIs:
# Create a Unicode object by decoding size bytes of the UTF-8
# encoded string s. Return NULL if an exception was raised by the
# codec.
unicode PyUnicode_DecodeUTF8(char *s, Py_ssize_t size, char *errors)
# If consumed is NULL, behave like PyUnicode_DecodeUTF8(). If
# consumed is not NULL, trailing incomplete UTF-8 byte sequences
# will not be treated as an error. Those bytes will not be decoded
# and the number of bytes that have been decoded will be stored in
# consumed. New in version 2.4.
unicode PyUnicode_DecodeUTF8Stateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
# Encode the Py_UNICODE buffer of the given size using UTF-8 and
# return a Python string object. Return NULL if an exception was
# raised by the codec.
bytes PyUnicode_EncodeUTF8(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using UTF-8 and return the result as Python bytes object. Error handling is ``strict''. Return NULL if an exception was raised by the codec.
bytes PyUnicode_AsUTF8String(object unicode)
# Return a pointer to the UTF-8 encoding of the Unicode object,
# and store the size of the encoded representation (in bytes) in size.
# The size argument can be NULL; in this case no size will be stored.
# The returned buffer always has an extra null byte appended
# (not included in size), regardless of whether there are any
# other null code points.
# In the case of an error, NULL is returned with an exception set and
# no size is stored.
# This caches the UTF-8 representation of the string in the Unicode
# object, and subsequent calls will return a pointer to the same buffer.
# The caller is not responsible for deallocating the buffer
const char* PyUnicode_AsUTF8AndSize(object unicode, Py_ssize_t *size)
# These are the UTF-16 codec APIs:
# Decode length bytes from a UTF-16 encoded buffer string and
# return the corresponding Unicode object. errors (if non-NULL)
# defines the error handling. It defaults to ``strict''.
#
# If byteorder is non-NULL, the decoder starts decoding using the
# given byte order:
#
# *byteorder == -1: little endian
# *byteorder == 0: native order
# *byteorder == 1: big endian
#
# and then switches if the first two bytes of the input data are a
# byte order mark (BOM) and the specified byte order is native
# order. This BOM is not copied into the resulting Unicode
# string. After completion, *byteorder is set to the current byte
# order at the.
#
# If byteorder is NULL, the codec starts in native order mode.
unicode PyUnicode_DecodeUTF16(char *s, Py_ssize_t size, char *errors, int *byteorder)
# If consumed is NULL, behave like PyUnicode_DecodeUTF16(). If
# consumed is not NULL, PyUnicode_DecodeUTF16Stateful() will not
# treat trailing incomplete UTF-16 byte sequences (such as an odd
# number of bytes or a split surrogate pair) as an error. Those
# bytes will not be decoded and the number of bytes that have been
# decoded will be stored in consumed. New in version 2.4.
unicode PyUnicode_DecodeUTF16Stateful(char *s, Py_ssize_t size, char *errors, int *byteorder, Py_ssize_t *consumed)
# Return a Python string object holding the UTF-16 encoded value
# of the Unicode data in s. If byteorder is not 0, output is
# written according to the following byte order:
#
# byteorder == -1: little endian
# byteorder == 0: native byte order (writes a BOM mark)
# byteorder == 1: big endian
#
# If byteorder is 0, the output string will always start with the
# Unicode BOM mark (U+FEFF). In the other two modes, no BOM mark
# is prepended.
#
# If Py_UNICODE_WIDE is defined, a single Py_UNICODE value may get
# represented as a surrogate pair. If it is not defined, each
# Py_UNICODE values is interpreted as an UCS-2 character.
bytes PyUnicode_EncodeUTF16(Py_UNICODE *s, Py_ssize_t size, char *errors, int byteorder)
# Return a Python string using the UTF-16 encoding in native byte
# order. The string always starts with a BOM mark. Error handling
# is ``strict''. Return NULL if an exception was raised by the
# codec.
bytes PyUnicode_AsUTF16String(object unicode)
# These are the ``Unicode Escape'' codec APIs:
# Create a Unicode object by decoding size bytes of the
# Unicode-Escape encoded string s. Return NULL if an exception was
# raised by the codec.
object PyUnicode_DecodeUnicodeEscape(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using
# Unicode-Escape and return a Python string object. Return NULL if
# an exception was raised by the codec.
object PyUnicode_EncodeUnicodeEscape(Py_UNICODE *s, Py_ssize_t size)
# Encode a Unicode objects using Unicode-Escape and return the
# result as Python string object. Error handling is
# ``strict''. Return NULL if an exception was raised by the codec.
object PyUnicode_AsUnicodeEscapeString(object unicode)
# These are the ``Raw Unicode Escape'' codec APIs:
# Create a Unicode object by decoding size bytes of the
# Raw-Unicode-Escape encoded string s. Return NULL if an exception
# was raised by the codec.
object PyUnicode_DecodeRawUnicodeEscape(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using
# Raw-Unicode-Escape and return a Python string object. Return
# NULL if an exception was raised by the codec.
object PyUnicode_EncodeRawUnicodeEscape(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using Raw-Unicode-Escape and return the
# result as Python string object. Error handling is
# ``strict''. Return NULL if an exception was raised by the codec.
object PyUnicode_AsRawUnicodeEscapeString(object unicode)
# These are the Latin-1 codec APIs: Latin-1 corresponds to the first 256 Unicode ordinals and only these are accepted by the codecs during encoding.
# Create a Unicode object by decoding size bytes of the Latin-1
# encoded string s. Return NULL if an exception was raised by the
# codec.
unicode PyUnicode_DecodeLatin1(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using Latin-1 and
# return a Python bytes object. Return NULL if an exception was
# raised by the codec.
bytes PyUnicode_EncodeLatin1(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using Latin-1 and return the result as
# Python bytes object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
bytes PyUnicode_AsLatin1String(object unicode)
# These are the ASCII codec APIs. Only 7-bit ASCII data is
# accepted. All other codes generate errors.
# Create a Unicode object by decoding size bytes of the ASCII
# encoded string s. Return NULL if an exception was raised by the
# codec.
unicode PyUnicode_DecodeASCII(char *s, Py_ssize_t size, char *errors)
# Encode the Py_UNICODE buffer of the given size using ASCII and
# return a Python bytes object. Return NULL if an exception was
# raised by the codec.
bytes PyUnicode_EncodeASCII(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using ASCII and return the result as
# Python bytes object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
bytes PyUnicode_AsASCIIString(object o)
# These are the mapping codec APIs:
#
# This codec is special in that it can be used to implement many
# different codecs (and this is in fact what was done to obtain most
# of the standard codecs included in the encodings package). The codec
# uses mapping to encode and decode characters.
#
# Decoding mappings must map single string characters to single
# Unicode characters, integers (which are then interpreted as Unicode
# ordinals) or None (meaning "undefined mapping" and causing an
# error).
#
# Encoding mappings must map single Unicode characters to single
# string characters, integers (which are then interpreted as Latin-1
# ordinals) or None (meaning "undefined mapping" and causing an
# error).
#
# The mapping objects provided must only support the __getitem__
# mapping interface.
#
# If a character lookup fails with a LookupError, the character is
# copied as-is meaning that its ordinal value will be interpreted as
# Unicode or Latin-1 ordinal resp. Because of this, mappings only need
# to contain those mappings which map characters to different code
# points.
# Create a Unicode object by decoding size bytes of the encoded
# string s using the given mapping object. Return NULL if an
# exception was raised by the codec. If mapping is NULL latin-1
# decoding will be done. Else it can be a dictionary mapping byte
# or a unicode string, which is treated as a lookup table. Byte
# values greater that the length of the string and U+FFFE
# "characters" are treated as "undefined mapping". Changed in
# version 2.4: Allowed unicode string as mapping argument.
object PyUnicode_DecodeCharmap(char *s, Py_ssize_t size, object mapping, char *errors)
# Encode the Py_UNICODE buffer of the given size using the given
# mapping object and return a Python string object. Return NULL if
# an exception was raised by the codec.
#
# Deprecated since version 3.3, will be removed in version 4.0.
object PyUnicode_EncodeCharmap(Py_UNICODE *s, Py_ssize_t size, object mapping, char *errors)
# Encode a Unicode objects using the given mapping object and
# return the result as Python string object. Error handling is
# ``strict''. Return NULL if an exception was raised by the codec.
object PyUnicode_AsCharmapString(object o, object mapping)
# The following codec API is special in that maps Unicode to Unicode.
# Translate a Py_UNICODE buffer of the given length by applying a
# character mapping table to it and return the resulting Unicode
# object. Return NULL when an exception was raised by the codec.
#
# The mapping table must map Unicode ordinal integers to Unicode
# ordinal integers or None (causing deletion of the character).
#
# Mapping tables need only provide the __getitem__() interface;
# dictionaries and sequences work well. Unmapped character
# ordinals (ones which cause a LookupError) are left untouched and
# are copied as-is.
#
# Deprecated since version 3.3, will be removed in version 4.0.
object PyUnicode_TranslateCharmap(Py_UNICODE *s, Py_ssize_t size,
object table, char *errors)
# These are the MBCS codec APIs. They are currently only available on
# Windows and use the Win32 MBCS converters to implement the
# conversions. Note that MBCS (or DBCS) is a class of encodings, not
# just one. The target encoding is defined by the user settings on the
# machine running the codec.
# Create a Unicode object by decoding size bytes of the MBCS
# encoded string s. Return NULL if an exception was raised by the
# codec.
unicode PyUnicode_DecodeMBCS(char *s, Py_ssize_t size, char *errors)
# If consumed is NULL, behave like PyUnicode_DecodeMBCS(). If
# consumed is not NULL, PyUnicode_DecodeMBCSStateful() will not
# decode trailing lead byte and the number of bytes that have been
# decoded will be stored in consumed. New in version 2.5.
# NOTE: Python 2.x uses 'int' values for 'size' and 'consumed' (changed in 3.0)
unicode PyUnicode_DecodeMBCSStateful(char *s, Py_ssize_t size, char *errors, Py_ssize_t *consumed)
# Encode the Py_UNICODE buffer of the given size using MBCS and
# return a Python string object. Return NULL if an exception was
# raised by the codec.
bytes PyUnicode_EncodeMBCS(Py_UNICODE *s, Py_ssize_t size, char *errors)
# Encode a Unicode objects using MBCS and return the result as
# Python string object. Error handling is ``strict''. Return NULL
# if an exception was raised by the codec.
bytes PyUnicode_AsMBCSString(object o)
# Encode the Unicode object using the specified code page and return
# a Python bytes object. Return NULL if an exception was raised by the
# codec. Use CP_ACP code page to get the MBCS encoder.
#
# New in version 3.3.
bytes PyUnicode_EncodeCodePage(int code_page, object unicode, const char *errors)
# Py_UCS4 helpers (new in CPython 3.3)
# These utility functions work on strings of Py_UCS4 characters and
# otherwise behave like the C standard library functions with the same name.
size_t Py_UCS4_strlen(const Py_UCS4 *u)
Py_UCS4* Py_UCS4_strcpy(Py_UCS4 *s1, const Py_UCS4 *s2)
Py_UCS4* Py_UCS4_strncpy(Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2)
int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2)
int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n)
Py_UCS4* Py_UCS4_strchr(const Py_UCS4 *s, Py_UCS4 c)
Py_UCS4* Py_UCS4_strrchr(const Py_UCS4 *s, Py_UCS4 c)

View file

@ -0,0 +1,32 @@
# Python version constants
#
# It's better to evaluate these at runtime (i.e. C compile time) using
#
# if PY_MAJOR_VERSION >= 3:
# do_stuff_in_Py3_0_and_later()
# if PY_VERSION_HEX >= 0x02070000:
# do_stuff_in_Py2_7_and_later()
#
# than using the IF/DEF statements, which are evaluated at Cython
# compile time. This will keep your C code portable.
cdef extern from *:
# the complete version, e.g. 0x010502B2 == 1.5.2b2
int PY_VERSION_HEX
# the individual sections as plain numbers
int PY_MAJOR_VERSION
int PY_MINOR_VERSION
int PY_MICRO_VERSION
int PY_RELEASE_LEVEL
int PY_RELEASE_SERIAL
# Note: PY_RELEASE_LEVEL is one of
# 0xA (alpha)
# 0xB (beta)
# 0xC (release candidate)
# 0xF (final)
char PY_VERSION[]
char PY_PATCHLEVEL_REVISION[]

View file

@ -0,0 +1,42 @@
from .object cimport PyObject
cdef extern from "Python.h":
bint PyWeakref_Check(object ob)
# Return true if ob is either a reference or proxy object.
bint PyWeakref_CheckRef(object ob)
# Return true if ob is a reference object.
bint PyWeakref_CheckProxy(ob)
# Return true if *ob* is a proxy object.
object PyWeakref_NewRef(object ob, object callback)
# Return a weak reference object for the object ob. This will
# always return a new reference, but is not guaranteed to create a
# new object; an existing reference object may be returned. The
# second parameter, callback, can be a callable object that
# receives notification when ob is garbage collected; it should
# accept a single parameter, which will be the weak reference
# object itself. callback may also be None or NULL. If ob is not
# a weakly-referencable object, or if callback is not callable,
# None, or NULL, this will return NULL and raise TypeError.
object PyWeakref_NewProxy(object ob, object callback)
# Return a weak reference proxy object for the object ob. This
# will always return a new reference, but is not guaranteed to
# create a new object; an existing proxy object may be returned.
# The second parameter, callback, can be a callable object that
# receives notification when ob is garbage collected; it should
# accept a single parameter, which will be the weak reference
# object itself. callback may also be None or NULL. If ob is not
# a weakly-referencable object, or if callback is not callable,
# None, or NULL, this will return NULL and raise TypeError.
PyObject* PyWeakref_GetObject(object ref) except NULL
# Return the referenced object from a weak reference, ref. If the
# referent is no longer live, returns None.
PyObject* PyWeakref_GET_OBJECT(object ref)
# Similar to PyWeakref_GetObject, but implemented as a macro that
# does no error checking.