Skip to content

Commit

Permalink
add repr for NWB classes (#595)
Browse files Browse the repository at this point in the history
add repr for NWB classes. Use numpy to print datasets
bendichter authored Nov 13, 2018
1 parent 32f3b03 commit 4f3d3c6
Showing 2 changed files with 55 additions and 25 deletions.
65 changes: 41 additions & 24 deletions src/pynwb/core.py
Original file line number Diff line number Diff line change
@@ -61,28 +61,6 @@ def prepend_string(string, prepend=' '):
return prepend + prepend.join(string.splitlines(True))


def nwb_repr(nwb_object, verbose=True):
try:
template = "{} {}\nFields:\n""".format(getattr(nwb_object, 'name'), type(nwb_object))

if verbose:
for k, v in iteritems(nwb_object.fields):
template += " {}:\n".format(k)
if isinstance(v, list):
for item in v:
template += prepend_string(nwb_repr(item, verbose=False)) + '\n'
else:
template += prepend_string(str(v)) + '\n'
else:
for field in ('description', ):
template += " {}:\n".format(field)
template += prepend_string(str(getattr(nwb_object, field)))+'\n'

return template
except AttributeError:
return str(nwb_object)


class NWBBaseType(with_metaclass(ExtenderMeta, Container)):
'''The base class to any NWB types.
@@ -166,8 +144,47 @@ def __gather_nwbfields(cls, name, bases, classdict):
new_nwbfields.append(pname)
cls.__nwbfields__ = tuple(new_nwbfields)

def __str__(self):
return nwb_repr(self)
def __repr__(self):
template = "{} {}\nFields:\n""".format(getattr(self, 'name'), type(self))
for k, v in iteritems(self.fields):
template += " {}: {} \n".format(k, self.__smart_str(v))
return template

def __smart_str(self, v):
"""
Print compact string representation of data.
If v is a list, print it using numpy. This will condense the string
representation of datasets with many elements.
If v is a dictionary, print the name and type of each element
If v is a neurodata_type, print the name of type
Otherwise, use the built-in str()
Parameters
----------
v
Returns
-------
str
"""
if isinstance(v, list):
return str(np.array(v))
elif isinstance(v, dict):
template = '{'
keys = list(v.keys())
for k in keys[:-1]:
template += " {} {}, ".format(k, type(v[k]))
if keys:
template += " {} {}".format(keys[-1], type(v[keys[-1]]))
return template + ' }'
elif isinstance(v, NWBBaseType):
"{} {}".format(getattr(v, 'name'), type(v))
else:
return str(v)


@register_class('NWBContainer', CORE_NAMESPACE)
15 changes: 14 additions & 1 deletion tests/unit/pynwb_tests/test_core.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import unittest2 as unittest

from pynwb.core import DynamicTable, VectorData, ElementIdentifiers, NWBTable
from pynwb import NWBFile
from pynwb import NWBFile, TimeSeries

import pandas as pd
from datetime import datetime
@@ -272,3 +272,16 @@ def test_from_dataframe_extra_columns(self):

with self.assertRaises(ValueError):
self.cls.from_dataframe(df=df, name='test_table')


class TestPrint(unittest.TestCase):

def test_print_file(self):
nwbfile = NWBFile(session_description='session_description',
identifier='identifier', session_start_time=datetime.now(tzlocal()))
ts = TimeSeries('name', [1., 2., 3.] * 1000, timestamps=[1, 2, 3])
ts2 = TimeSeries('name2', [1, 2, 3] * 1000, timestamps=[1, 2, 3])
print(ts)
nwbfile.add_acquisition(ts)
nwbfile.add_acquisition(ts2)
print(nwbfile)

0 comments on commit 4f3d3c6

Please sign in to comment.