diff -r cc27d50bd91a Lib/csv.py --- a/Lib/csv.py Fri Jun 14 23:04:02 2013 -0400 +++ b/Lib/csv.py Sat Jun 15 11:19:03 2013 -0700 @@ -129,7 +129,8 @@ class DictWriter: def __init__(self, f, fieldnames, restval="", extrasaction="raise", dialect="excel", *args, **kwds): - self.fieldnames = fieldnames # list of keys for the dict + self._fieldnames = tuple(fieldnames) # list of keys for the dict + self._fieldset = frozenset(fieldnames) # set for key lookup self.restval = restval # for writing short dicts if extrasaction.lower() not in ("raise", "ignore"): raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'" @@ -137,13 +138,17 @@ self.extrasaction = extrasaction self.writer = writer(f, dialect, *args, **kwds) + @property + def fieldnames(self): + return self._fieldnames + def writeheader(self): header = dict(zip(self.fieldnames, self.fieldnames)) self.writerow(header) def _dict_to_list(self, rowdict): if self.extrasaction == "raise": - 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._fieldset] if wrong_fields: raise ValueError("dict contains fields not in fieldnames: " + ", ".join(wrong_fields))