mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
abstract.h: remove long outdated comment
Issue #28838: The documentation is of the Python C API is more complete and more up to date than this old comment. Removal suggested by Antoine Pitrou.
This commit is contained in:
parent
af324157c6
commit
b6522d0f77
1 changed files with 2 additions and 118 deletions
|
@ -1,127 +1,11 @@
|
||||||
|
/* Abstract Object Interface (many thanks to Jim Fulton) */
|
||||||
|
|
||||||
#ifndef Py_ABSTRACTOBJECT_H
|
#ifndef Py_ABSTRACTOBJECT_H
|
||||||
#define Py_ABSTRACTOBJECT_H
|
#define Py_ABSTRACTOBJECT_H
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Abstract Object Interface (many thanks to Jim Fulton) */
|
|
||||||
|
|
||||||
/*
|
|
||||||
PROPOSAL: A Generic Python Object Interface for Python C Modules
|
|
||||||
|
|
||||||
Problem
|
|
||||||
|
|
||||||
Python modules written in C that must access Python objects must do
|
|
||||||
so through routines whose interfaces are described by a set of
|
|
||||||
include files. Unfortunately, these routines vary according to the
|
|
||||||
object accessed. To use these routines, the C programmer must check
|
|
||||||
the type of the object being used and must call a routine based on
|
|
||||||
the object type. For example, to access an element of a sequence,
|
|
||||||
the programmer must determine whether the sequence is a list or a
|
|
||||||
tuple:
|
|
||||||
|
|
||||||
if (is_tupleobject(o))
|
|
||||||
e = gettupleitem(o, i)
|
|
||||||
else if (is_listitem(o))
|
|
||||||
e = getlistitem(o, i)
|
|
||||||
|
|
||||||
If the programmer wants to get an item from another type of object
|
|
||||||
that provides sequence behavior, there is no clear way to do it
|
|
||||||
correctly.
|
|
||||||
|
|
||||||
The persistent programmer may peruse object.h and find that the
|
|
||||||
_typeobject structure provides a means of invoking up to (currently
|
|
||||||
about) 41 special operators. So, for example, a routine can get an
|
|
||||||
item from any object that provides sequence behavior. However, to
|
|
||||||
use this mechanism, the programmer must make their code dependent on
|
|
||||||
the current Python implementation.
|
|
||||||
|
|
||||||
Also, certain semantics, especially memory management semantics, may
|
|
||||||
differ by the type of object being used. Unfortunately, these
|
|
||||||
semantics are not clearly described in the current include files.
|
|
||||||
An abstract interface providing more consistent semantics is needed.
|
|
||||||
|
|
||||||
Proposal
|
|
||||||
|
|
||||||
I propose the creation of a standard interface (with an associated
|
|
||||||
library of routines and/or macros) for generically obtaining the
|
|
||||||
services of Python objects. This proposal can be viewed as one
|
|
||||||
components of a Python C interface consisting of several components.
|
|
||||||
|
|
||||||
From the viewpoint of C access to Python services, we have (as
|
|
||||||
suggested by Guido in off-line discussions):
|
|
||||||
|
|
||||||
- "Very high level layer": two or three functions that let you exec or
|
|
||||||
eval arbitrary Python code given as a string in a module whose name is
|
|
||||||
given, passing C values in and getting C values out using
|
|
||||||
mkvalue/getargs style format strings. This does not require the user
|
|
||||||
to declare any variables of type "PyObject *". This should be enough
|
|
||||||
to write a simple application that gets Python code from the user,
|
|
||||||
execs it, and returns the output or errors. (Error handling must also
|
|
||||||
be part of this API.)
|
|
||||||
|
|
||||||
- "Abstract objects layer": which is the subject of this proposal.
|
|
||||||
It has many functions operating on objects, and lest you do many
|
|
||||||
things from C that you can also write in Python, without going
|
|
||||||
through the Python parser.
|
|
||||||
|
|
||||||
- "Concrete objects layer": This is the public type-dependent
|
|
||||||
interface provided by the standard built-in types, such as floats,
|
|
||||||
strings, and lists. This interface exists and is currently
|
|
||||||
documented by the collection of include files provided with the
|
|
||||||
Python distributions.
|
|
||||||
|
|
||||||
From the point of view of Python accessing services provided by C
|
|
||||||
modules:
|
|
||||||
|
|
||||||
- "Python module interface": this interface consist of the basic
|
|
||||||
routines used to define modules and their members. Most of the
|
|
||||||
current extensions-writing guide deals with this interface.
|
|
||||||
|
|
||||||
- "Built-in object interface": this is the interface that a new
|
|
||||||
built-in type must provide and the mechanisms and rules that a
|
|
||||||
developer of a new built-in type must use and follow.
|
|
||||||
|
|
||||||
This proposal is a "first-cut" that is intended to spur
|
|
||||||
discussion. See especially the lists of notes.
|
|
||||||
|
|
||||||
The Python C object interface will provide four protocols: object,
|
|
||||||
numeric, sequence, and mapping. Each protocol consists of a
|
|
||||||
collection of related operations. If an operation that is not
|
|
||||||
provided by a particular type is invoked, then a standard exception,
|
|
||||||
NotImplementedError is raised with an operation name as an argument.
|
|
||||||
In addition, for convenience this interface defines a set of
|
|
||||||
constructors for building objects of built-in types. This is needed
|
|
||||||
so new objects can be returned from C functions that otherwise treat
|
|
||||||
objects generically.
|
|
||||||
|
|
||||||
Memory Management
|
|
||||||
|
|
||||||
For all of the functions described in this proposal, if a function
|
|
||||||
retains a reference to a Python object passed as an argument, then the
|
|
||||||
function will increase the reference count of the object. It is
|
|
||||||
unnecessary for the caller to increase the reference count of an
|
|
||||||
argument in anticipation of the object's retention.
|
|
||||||
|
|
||||||
All Python objects returned from functions should be treated as new
|
|
||||||
objects. Functions that return objects assume that the caller will
|
|
||||||
retain a reference and the reference count of the object has already
|
|
||||||
been incremented to account for this fact. A caller that does not
|
|
||||||
retain a reference to an object that is returned from a function
|
|
||||||
must decrement the reference count of the object (using
|
|
||||||
DECREF(object)) to prevent memory leaks.
|
|
||||||
|
|
||||||
Note that the behavior mentioned here is different from the current
|
|
||||||
behavior for some objects (e.g. lists and tuples) when certain
|
|
||||||
type-specific routines are called directly (e.g. setlistitem). The
|
|
||||||
proposed abstraction layer will provide a consistent memory
|
|
||||||
management interface, correcting for inconsistent behavior for some
|
|
||||||
built-in types.
|
|
||||||
|
|
||||||
Protocols
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* === Object Protocol ================================================== */
|
/* === Object Protocol ================================================== */
|
||||||
|
|
||||||
/* Implemented elsewhere:
|
/* Implemented elsewhere:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue