]> granicus.if.org Git - python/commitdiff
- A new type object, 'string', is added. This is a common base type
authorGuido van Rossum <guido@python.org>
Fri, 24 May 2002 19:01:59 +0000 (19:01 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 24 May 2002 19:01:59 +0000 (19:01 +0000)
  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.

Include/stringobject.h
Misc/NEWS
Objects/object.c
Objects/stringobject.c
Objects/unicodeobject.c
Python/bltinmodule.c

index 904945527e9a250346ef7c849eec8b2f9072104f..2a56ef639bf08b4b056d2bb65372d316225cd55c 100644 (file)
@@ -39,6 +39,7 @@ typedef struct {
     char ob_sval[1];
 } PyStringObject;
 
+extern DL_IMPORT(PyTypeObject) PyBaseString_Type;
 extern DL_IMPORT(PyTypeObject) PyString_Type;
 
 #define PyString_Check(op) PyObject_TypeCheck(op, &PyString_Type)
index ff3fdc6b752b0609755236b2b12eb5c03c325bcc..f544af42cf21cec0664739a2cb3c07512e85823d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -6,6 +6,12 @@ Type/class unification and new-style classes
 
 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
   promised.  The start, stop, and step attributes and the tolist()
   method no longer exist.  xrange repetition and slicing have been
index 1bd8db924d8dd9ba27f7dc5791640ad26598f25d..b1bf2c3cdbdf1b8b3601986849a37f5a2a44bcb5 100644 (file)
@@ -1779,6 +1779,9 @@ _Py_ReadyTypes(void)
        if (PyType_Ready(&PyBool_Type) < 0)
                Py_FatalError("Can't initialize 'bool'");
 
+       if (PyType_Ready(&PyString_Type) < 0)
+               Py_FatalError("Can't initialize 'str'");
+
        if (PyType_Ready(&PyList_Type) < 0)
                Py_FatalError("Can't initialize 'list'");
 
index 668668ca4d0920813e8fdcb528937bb15735f9a3..27b3af4de1cd5b1d1739e143ed3fd3931a1742c3 100644 (file)
@@ -2855,6 +2855,60 @@ str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        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[] =
 "str(object) -> string\n\
 \n\
@@ -2893,7 +2947,7 @@ PyTypeObject PyString_Type = {
        string_methods,                         /* tp_methods */
        0,                                      /* tp_members */
        0,                                      /* tp_getset */
-       0,                                      /* tp_base */
+       &PyBaseString_Type,                     /* tp_base */
        0,                                      /* tp_dict */
        0,                                      /* tp_descr_get */
        0,                                      /* tp_descr_set */
index 5cc8455be6c2e50c20f4e919afc9c469ca7ad82f..0ac4941de160429d096021dfe78b9febbc9229a2 100644 (file)
@@ -5835,7 +5835,7 @@ PyTypeObject PyUnicode_Type = {
     unicode_methods,                   /* tp_methods */
     0,                                 /* tp_members */
     0,                                 /* tp_getset */
-    0,                                 /* tp_base */
+    &PyBaseString_Type,                        /* tp_base */
     0,                                 /* tp_dict */
     0,                                 /* tp_descr_get */
     0,                                 /* tp_descr_set */
@@ -5859,6 +5859,8 @@ void _PyUnicode_Init(void)
     strcpy(unicode_default_encoding, "ascii");
     for (i = 0; i < 256; i++)
        unicode_latin1[i] = NULL;
+    if (PyType_Ready(&PyUnicode_Type) < 0)
+       Py_FatalError("Can't initialize 'unicode'");
 }
 
 /* Finalize the Unicode implementation */
index d0411e23ae74dcfe2803f80bd65a5b0f0e085b98..311176eb0db083358617f49903a3e70e48ac2430 100644 (file)
@@ -1905,6 +1905,7 @@ _PyBuiltin_Init(void)
        SETBUILTIN("object",            &PyBaseObject_Type);
        SETBUILTIN("staticmethod",      &PyStaticMethod_Type);
        SETBUILTIN("str",               &PyString_Type);
+       SETBUILTIN("string",            &PyBaseString_Type);
        SETBUILTIN("super",             &PySuper_Type);
        SETBUILTIN("tuple",             &PyTuple_Type);
        SETBUILTIN("type",              &PyType_Type);