Commit 48fdc799 authored by R David Murray's avatar R David Murray

#19449: Handle non-string keys when generating 'fieldnames' error.

csv was handling non-string keys fine except for the error message
generated when a non-string key was not in 'fieldnames'.

Fix by Tomas Grahn, full patch-with-test by Vajrasky Kok (tweaked slightly).
parent a39073c3
...@@ -146,7 +146,7 @@ class DictWriter: ...@@ -146,7 +146,7 @@ class DictWriter:
wrong_fields = [k for k in rowdict if k not in self.fieldnames] wrong_fields = [k for k in rowdict if k not in self.fieldnames]
if wrong_fields: if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: " raise ValueError("dict contains fields not in fieldnames: "
+ ", ".join(wrong_fields)) + ", ".join([repr(x) for x in wrong_fields]))
return [rowdict.get(key, self.restval) for key in self.fieldnames] return [rowdict.get(key, self.restval) for key in self.fieldnames]
def writerow(self, rowdict): def writerow(self, rowdict):
......
...@@ -570,6 +570,18 @@ class TestDictFields(unittest.TestCase): ...@@ -570,6 +570,18 @@ class TestDictFields(unittest.TestCase):
fileobj = StringIO() fileobj = StringIO()
self.assertRaises(TypeError, csv.DictWriter, fileobj) self.assertRaises(TypeError, csv.DictWriter, fileobj)
def test_write_fields_not_in_fieldnames(self):
with TemporaryFile("w+", newline='') as fileobj:
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)
def test_read_dict_fields(self): def test_read_dict_fields(self):
with TemporaryFile("w+") as fileobj: with TemporaryFile("w+") as fileobj:
fileobj.write("1,2,abc\r\n") fileobj.write("1,2,abc\r\n")
......
...@@ -13,6 +13,9 @@ Core and Builtins ...@@ -13,6 +13,9 @@ Core and Builtins
Library 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.
- Fix test.support.bind_port() to not cause an error when Python was compiled - Fix test.support.bind_port() to not cause an error when Python was compiled
on a system with SO_REUSEPORT defined in the headers but run on a system on a system with SO_REUSEPORT defined in the headers but run on a system
with an OS kernel that does not support that reasonably new socket option. with an OS kernel that does not support that reasonably new socket option.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment