mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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
2 changed files with 6 additions and 55 deletions
|
@ -24,25 +24,12 @@ class Test_Csv(unittest.TestCase):
|
||||||
self.assertRaises(TypeError, ctor, arg, delimiter = 0)
|
self.assertRaises(TypeError, ctor, arg, delimiter = 0)
|
||||||
self.assertRaises(TypeError, ctor, arg, delimiter = 'XX')
|
self.assertRaises(TypeError, ctor, arg, delimiter = 'XX')
|
||||||
self.assertRaises(csv.Error, ctor, arg, 'foo')
|
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=None)
|
||||||
self.assertRaises(TypeError, ctor, arg, delimiter=1)
|
self.assertRaises(TypeError, ctor, arg, delimiter=1)
|
||||||
self.assertRaises(TypeError, ctor, arg, quotechar=1)
|
self.assertRaises(TypeError, ctor, arg, quotechar=1)
|
||||||
self.assertRaises(TypeError, ctor, arg, lineterminator=None)
|
self.assertRaises(TypeError, ctor, arg, lineterminator=None)
|
||||||
self.assertRaises(TypeError, ctor, arg, lineterminator=1)
|
self.assertRaises(TypeError, ctor, arg, lineterminator=1)
|
||||||
self.assertRaises(TypeError, ctor, arg, quoting=None)
|
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):
|
def test_reader_arg_valid(self):
|
||||||
self._test_arg_valid(csv.reader, [])
|
self._test_arg_valid(csv.reader, [])
|
||||||
|
@ -258,11 +245,6 @@ class TestDialectRegistry(unittest.TestCase):
|
||||||
self.assertRaises(csv.Error, csv.unregister_dialect, "nonesuch")
|
self.assertRaises(csv.Error, csv.unregister_dialect, "nonesuch")
|
||||||
self.assertRaises(TypeError, csv.register_dialect, None)
|
self.assertRaises(TypeError, csv.register_dialect, None)
|
||||||
self.assertRaises(TypeError, csv.register_dialect, None, 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):
|
def test_registry(self):
|
||||||
class myexceltsv(csv.excel):
|
class myexceltsv(csv.excel):
|
||||||
|
|
|
@ -288,40 +288,6 @@ Dialect_dealloc(DialectObj *self)
|
||||||
self->ob_type->tp_free((PyObject *)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[] = {
|
static char *dialect_kws[] = {
|
||||||
"dialect",
|
"dialect",
|
||||||
"delimiter",
|
"delimiter",
|
||||||
|
@ -371,9 +337,12 @@ dialect_init(DialectObj * self, PyObject * args, PyObject * kwargs)
|
||||||
Py_XINCREF(skipinitialspace);
|
Py_XINCREF(skipinitialspace);
|
||||||
Py_XINCREF(strict);
|
Py_XINCREF(strict);
|
||||||
if (dialect != NULL) {
|
if (dialect != NULL) {
|
||||||
dialect = dialect_instantiate(dialect);
|
if (IS_BASESTRING(dialect)) {
|
||||||
|
dialect = get_dialect_from_registry(dialect);
|
||||||
if (dialect == NULL)
|
if (dialect == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
} else
|
||||||
|
Py_INCREF(dialect);
|
||||||
#define DIALECT_GETATTR(v, n) \
|
#define DIALECT_GETATTR(v, n) \
|
||||||
if (v == NULL) \
|
if (v == NULL) \
|
||||||
v = PyObject_GetAttrString(dialect, n)
|
v = PyObject_GetAttrString(dialect, n)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue