[issue16297] csv.DictReader

2012-10-22 Thread tb

New submission from tb:

The csv.DictReader contains a setter method for the fieldnames 
(@fieldnames.setter). However, the __init__ method does not make use of the 
setter method as it sets _fieldnames directly. To allow users 
correct/functional overriding of the fieldnames.setter method I would propose 
changing the line 

self._fieldnames = fieldnames 

to

self.fieldnames = fieldnames

--
components: Library (Lib)
messages: 173500
nosy: tb
priority: normal
severity: normal
status: open
title: csv.DictReader
type: behavior
versions: Python 3.2

___
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



[issue16297] make csv.DictReader.__init__ use self.fieldnames

2012-10-23 Thread tb

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



[issue16297] make csv.DictReader.__init__ use self.fieldnames

2012-10-23 Thread tb

tb added the comment:

Okay, that makes my use case obsolete. Overwriting the getter method like this 
seems obvious ... Somehow this hasn't come to my mind.

Sorry for bothering. From my point of view, we can close this issue. Or is 
there another use case?

--

___
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