summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2002-05-24 19:01:59 (GMT)
committerGuido van Rossum <guido@python.org>2002-05-24 19:01:59 (GMT)
commitcacfc07d083286e80b6f86939d466e186f7ea3c0 (patch)
tree87e5221791901acdca69ef823d93d470679fa49c /Objects
parent9ee4b94f51d19a37db3b93222b5e15c8379db78d (diff)
downloadcpython-cacfc07d083286e80b6f86939d466e186f7ea3c0.zip
cpython-cacfc07d083286e80b6f86939d466e186f7ea3c0.tar.gz
cpython-cacfc07d083286e80b6f86939d466e186f7ea3c0.tar.bz2
- 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.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/object.c3
-rw-r--r--Objects/stringobject.c56
-rw-r--r--Objects/unicodeobject.c4
3 files changed, 61 insertions, 2 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 1bd8db9..b1bf2c3 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -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'");
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 668668c..27b3af4 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -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 */
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 5cc8455..0ac4941 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -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 */