Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (Revision 83227) +++ Objects/unicodeobject.c (Arbeitskopie) @@ -8825,8 +8825,6 @@ {"zfill", (PyCFunction) unicode_zfill, METH_VARARGS, zfill__doc__}, {"format", (PyCFunction) do_string_format, METH_VARARGS | METH_KEYWORDS, format__doc__}, {"__format__", (PyCFunction) unicode__format__, METH_VARARGS, p_format__doc__}, - {"_formatter_field_name_split", (PyCFunction) formatter_field_name_split, METH_NOARGS}, - {"_formatter_parser", (PyCFunction) formatter_parser, METH_NOARGS}, {"maketrans", (PyCFunction) unicode_maketrans, METH_VARARGS | METH_STATIC, maketrans__doc__}, {"__sizeof__", (PyCFunction) unicode__sizeof__, METH_NOARGS, sizeof__doc__}, @@ -9966,6 +9964,36 @@ } +/* A _string module, to export formatter_parser and formatter_field_name_split + to the string.Formatter class implemented in Python. */ + +static PyMethodDef _string_methods[] = { + {"formatter_field_name_split", (PyCFunction) formatter_field_name_split, + METH_O, PyDoc_STR("split the argument as a field name")}, + {"formatter_parser", (PyCFunction) formatter_parser, + METH_O, PyDoc_STR("parse the argument as a format string")}, + {NULL, NULL} +}; + +static struct PyModuleDef _string_module = { + PyModuleDef_HEAD_INIT, + "_string", + PyDoc_STR("string helper module"), + 0, + _string_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC +PyInit__string(void) +{ + return PyModule_Create(&_string_module); +} + + #ifdef __cplusplus } #endif Index: Objects/stringlib/string_format.h =================================================================== --- Objects/stringlib/string_format.h (Revision 83219) +++ Objects/stringlib/string_format.h (Arbeitskopie) @@ -1180,7 +1180,7 @@ describing the parsed elements. It's a wrapper around stringlib/string_format.h's MarkupIterator */ static PyObject * -formatter_parser(STRINGLIB_OBJECT *self) +formatter_parser(PyObject *ignored, STRINGLIB_OBJECT *self) { formatteriterobject *it; @@ -1315,7 +1315,7 @@ field_name_split. The iterator it returns is a FieldNameIterator */ static PyObject * -formatter_field_name_split(STRINGLIB_OBJECT *self) +formatter_field_name_split(PyObject *ignored, STRINGLIB_OBJECT *self) { SubString first; Py_ssize_t first_idx; Index: PC/config.c =================================================================== --- PC/config.c (Revision 83219) +++ PC/config.c (Arbeitskopie) @@ -62,6 +62,7 @@ extern PyObject* PyInit__pickle(void); extern PyObject* PyInit_atexit(void); extern PyObject* _PyWarnings_Init(void); +extern PyObject* PyInit__string(void); /* tools/freeze/makeconfig.py marker for additional "extern" */ /* -- ADDMODULE MARKER 1 -- */ @@ -147,6 +148,7 @@ {"builtins", NULL}, {"sys", NULL}, {"_warnings", _PyWarnings_Init}, + {"_string", PyInit__string}, {"_io", PyInit__io}, {"_pickle", PyInit__pickle}, Index: Lib/string.py =================================================================== --- Lib/string.py (Revision 83219) +++ Lib/string.py (Arbeitskopie) @@ -14,6 +14,8 @@ """ +import _string + # Some strings for ctype-style character classification whitespace = ' \t\n\r\v\f' ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz' @@ -175,8 +177,8 @@ # The hard parts are reused from the C implementation. They're exposed as "_" # prefixed methods of str and unicode. -# The overall parser is implemented in str._formatter_parser. -# The field name parser is implemented in str._formatter_field_name_split +# The overall parser is implemented in _string.formatter_parser. +# The field name parser is implemented in _string.formatter_field_name_split class Formatter: def format(self, format_string, *args, **kwargs): @@ -256,7 +258,7 @@ # if field_name is not None, it is looked up, formatted # with format_spec and conversion and then used def parse(self, format_string): - return format_string._formatter_parser() + return _string.formatter_parser(format_string) # given a field_name, find the object it references. @@ -265,7 +267,7 @@ # used_args: a set of which args have been used # args, kwargs: as passed in to vformat def get_field(self, field_name, args, kwargs): - first, rest = field_name._formatter_field_name_split() + first, rest = _string.formatter_field_name_split(field_name) obj = self.get_value(first, args, kwargs) Index: Modules/config.c.in =================================================================== --- Modules/config.c.in (Revision 83219) +++ Modules/config.c.in (Arbeitskopie) @@ -29,6 +29,7 @@ extern PyObject* PyInit_gc(void); extern PyObject* PyInit__ast(void); extern PyObject* _PyWarnings_Init(void); +extern PyObject* PyInit__string(void); struct _inittab _PyImport_Inittab[] = { @@ -54,6 +55,9 @@ /* This lives in _warnings.c */ {"_warnings", _PyWarnings_Init}, + /* This lives in Objects/unicodeobject.c */ + {"_string", PyInit__string}, + /* Sentinel */ {0, 0} };