Skip to content

Commit bad8dd0

Browse files
authored
Override ipython repr methods. (zarr-developers#1724)
Closes zarr-developers#1716 This avoids expensive lookups against object stores.
1 parent 2534413 commit bad8dd0

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

docs/release.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ Release notes
1818
Unreleased
1919
----------
2020

21+
Enhancements
22+
~~~~~~~~~~~~
23+
24+
* Override IPython ``_repr_*_`` methods to avoid expensive lookups against object stores.
25+
By :user:`Deepak Cherian <dcherian>` :issue:`1716`.
26+
2127
Maintenance
2228
~~~~~~~~~~~
2329

zarr/hierarchy.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,13 @@ def _delitem_nosync(self, item):
515515
raise KeyError(item)
516516

517517
def __getattr__(self, item):
518+
# https://github.com/jupyter/notebook/issues/2014
519+
# Save a possibly expensive lookup (for e.g. against cloud stores)
520+
# Note: The _ipython_display_ method is required to display the right info as a side-effect.
521+
# It is simpler to pretend it doesn't exist.
522+
if item in ["_ipython_canary_method_should_not_exist_", "_ipython_display_"]:
523+
raise AttributeError
524+
518525
# allow access to group members via dot notation
519526
try:
520527
return self.__getitem__(item)
@@ -1331,6 +1338,40 @@ def move(self, source, dest):
13311338

13321339
self._write_op(self._move_nosync, source, dest)
13331340

1341+
# Override ipython repr methods, GH1716
1342+
# https://ipython.readthedocs.io/en/stable/config/integrating.html#custom-methods
1343+
# " If the methods don’t exist, the standard repr() is used. If a method exists and
1344+
# returns None, it is treated the same as if it does not exist."
1345+
def _repr_html_(self):
1346+
return None
1347+
1348+
def _repr_latex_(self):
1349+
return None
1350+
1351+
def _repr_mimebundle_(self, **kwargs):
1352+
return None
1353+
1354+
def _repr_svg_(self):
1355+
return None
1356+
1357+
def _repr_png_(self):
1358+
return None
1359+
1360+
def _repr_jpeg_(self):
1361+
return None
1362+
1363+
def _repr_markdown_(self):
1364+
return None
1365+
1366+
def _repr_javascript_(self):
1367+
return None
1368+
1369+
def _repr_pdf_(self):
1370+
return None
1371+
1372+
def _repr_json_(self):
1373+
return None
1374+
13341375

13351376
def _normalize_store_arg(store, *, storage_options=None, mode="r", zarr_version=None):
13361377
if zarr_version is None:

zarr/tests/test_hierarchy.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import atexit
2+
import operator
23
import os
34
import sys
45
import pickle
@@ -87,6 +88,26 @@ def create_group(
8788
)
8889
return g
8990

91+
def test_ipython_repr_methods(self):
92+
g = self.create_group()
93+
for method in [
94+
"html",
95+
"json",
96+
"javascript",
97+
"markdown",
98+
"svg",
99+
"png",
100+
"jpeg",
101+
"latex",
102+
"pdf",
103+
"mimebundle",
104+
]:
105+
assert operator.methodcaller(f"_repr_{method}_")(g) is None
106+
with pytest.raises(AttributeError):
107+
g._ipython_display_()
108+
with pytest.raises(AttributeError):
109+
g._ipython_canary_method_should_not_exist_()
110+
90111
def test_group_init_1(self):
91112
store, chunk_store = self.create_store()
92113
g = self.create_group(store, chunk_store=chunk_store)

0 commit comments

Comments
 (0)