Python 3.1 adds a new C datatype,
PyCapsule
, for providing a C API to an extension module. A capsule is essentially the holder of a C void *
pointer, and is made available as a module attribute; for example, the socket
module’s API is exposed as socket.CAPI
, and unicodedata
exposes ucnhash_CAPI
. Other extensions can import the module, access its dictionary to get the capsule object, and then get the void *
pointer, which will usually point to an array of pointers to the module’s various API functions.
There is an existing data type already used for this,
PyCObject
, but it doesn’t provide type safety. Evil code written in pure Python could cause a segmentation fault by taking a PyCObject
from module A and somehow substituting it for the PyCObject
in module B. Capsules know their own name, and getting the pointer requires providing the name:
You are assured that
vtable
points to whatever you’re expecting. If a different capsule was passed in, PyCapsule_IsValid()
would detect the mismatched name and return false. Refer to Providing a C API for an Extension Module for more information on using these objects.
Python 2.7 now uses capsules internally to provide various extension-module APIs, but the
PyCObject_AsVoidPtr()
was modified to handle capsules, preserving compile-time compatibility with the CObject
interface. Use of PyCObject_AsVoidPtr()
will signal a PendingDeprecationWarning
, which is silent by default.
Implemented in Python 3.1 and backported to 2.7 by Larry Hastings; discussed in bpo-5630.
No comments:
Post a Comment