Skip to content

Commit e89ab7e

Browse files
josefbartatswast
authored andcommitted
BigQuery: added methods for getting keys, items and dict (#4393)
* added methods for getting keys, items and dict This change enables to retrieve the row as a dict and iterate the keys and/or items, like with a normal dict; in other words, making the Row object a dict-like object: >>> row.dict() {'name': 'Isabel', 'profession': 'bridge builder'} >>> for k, v in row.items(): >>> for k in row.keys(): * fixed row length * removed whitespace from blank lines * removed trailing whitespace * responding to failed cover check * added docstrings * update unit tests * Update test_table.py * .keys() and .items() into generators * get method for Row * get method for Row * get method for Row * Update table.py * Update test_table.py * Update test_table.py
1 parent 36c4abd commit e89ab7e

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

bigquery/google/cloud/bigquery/table.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,47 @@ def __init__(self, values, field_to_index):
785785
def values(self):
786786
return self._xxx_values
787787

788+
def keys(self):
789+
"""
790+
Return keys as of a dict:
791+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).keys()
792+
['x', 'y']
793+
"""
794+
keys = self._xxx_field_to_index.keys()
795+
return keys
796+
797+
def items(self):
798+
"""
799+
Return items as of a dict:
800+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).items()
801+
[('x', 'a'), ('y', 'b')]
802+
"""
803+
items = [
804+
(k, self._xxx_values[i])
805+
for k, i
806+
in self._xxx_field_to_index.items()
807+
]
808+
return items
809+
810+
def get(self, key, default=None):
811+
"""
812+
Return value under specified key
813+
Defaults to None or specified default
814+
if key does not exist:
815+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).get('x')
816+
'a'
817+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).get('z')
818+
None
819+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).get('z', '')
820+
''
821+
>>> Row(('a', 'b'), {'x': 0, 'y': 1}).get('z', default = '')
822+
''
823+
"""
824+
index = self._xxx_field_to_index.get(key)
825+
if index is None:
826+
return default
827+
return self._xxx_values[index]
828+
788829
def __getattr__(self, name):
789830
value = self._xxx_field_to_index.get(name)
790831
if value is None:

bigquery/tests/unit/test_table.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -765,6 +765,13 @@ def test_row(self):
765765
self.assertEqual(row['c'], 3)
766766
self.assertEqual(len(row), 3)
767767
self.assertEqual(row.values(), VALUES)
768+
self.assertEqual(set(row.keys()), set({'a': 1, 'b': 2, 'c': 3}.keys()))
769+
self.assertEqual(set(row.items()),
770+
set({'a': 1, 'b': 2, 'c': 3}.items()))
771+
self.assertEqual(row.get('a'), 1)
772+
self.assertEqual(row.get('d'), None)
773+
self.assertEqual(row.get('d', ''), '')
774+
self.assertEqual(row.get('d', default=''), '')
768775
self.assertEqual(repr(row),
769776
"Row((1, 2, 3), {'a': 0, 'b': 1, 'c': 2})")
770777
self.assertFalse(row != row)

0 commit comments

Comments
 (0)