tb added the comment:
This is my use case:
I am creating a custom DictReader class for reading and accessing the columns
white space and case insensitive.
For this I created a dict subclass (DictInsensitive) with a custom __getitem__
method. DictReaderInsensitive.__next__ overrides the original
DictReader.__next__ by returning a DictInsensitive. I also override the
DictReader.fieldnames property to lower/strip all fieldnames.
See http://stackoverflow.com/a/12970460/1251007 for an example.
This is all functional with the current csv.DictReader. All entries in
DictReaderInsensitive.fieldnames are in lower case and without white space and
by iterating over the lines I get dictionaries where I can access the keys
white space/case insensitive.
Now, the problem is: If I want the check wether a specific fieldname is present
in the input file, I have strip()/lower() "by hand":
csv_in = DictReaderInsensitive(open(input_file, 'rU'))
if "Fieldname to check".strip().lower() in csv_in.fieldnames
To do this automatically, I created a ListInsensitive as a subclass of list:
class ListInsensitive(list):
def __contains__(self, item):
return list.__contains__(self, item.strip().lower())
Now I want csv.DictReader to use that new class. I thought of overwriting the
setter method, but here lies the current problem. I can overwrite the setter
method, but csv.DictReader does not use the setter method internally.
My setter method looks like this:
@fieldnames.setter
def fieldnames(self, value):
if value == None:
self._fieldnames = None
else:
self._fieldnames = ListInsensitive()
for name in value:
self._fieldnames.append(name.strip().lower())
--
___
Python tracker
<http://bugs.python.org/issue16297>
___
___
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com