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)
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
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'");
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\
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 */
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 */
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 */
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);