diff options
author | R David Murray <rdmurray@bitdance.com> | 2013-11-19 18:25:24 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2013-11-19 18:25:24 (GMT) |
commit | eccf9c2e2f0507bd4893b087c83d197b32c62b43 (patch) | |
tree | 157d48700f377d20e62e3c90375603e198e22488 | |
parent | bab2415eab4ff37d33f7921ca4f1b75bde24635d (diff) | |
download | cpython-eccf9c2e2f0507bd4893b087c83d197b32c62b43.zip cpython-eccf9c2e2f0507bd4893b087c83d197b32c62b43.tar.gz cpython-eccf9c2e2f0507bd4893b087c83d197b32c62b43.tar.bz2 |
#19449: Handle non-string keys when generating 'fieldnames' error.
Backport from 3.3 6e5afeada7ca.
-rw-r--r-- | Lib/csv.py | 4 | ||||
-rw-r--r-- | Lib/test/test_csv.py | 17 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 22 insertions, 2 deletions
@@ -140,8 +140,8 @@ class DictWriter: if self.extrasaction == "raise": wrong_fields = [k for k in rowdict if k not in self.fieldnames] if wrong_fields: - raise ValueError("dict contains fields not in fieldnames: " + - ", ".join(wrong_fields)) + raise ValueError("dict contains fields not in fieldnames: " + + ", ".join([repr(x) for x in wrong_fields])) return [rowdict.get(key, self.restval) for key in self.fieldnames] def writerow(self, rowdict): diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py index d3c1dec..5c95fe3 100644 --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -630,6 +630,23 @@ class TestDictFields(unittest.TestCase): fileobj = StringIO() self.assertRaises(TypeError, csv.DictWriter, fileobj) + def test_write_fields_not_in_fieldnames(self): + fd, name = tempfile.mkstemp() + fileobj = os.fdopen(fd, "w+b") + try: + writer = csv.DictWriter(fileobj, fieldnames = ["f1", "f2", "f3"]) + # Of special note is the non-string key (issue 19449) + with self.assertRaises(ValueError) as cx: + writer.writerow({"f4": 10, "f2": "spam", 1: "abc"}) + exception = str(cx.exception) + self.assertIn("fieldnames", exception) + self.assertIn("'f4'", exception) + self.assertNotIn("'f2'", exception) + self.assertIn("1", exception) + finally: + fileobj.close() + os.unlink(name) + def test_read_dict_fields(self): fd, name = tempfile.mkstemp() fileobj = os.fdopen(fd, "w+b") @@ -12,6 +12,9 @@ Core and Builtins Library ------- +- Issue #19449: in csv's writerow, handle non-string keys when generating the + error message that certain keys are not in the 'fieldnames' list. + - Issue #12853: Fix NameError in distutils.command.upload. - Issue #19523: Closed FileHandler leak which occurred when delay was set. |