- 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.
This commit is contained in:
Guido van Rossum 2002-05-24 19:01:59 +00:00
parent 9ee4b94f51
commit cacfc07d08
6 changed files with 69 additions and 2 deletions

View 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)

View file

@ -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

View 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'");

View 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 */

View 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 */

View 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);