Commit cacfc07d authored by Guido van Rossum's avatar Guido van Rossum

- A new type object, 'string', is added. This is a common base type

  for 'str' and 'unicode', and can be used instead of
  types.StringTypes, e.g. to test whether something is "a string":
  isinstance(x, string) is True for Unicode and 8-bit strings.  This
  is an abstract base class and cannot be instantiated directly.
parent 9ee4b94f
...@@ -39,6 +39,7 @@ typedef struct { ...@@ -39,6 +39,7 @@ typedef struct {
char ob_sval[1]; char ob_sval[1];
} PyStringObject; } PyStringObject;
extern DL_IMPORT(PyTypeObject) PyBaseString_Type;
extern DL_IMPORT(PyTypeObject) PyString_Type; extern DL_IMPORT(PyTypeObject) PyString_Type;
#define PyString_Check(op) PyObject_TypeCheck(op, &PyString_Type) #define PyString_Check(op) PyObject_TypeCheck(op, &PyString_Type)
......
...@@ -6,6 +6,12 @@ Type/class unification and new-style classes ...@@ -6,6 +6,12 @@ Type/class unification and new-style classes
Core and builtins Core and builtins
- A new type object, 'string', is added. This is a common base type
for 'str' and 'unicode', and can be used instead of
types.StringTypes, e.g. to test whether something is "a string":
isinstance(x, string) is True for Unicode and 8-bit strings. This
is an abstract base class and cannot be instantiated directly.
- Deprecated features of xrange objects have been removed as - Deprecated features of xrange objects have been removed as
promised. The start, stop, and step attributes and the tolist() promised. The start, stop, and step attributes and the tolist()
method no longer exist. xrange repetition and slicing have been method no longer exist. xrange repetition and slicing have been
......
...@@ -1779,6 +1779,9 @@ _Py_ReadyTypes(void) ...@@ -1779,6 +1779,9 @@ _Py_ReadyTypes(void)
if (PyType_Ready(&PyBool_Type) < 0) if (PyType_Ready(&PyBool_Type) < 0)
Py_FatalError("Can't initialize 'bool'"); Py_FatalError("Can't initialize 'bool'");
if (PyType_Ready(&PyString_Type) < 0)
Py_FatalError("Can't initialize 'str'");
if (PyType_Ready(&PyList_Type) < 0) if (PyType_Ready(&PyList_Type) < 0)
Py_FatalError("Can't initialize 'list'"); Py_FatalError("Can't initialize 'list'");
......
...@@ -2855,6 +2855,60 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) ...@@ -2855,6 +2855,60 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return pnew; return pnew;
} }
static PyObject *
basestring_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyErr_SetString(PyExc_TypeError,
"The string type cannot be instantiated");
return NULL;
}
static char basestring_doc[] =
"Type string cannot be instantiated; it is the base for str and unicode.";
PyTypeObject PyBaseString_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"string",
0,
0,
0, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
basestring_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
&PyBaseObject_Type, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
basestring_new, /* tp_new */
0, /* tp_free */
};
static char string_doc[] = static char string_doc[] =
"str(object) -> string\n\ "str(object) -> string\n\
\n\ \n\
...@@ -2893,7 +2947,7 @@ PyTypeObject PyString_Type = { ...@@ -2893,7 +2947,7 @@ PyTypeObject PyString_Type = {
string_methods, /* tp_methods */ string_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ 0, /* tp_getset */
0, /* tp_base */ &PyBaseString_Type, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
0, /* tp_descr_set */ 0, /* tp_descr_set */
......
...@@ -5835,7 +5835,7 @@ PyTypeObject PyUnicode_Type = { ...@@ -5835,7 +5835,7 @@ PyTypeObject PyUnicode_Type = {
unicode_methods, /* tp_methods */ unicode_methods, /* tp_methods */
0, /* tp_members */ 0, /* tp_members */
0, /* tp_getset */ 0, /* tp_getset */
0, /* tp_base */ &PyBaseString_Type, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
0, /* tp_descr_get */ 0, /* tp_descr_get */
0, /* tp_descr_set */ 0, /* tp_descr_set */
...@@ -5859,6 +5859,8 @@ void _PyUnicode_Init(void) ...@@ -5859,6 +5859,8 @@ void _PyUnicode_Init(void)
strcpy(unicode_default_encoding, "ascii"); strcpy(unicode_default_encoding, "ascii");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
unicode_latin1[i] = NULL; unicode_latin1[i] = NULL;
if (PyType_Ready(&PyUnicode_Type) < 0)
Py_FatalError("Can't initialize 'unicode'");
} }
/* Finalize the Unicode implementation */ /* Finalize the Unicode implementation */
......
...@@ -1905,6 +1905,7 @@ _PyBuiltin_Init(void) ...@@ -1905,6 +1905,7 @@ _PyBuiltin_Init(void)
SETBUILTIN("object", &PyBaseObject_Type); SETBUILTIN("object", &PyBaseObject_Type);
SETBUILTIN("staticmethod", &PyStaticMethod_Type); SETBUILTIN("staticmethod", &PyStaticMethod_Type);
SETBUILTIN("str", &PyString_Type); SETBUILTIN("str", &PyString_Type);
SETBUILTIN("string", &PyBaseString_Type);
SETBUILTIN("super", &PySuper_Type); SETBUILTIN("super", &PySuper_Type);
SETBUILTIN("tuple", &PyTuple_Type); SETBUILTIN("tuple", &PyTuple_Type);
SETBUILTIN("type", &PyType_Type); SETBUILTIN("type", &PyType_Type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment