Skip to content

Commit e9da55b

Browse files
authored
Raise HeadersNeeded instead of TypeError when subscripting a headerless Dataset by column name (#648)
1 parent 64f0201 commit e9da55b

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

src/tablib/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ def __len__(self):
176176

177177
def __getitem__(self, key):
178178
if isinstance(key, str):
179+
if self.headers is None:
180+
raise HeadersNeeded()
179181
if key in self.headers:
180182
pos = self.headers.index(key) # get 'key' index from each data
181183
return [row[pos] for row in self._data]
@@ -194,6 +196,8 @@ def __setitem__(self, key, value):
194196

195197
def __delitem__(self, key):
196198
if isinstance(key, str):
199+
if self.headers is None:
200+
raise HeadersNeeded()
197201

198202
if key in self.headers:
199203

tests/test_tablib.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,20 @@ def test_delete(self):
322322
# Delete from invalid index
323323
self.assertRaises(IndexError, self.founders.__delitem__, 3)
324324

325+
def test_getitem_str_key_no_headers_raises(self):
326+
"""Verify that accessing by column name on a headerless Dataset raises HeadersNeeded."""
327+
d = tablib.Dataset()
328+
d.append([1, 2, 3])
329+
with self.assertRaises(tablib.core.HeadersNeeded):
330+
_ = d['col']
331+
332+
def test_delitem_str_key_no_headers_raises(self):
333+
"""Verify that deleting by column name on a headerless Dataset raises HeadersNeeded."""
334+
d = tablib.Dataset()
335+
d.append([1, 2, 3])
336+
with self.assertRaises(tablib.core.HeadersNeeded):
337+
del d['col']
338+
325339
def test_str_no_columns(self):
326340
d = tablib.Dataset(['a', 1], ['b', 2], ['c', 3])
327341
output = f'{d}'

0 commit comments

Comments
 (0)