msg201727 - (view) |
Author: Tomas Grahn (tomas_grahn) |
Date: 2013-10-30 10:59 |
When csv.DictWriter.writerow is fed a dict with extra fieldnames (and extrasaction='raise') and any of those extra fieldnames aren't strings, a TypeError-exception is thrown. To fix the issue; in csv.py, edit the line: raise ValueError("dict contains fields not in fieldnames: " + ", ".join(wrong_fields)) to: raise ValueError("dict contains fields not in fieldnames: " + ", ".join(repr(wrong_field) for wrong_field in wrong_fields)) Attached is a patch that fixes the problem (works in both 2.6 and 2.7, I haven't tried anything else). Here is a simple test to demonstrate the problem: import cStringIO, csv sio=cStringIO.StringIO() writer=csv.DictWriter(sio, ["foo", "bar"]) writer.writerow({1:"hello", 2:"world"}) |
|
|
msg201732 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2013-10-30 13:47 |
I would argue that the TypeError is correct (field names must be strings), even though the way it is generated is a bit unorthodox :) Let's see what others think. |
|
|
msg201733 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2013-10-30 13:56 |
Rereading my post I disagree with myself. ValueError is probably better in this context (the difference between ValueError and TypeError is a bit grey, and Python is not necessarily completely consistent about it.) |
|
|
msg201735 - (view) |
Author: Tomas Grahn (tomas_grahn) |
Date: 2013-10-30 14:09 |
If non-string field names aren't allowed then shouldn't they be caught at an earlier stage, rather then when the user feeds writerow a dict with an unexpected key? But why should the field names have to be strings in the first place? Everything else is passed through str before being written anyway... |
|
|
msg201738 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2013-10-30 14:20 |
> But why should the field names have to be strings in the first place? Everything else is passed through str before being written anyway... Good point. |
|
|
msg202680 - (view) |
Author: Vajrasky Kok (vajrasky) * |
Date: 2013-11-12 08:59 |
Here is the preliminary patch. |
|
|
msg203408 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2013-11-19 18:25 |
New changeset 6e5afeada7ca by R David Murray in branch '3.3': #19449: Handle non-string keys when generating 'fieldnames' error. http://hg.python.org/cpython/rev/6e5afeada7ca New changeset ee2c80eeca2a by R David Murray in branch 'default': Merge: #19449: Handle non-string keys when generating 'fieldnames' error. http://hg.python.org/cpython/rev/ee2c80eeca2a New changeset e52d7b173ab5 by R David Murray in branch '2.7': #19449: Handle non-string keys when generating 'fieldnames' error. http://hg.python.org/cpython/rev/e52d7b173ab5 |
|
|
msg203412 - (view) |
Author: R. David Murray (r.david.murray) *  |
Date: 2013-11-19 18:28 |
Thanks, Tomas and Vajrasky. I tweaked the patch slightly: Thomas's fix was better, since it doesn't incur the overhead of the repr unless an an error is detected (a micro-optimization, true, but an easy one). I also chose to only check that 'fieldnames' is mentioned in the non-variable exception text; exactly how the rest of the message text is worded is not part of the API. |
|
|