[Python-Dev] New PEP: Using ssize_t as the index type (original) (raw)

Tim Peters tim.peters at gmail.com
Thu Dec 29 22:34:45 CET 2005


[Martin v. Löwis] ...

PEP: XXX Title: Using ssizet as the index type

+1, and for Python 2.5, and the sooner done the less painful for all. Same concerns as Armin, where this is especially unattractive:

The conversion codes 's#' and 't#' will output Pyssizet if the macro PYSIZETCLEAN is defined before Python.h is included, and continue to output int if that macro isn't defined.

Better to use a new gibberish character and deprecate the old one? Otherwise I'm afraid we'll be stuck supporting PY_SIZE_T_CLEAN forever, and it's not good to have the meaning of a format string depend on the presence or absence of a #define far away in the file.

A suggestion:

...

In these cases, three strategies are available:

* statically determine that the size can never exceed an int (e.g. when taking the sizeof a struct, or the strlen of a file pathname). In this case, add a debug assert() that the value is indeed smaller than INTMAX, and cast the value to int.

That can be done in one gulp via:

some_int = Py_SAFE_DOWNCAST(some_value, Py_ssize_t, int);

In a debug build that will assert-fail if some_value loses info when cast from Py_ssize_t to int. If people had been careful, this would already be in use when casting from size_t to int; there's even one place in unicodeobject.c that does so ;-).



More information about the Python-Dev mailing list