mirror of https://github.com/python/cpython
No longer attempt to instantiate python classes describing dialects. This
was done because we were previously performing validation of the dialect from python, but this is now down within the C module. Also, the method we were using to detect classes did not work with new-style classes.
This commit is contained in:
parent
86625972a1
commit
8c94b42f31
|
@ -24,25 +24,12 @@ class Test_Csv(unittest.TestCase):
|
|||
self.assertRaises(TypeError, ctor, arg, delimiter = 0)
|
||||
self.assertRaises(TypeError, ctor, arg, delimiter = 'XX')
|
||||
self.assertRaises(csv.Error, ctor, arg, 'foo')
|
||||
self.assertRaises(TypeError, ctor, arg, None)
|
||||
self.assertRaises(TypeError, ctor, arg, delimiter=None)
|
||||
self.assertRaises(TypeError, ctor, arg, delimiter=1)
|
||||
self.assertRaises(TypeError, ctor, arg, quotechar=1)
|
||||
self.assertRaises(TypeError, ctor, arg, lineterminator=None)
|
||||
self.assertRaises(TypeError, ctor, arg, lineterminator=1)
|
||||
self.assertRaises(TypeError, ctor, arg, quoting=None)
|
||||
# We now allow this, only raising an exception if quoting is needed.
|
||||
# self.assertRaises(TypeError, ctor, arg, quotechar=None)
|
||||
# self.assertRaises(TypeError, ctor, arg,
|
||||
# quoting=csv.QUOTE_NONE, escapechar=None)
|
||||
# No longer complains about dialects with invalid attributes [AM]
|
||||
# class BadDialect:
|
||||
# bad_attr = 0
|
||||
# self.assertRaises(AttributeError, csv.reader, [], BadDialect)
|
||||
class BadClass:
|
||||
def __init__(self):
|
||||
raise IOError
|
||||
self.assertRaises(IOError, csv.reader, [], BadClass)
|
||||
|
||||
def test_reader_arg_valid(self):
|
||||
self._test_arg_valid(csv.reader, [])
|
||||
|
@ -258,11 +245,6 @@ class TestDialectRegistry(unittest.TestCase):
|
|||
self.assertRaises(csv.Error, csv.unregister_dialect, "nonesuch")
|
||||
self.assertRaises(TypeError, csv.register_dialect, None)
|
||||
self.assertRaises(TypeError, csv.register_dialect, None, None)
|
||||
self.assertRaises(TypeError, csv.register_dialect, "nonesuch", None)
|
||||
class bogus:
|
||||
def __init__(self):
|
||||
raise KeyError
|
||||
self.assertRaises(KeyError, csv.register_dialect, "nonesuch", bogus)
|
||||
|
||||
def test_registry(self):
|
||||
class myexceltsv(csv.excel):
|
||||
|
|
|
@ -288,40 +288,6 @@ Dialect_dealloc(DialectObj *self)
|
|||
self->ob_type->tp_free((PyObject *)self);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a new reference to a dialect instance
|
||||
*
|
||||
* If given a string, looks up the name in our dialect registry
|
||||
* If given a class, instantiate (which runs python validity checks)
|
||||
* If given an instance, return a new reference to the instance
|
||||
*/
|
||||
static PyObject *
|
||||
dialect_instantiate(PyObject *dialect)
|
||||
{
|
||||
Py_INCREF(dialect);
|
||||
/* If dialect is a string, look it up in our registry */
|
||||
if (IS_BASESTRING(dialect)) {
|
||||
PyObject * new_dia;
|
||||
new_dia = get_dialect_from_registry(dialect);
|
||||
Py_DECREF(dialect);
|
||||
return new_dia;
|
||||
}
|
||||
/* A class rather than an instance? Instantiate */
|
||||
if (PyObject_TypeCheck(dialect, &PyClass_Type)) {
|
||||
PyObject * new_dia;
|
||||
new_dia = PyObject_CallFunction(dialect, "");
|
||||
Py_DECREF(dialect);
|
||||
return new_dia;
|
||||
}
|
||||
/* Make sure we finally have an instance */
|
||||
if (!PyInstance_Check(dialect)) {
|
||||
PyErr_SetString(PyExc_TypeError, "dialect must be an instance");
|
||||
Py_DECREF(dialect);
|
||||
return NULL;
|
||||
}
|
||||
return dialect;
|
||||
}
|
||||
|
||||
static char *dialect_kws[] = {
|
||||
"dialect",
|
||||
"delimiter",
|
||||
|
@ -371,9 +337,12 @@ dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs)
|
|||
Py_XINCREF(skipinitialspace);
|
||||
Py_XINCREF(strict);
|
||||
if (dialect != NULL) {
|
||||
dialect = dialect_instantiate(dialect);
|
||||
if (IS_BASESTRING(dialect)) {
|
||||
dialect = get_dialect_from_registry(dialect);
|
||||
if (dialect == NULL)
|
||||
goto err;
|
||||
} else
|
||||
Py_INCREF(dialect);
|
||||
#define DIALECT_GETATTR(v, n) \
|
||||
if (v == NULL) \
|
||||
v = PyObject_GetAttrString(dialect, n)
|
||||
|
|
Loading…
Reference in New Issue