[Python-checkins] r42367 - peps/trunk/pep-0357.txt

guido.van.rossum python-checkins at python.org
Wed Feb 15 02:12:08 CET 2006


Author: guido.van.rossum
Date: Wed Feb 15 02:12:07 2006
New Revision: 42367
Modified:
 peps/trunk/pep-0357.txt
Log:
New version from Travis, with new specs.
Modified: peps/trunk/pep-0357.txt
==============================================================================
--- peps/trunk/pep-0357.txt	(original)
+++ peps/trunk/pep-0357.txt	Wed Feb 15 02:12:07 2006
@@ -28,9 +28,10 @@
 In NumPy, for example, there are 8 different integer scalars
 corresponding to unsigned and signed integers of 8, 16, 32, and 64
 bits. These type-objects could reasonably be used as integers in
- many places where Python expects true integers. There should be
- some way to be able to tell Python that an object can behave like
- an integer.
+ many places where Python expects true integers but cannot inherit from 
+ the Python integer type because of incompatible memory layouts. 
+ There should be some way to be able to tell Python that an object can 
+ behave like an integer.
 
 It is not possible to use the nb_int (and __int__ special method)
 for this purpose because that method is used to *coerce* objects
@@ -45,15 +46,41 @@
 
 Add an nb_index slot to PyNumberMethods, and a corresponding
 __index__ special method. Objects could define a function to place
- in the nb_index slot that returns an appropriate C-integer for use
- as ilow or ihigh in PySequence_GetSlice, PySequence_SetSlice, and
- PySequence_DelSlice. This integer could also be used elsewhere by
- Python when a C-integer is required. 
+ in the nb_index slot that returns an appropriate C-integer (Py_ssize_t
+ after PEP 353). This C-integer will be used whenever Python needs
+ one such as in PySequence_GetSlice, PySequence_SetSlice, and
+ PySequence_DelSlice. 
 
+Specification:
+ 
+ 1) The nb_index slot will have the signature
+
+ Py_ssize_t index_func (PyObject *self)
+
+ 2) The __index__ special method will have the signature
+
+ def __index__(self):
+ return obj
+ 
+ Where obj must be either an int or a long or another object that has the
+ __index__ special method (but not self).
+
+ 3) A new C-API function PyNumber_Index will be added with signature
+
+ Py_ssize_t PyNumber_index (PyObject *obj)
+
+ which will special-case integer and long integer objects but otherwise
+ return obj->ob_type->tp_as_number->nb_index(obj) if it is available. 
+ A -1 will be returned and an exception set on an error. 
+
+ 4) A new operator.index(obj) function will be added that calls
+ equivalent of obj.__index__() and raises an error if obj does not implement
+ the special method.
+ 
 Implementation Plan
 
 1) Add the nb_index slot in object.h and modify typeobject.c to 
- create the __index__ method. 
+ create the __index__ method
 
 2) Change the ISINT macro in ceval.c to ISINDEX and alter it to 
 accomodate objects with the index slot defined.
@@ -66,9 +93,10 @@
 check for the slot as well.
 
 5) Add PyNumber_Index C-API to return an integer from any 
- Python Object that has the nb_index slot.
+ Python Object that has the nb_index slot. 
+
+ 6) Add the operator.index(x) function.
 
- 6) Add an operator.index(x) function that calls x.__index__()
 
 Possible Concerns
 
@@ -95,8 +123,16 @@
 interpretations of the slot are possible. For example, the slot
 can be used any time Python requires an integer internally (such
 as in "mystring" * 3). The name was suggested by Guido because
- slicing syntax is the biggest reason for having such a slot and no
- better name emerged.
+ slicing syntax is the biggest reason for having such a slot and 
+ in the end no better name emerged.
+
+ Why return Py_ssize_t from nb_index? 
+
+ The nb_index slot is primarily intended to return an integer
+ needed by the sequence interface. In Python 2.5 this is
+ Py_ssize_t. As this is the primary purpose of the slot, it
+ makes sense to return the C-integer directly and not wrapped
+ in a Python int object. 
 
 Reference Implementation
 


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /