diff --git a/dash/_utils.py b/dash/_utils.py index 0e909b31ae..0123e3bfce 100644 --- a/dash/_utils.py +++ b/dash/_utils.py @@ -1,4 +1,6 @@ import uuid +import collections +import six def interpolate_str(template, **data): @@ -40,6 +42,12 @@ def get_asset_path( ]) +def patch_collections_abc(member): + if six.PY2: + return getattr(collections, member) + return getattr(collections.abc, member) + + class AttributeDict(dict): """ Dictionary subclass enabling attribute lookup/assignment of keys/values. diff --git a/dash/dash.py b/dash/dash.py index eb30b2a233..20448ce3c8 100644 --- a/dash/dash.py +++ b/dash/dash.py @@ -30,8 +30,9 @@ from ._utils import interpolate_str as _interpolate from ._utils import format_tag as _format_tag from ._utils import generate_hash as _generate_hash -from . import _watch from ._utils import get_asset_path as _get_asset_path +from ._utils import patch_collections_abc as _patch_collections_abc +from . import _watch from . import _configs @@ -275,7 +276,7 @@ def layout(self): return self._layout def _layout_value(self): - if isinstance(self._layout, collections.Callable): + if isinstance(self._layout, _patch_collections_abc('Callable')): self._cached_layout = self._layout() else: self._cached_layout = self._layout @@ -284,7 +285,7 @@ def _layout_value(self): @layout.setter def layout(self, value): if (not isinstance(value, Component) and - not isinstance(value, collections.Callable)): + not isinstance(value, _patch_collections_abc('Callable'))): raise exceptions.NoLayoutException( '' 'Layout must be a dash component ' diff --git a/dash/development/base_component.py b/dash/development/base_component.py index 78592383cc..80b9734354 100644 --- a/dash/development/base_component.py +++ b/dash/development/base_component.py @@ -5,6 +5,8 @@ import six +from .._utils import patch_collections_abc + # pylint: disable=no-init,too-few-public-methods class ComponentRegistry: @@ -58,7 +60,7 @@ def _check_if_has_indexable_children(item): @six.add_metaclass(ComponentMeta) -class Component(collections.MutableMapping): +class Component(patch_collections_abc('MutableMapping')): class _UNDEFINED(object): def __repr__(self): return 'undefined'