summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2013-11-19 18:25:24 (GMT)
committerR David Murray <rdmurray@bitdance.com>2013-11-19 18:25:24 (GMT)
commiteccf9c2e2f0507bd4893b087c83d197b32c62b43 (patch)
tree157d48700f377d20e62e3c90375603e198e22488
parentbab2415eab4ff37d33f7921ca4f1b75bde24635d (diff)
downloadcpython-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.py4
-rw-r--r--Lib/test/test_csv.py17
-rw-r--r--Misc/NEWS3
3 files changed, 22 insertions, 2 deletions
diff --git a/Lib/csv.py b/Lib/csv.py
index 98480ba..fc080cc 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -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")
diff --git a/Misc/NEWS b/Misc/NEWS
index 77bc5a8..d5ed3c9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.