diff --git a/dask/array/core.py b/dask/array/core.py
index 8bfb23a28..b63d5aa69 100644
--- a/dask/array/core.py
+++ b/dask/array/core.py
@@ -348,7 +348,7 @@ def apply_infer_dtype(func, args, kwargs, funcname, suggest_dtype='dtype', nout=
         Function for which output dtype is to be determined
 
     args: List of array like
-        Arguments to the function, which qwould usually be used. Only attributes
+        Arguments to the function, which would usually be used. Only attributes
         ``ndim`` and ``dtype`` are used.
 
     kwargs: dict
diff --git a/dask/array/top.py b/dask/array/top.py
index 66526a185..4f1cad48a 100644
--- a/dask/array/top.py
+++ b/dask/array/top.py
@@ -591,7 +591,8 @@ def optimize_atop(full_graph, keys=()):
             deps = set(top_layers)
             while deps:  # we gather as many sub-layers as we can
                 dep = deps.pop()
-                if (isinstance(layers[dep], TOP) and
+                if (dep in layers and
+                        isinstance(layers[dep], TOP) and
                         not (dep != layer and dep in keep) and  # output layer
                         layers[dep].concatenate == layers[layer].concatenate):  # punt on mixed concatenate
                     top_layers.add(dep)
diff --git a/dask/base.py b/dask/base.py
index 7cb0c660f..cf2cb3cc7 100644
--- a/dask/base.py
+++ b/dask/base.py
@@ -13,7 +13,8 @@ import uuid
 from toolz import merge, groupby, curry, identity
 from toolz.functoolz import Compose
 
-from .compatibility import long, unicode, Iterator
+from .compatibility import (apply, long, unicode, Iterator, is_dataclass,
+                            dataclass_fields)
 from .context import thread_state
 from .core import flatten, quote, get as simple_get
 from .hashing import hash_buffer_hex
@@ -264,6 +265,10 @@ def unpack_collections(*args, **kwargs):
             elif typ is dict:
                 tsk = (dict, [[_unpack(k), _unpack(v)]
                               for k, v in expr.items()])
+            elif is_dataclass(expr):
+                tsk = (apply, typ, (), (dict,
+                       [[f.name, _unpack(getattr(expr, f.name))] for f in
+                        dataclass_fields(expr)]))
             else:
                 return expr
 
diff --git a/dask/compatibility.py b/dask/compatibility.py
index 25adaa1aa..9c9b9c32a 100644
--- a/dask/compatibility.py
+++ b/dask/compatibility.py
@@ -307,7 +307,7 @@ def getargspec(func):
     """Version of inspect.getargspec that works with partial and warps."""
     if isinstance(func, functools.partial):
         return getargspec(func.func)
- 
+
     func = getattr(func, '__wrapped__', func)
     if isinstance(func, type):
         return _getargspec(func.__init__)
@@ -337,3 +337,14 @@ def bind_method(cls, name, func):
         setattr(cls, name, types.MethodType(func, None, cls))
     else:
         setattr(cls, name, func)
+
+
+try:
+    from dataclasses import is_dataclass, fields as dataclass_fields
+
+except ImportError:
+    def is_dataclass(x):
+        return False
+
+    def dataclass_fields(x):
+        return []
diff --git a/dask/delayed.py b/dask/delayed.py
index ff3cbe358..aa2cde5d3 100644
--- a/dask/delayed.py
+++ b/dask/delayed.py
@@ -12,7 +12,8 @@ except ImportError:
 from . import config, threaded
 from .base import is_dask_collection, dont_optimize, DaskMethodsMixin
 from .base import tokenize as _tokenize
-from .compatibility import apply, Iterator
+from .compatibility import apply, Iterator, is_dataclass, dataclass_fields
+
 from .core import quote
 from .context import globalmethod
 from .optimization import cull
@@ -91,6 +92,12 @@ def to_task_dask(expr):
         args, dsk = to_task_dask([[k, v] for k, v in expr.items()])
         return (dict, args), dsk
 
+    if is_dataclass(expr):
+        args, dsk = to_task_dask([[f.name, getattr(expr, f.name)] for f in
+                                  dataclass_fields(expr)])
+
+        return (apply, typ, (), (dict, args)), dsk
+
     if typ is slice:
         args, dsk = to_task_dask([expr.start, expr.stop, expr.step])
         return (slice,) + tuple(args), dsk
diff --git a/docs/source/array-sparse.rst b/docs/source/array-sparse.rst
index 952c9d591..14189f6af 100644
--- a/docs/source/array-sparse.rst
+++ b/docs/source/array-sparse.rst
@@ -1,39 +1,39 @@
 Sparse Arrays
 =============
 
-By swapping out in-memory numpy arrays with in-memory sparse arrays we can
-reuse the blocked algorithms of Dask.array to achieve parallel and distributed
+By swapping out in-memory NumPy arrays with in-memory sparse arrays, we can
+reuse the blocked algorithms of Dask's Array to achieve parallel and distributed
 sparse arrays.
 
-The blocked algorithms in Dask.array normally parallelize around in-memory
-numpy arrays.  However, if another in-memory array library supports the NumPy
-interface then it too can take advantage of dask.array's parallel algorithms.
+The blocked algorithms in Dask Array normally parallelize around in-memory
+NumPy arrays.  However, if another in-memory array library supports the NumPy
+interface, then it too can take advantage of Dask Array's parallel algorithms.
 In particular the `sparse <https://github.com/mrocklin/sparse/>`_ array library
-satisfies a subset of the NumPy API and works well with, and is tested against,
-Dask.array.
+satisfies a subset of the NumPy API and works well with (and is tested against)
+Dask Array.
 
 Example
 -------
 
-Say we have a dask.array with mostly zeros
+Say we have a Dask array with mostly zeros:
 
 .. code-block:: python
 
    x = da.random.random((100000, 100000), chunks=(1000, 1000))
    x[x < 0.95] = 0
 
-We can convert each of these chunks of NumPy arrays into a sparse.COO array.
+We can convert each of these chunks of NumPy arrays into a **sparse.COO** array:
 
 .. code-block:: python
 
    import sparse
    s = x.map_blocks(sparse.COO)
 
-Now our array is composed not of many NumPy arrays, but rather of many
-sparse arrays.  Semantically this does not change anything.  Operations that
-work will work identically (assuming that the behavior of ``numpy`` and
-``sparse`` are identical) but performance characteristics and storage costs may
-change significantly
+Now, our array is not composed of many NumPy arrays, but rather of many
+sparse arrays.  Semantically, this does not change anything.  Operations that
+work will continue to work identically (assuming that the behavior of ``numpy`` 
+and ``sparse`` are identical), but performance characteristics and storage costs 
+may change significantly:
 
 .. code-block:: python
 
@@ -50,24 +50,24 @@ Requirements
 
 Any in-memory library that copies the NumPy ndarray interface should work here.
 The `sparse <https://github.com/mrocklin/sparse/>`_ library is a minimal
-example.  In particular an in-memory library should implement at least the
+example.  In particular, an in-memory library should implement at least the
 following operations:
 
 1.  Simple slicing with slices, lists, and elements (for slicing, rechunking,
-    reshaping, etc).
+    reshaping, etc)
 2.  A ``concatenate`` function matching the interface of ``np.concatenate``.
-    This must be registered in ``dask.array.core.concatenate_lookup``.
+    This must be registered in ``dask.array.core.concatenate_lookup``
 3.  All ufuncs must support the full ufunc interface, including ``dtype=`` and
     ``out=`` parameters (even if they don't function properly)
 4.  All reductions must support the full ``axis=`` and ``keepdims=`` keywords
-    and behave like numpy in this respect
+    and behave like NumPy in this respect
 5.  The array class should follow the ``__array_priority__`` protocol and be
-    prepared to respond to other arrays of lower priority.
+    prepared to respond to other arrays of lower priority
 6.  If ``dot`` support is desired, a ``tensordot`` function matching the
     interface of ``np.tensordot`` should be registered in
-    ``dask.array.core.tensordot_lookup``.
+    ``dask.array.core.tensordot_lookup``
 
-The implementation of other operations like reshape, transpose, etc.
+The implementation of other operations like reshape, transpose, etc.,
 should follow standard NumPy conventions regarding shape and dtype.  Not
 implementing these is fine; the parallel ``dask.array`` will err at runtime if
 these operations are attempted.
@@ -76,8 +76,8 @@ these operations are attempted.
 Mixed Arrays
 ------------
 
-Dask.array supports mixing different kinds of in-memory arrays.  This relies
+Dask's Array supports mixing different kinds of in-memory arrays.  This relies
 on the in-memory arrays knowing how to interact with each other when necessary.
-When two arrays interact the functions from the array with the highest
-``__array_priority__`` will take precedence (for example for concatenate,
+When two arrays interact, the functions from the array with the highest
+``__array_priority__`` will take precedence (for example, for concatenate,
 tensordot, etc.).

ShareDict seems to cause issues with HighLevelGraphs in optimize_atop
Following up on https://github.com/dask/dask/issues/4038#issuecomment-434338006, this script:

```python
from dask.sharedict import ShareDict
import numpy as np


def foo(A):
    return A[None, ...]


A = da.ones(shape=(10, 20, 4), chunks=(2, 5, 4))

name = 'D-' + dask.base.tokenize(A)

dsk = da.core.top(
        foo, name, ("nsrc", "ntime", "nbl", "npol"),
        A.name, ("ntime", "nbl", "npol"),
        new_axes={"nsrc": 1},
        numblocks={a.name: a.numblocks for a in (A,)})

array_dsk = ShareDict()
array_dsk.update(dsk)
array_dsk.update(A.__dask_graph__())

chunks = ((1,),) + A.chunks

D = da.Array(array_dsk, name, chunks, dtype=A.dtype)
print(D.compute().shape)    # Succeeds
D = D.sum(axis=0)
print(D.compute().shape)    # Fails
```

causes the following error:


```traceback
$ python dask_top_2.py 
(1, 10, 20, 4)
Traceback (most recent call last):
  File "dask_top_2.py", line 32, in <module>
    pprint(D.compute().shape)
  File "/home/sperkins/tmp/python/dask/venv/local/lib/python2.7/site-packages/dask/base.py", line 155, in compute
    (result,) = compute(self, traverse=False, **kwargs)
  File "/home/sperkins/tmp/python/dask/venv/local/lib/python2.7/site-packages/dask/base.py", line 389, in compute
    dsk = collections_to_dsk(collections, optimize_graph, **kwargs)
  File "/home/sperkins/tmp/python/dask/venv/local/lib/python2.7/site-packages/dask/base.py", line 193, in collections_to_dsk
    for opt, (dsk, keys) in groups.items()]))
  File "/home/sperkins/tmp/python/dask/venv/local/lib/python2.7/site-packages/dask/array/optimization.py", line 38, in optimize
    dsk = optimize_atop(dsk, keys=keys)
  File "/home/sperkins/tmp/python/dask/venv/local/lib/python2.7/site-packages/dask/array/top.py", line 594, in optimize_atop
    if (isinstance(layers[dep], TOP) and
KeyError: 'D-122ec2f0f994205583cdc43c8fba6f6d'
```
diff --git a/dask/array/tests/test_atop.py b/dask/array/tests/test_atop.py
index d0f2c316c..117a15b9c 100644
--- a/dask/array/tests/test_atop.py
+++ b/dask/array/tests/test_atop.py
@@ -380,3 +380,28 @@ def test_namedtuple(tup):
                 dtype=A.dtype)
 
     assert_eq(A, B)
+
+
+def test_gh_4176():
+    def foo(A):
+        return A[None, ...]
+
+    A = da.ones(shape=(10, 20, 4), chunks=(2, 5, 4))
+
+    name = 'D'
+
+    dsk = da.core.top(
+        foo, name, ("nsrc", "ntime", "nbl", "npol"),
+        A.name, ("ntime", "nbl", "npol"),
+        new_axes={"nsrc": 1},
+        numblocks={a.name: a.numblocks for a in (A,)}
+    )
+
+    array_dsk = dask.sharedict.ShareDict()
+    array_dsk.update(dsk)
+    array_dsk.update(A.__dask_graph__())
+
+    chunks = ((1,),) + A.chunks
+
+    D = da.Array(array_dsk, name, chunks, dtype=A.dtype)
+    D.sum(axis=0).compute()
diff --git a/dask/tests/test_base.py b/dask/tests/test_base.py
index ab981e41d..12a867206 100644
--- a/dask/tests/test_base.py
+++ b/dask/tests/test_base.py
@@ -346,13 +346,21 @@ def test_is_dask_collection():
     assert not is_dask_collection(DummyCollection)
 
 
+try:
+    import dataclasses
+    # Avoid @dataclass decorator as Python < 3.7 fail to interpret the type hints
+    ADataClass = dataclasses.make_dataclass('ADataClass', [('a', int)])
+except ImportError:
+    dataclasses = None
+
+
 def test_unpack_collections():
     a = delayed(1) + 5
     b = a + 1
     c = a + 2
 
     def build(a, b, c, iterator):
-        return (a, b,               # Top-level collections
+        t = (a, b,                  # Top-level collections
                 {'a': a,            # dict
                  a: b,              # collections as keys
                  'b': [1, 2, [b]],  # list
@@ -361,6 +369,11 @@ def test_unpack_collections():
                  'e': {a, 2, 3}},   # set
                 iterator)           # Iterator
 
+        if dataclasses is not None:
+            t[2]['f'] = ADataClass(a=a)
+
+        return t
+
     args = build(a, b, c, (i for i in [a, b, c]))
 
     collections, repack = unpack_collections(*args)
diff --git a/dask/tests/test_delayed.py b/dask/tests/test_delayed.py
index 4a4c888fa..c887f29ca 100644
--- a/dask/tests/test_delayed.py
+++ b/dask/tests/test_delayed.py
@@ -94,6 +94,22 @@ def test_delayed():
     assert a.key in b.dask
 
 
+def test_delayed_with_dataclass():
+    dataclasses = pytest.importorskip("dataclasses")
+
+    # Avoid @dataclass decorator as Python < 3.7 fail to interpret the type hints
+    ADataClass = dataclasses.make_dataclass('ADataClass', [('a', int)])
+
+    literal = dask.delayed(3)
+    with_class = dask.delayed({"a": ADataClass(a=literal)})
+
+    def return_nested(obj):
+        return obj["a"].a
+    final = delayed(return_nested)(with_class)
+
+    assert final.compute() == 3
+
+
 def test_operators():
     a = delayed([1, 2, 3])
     assert a[0].compute() == 1

pip install -e .[complete]
parse_log_pytest
pytest
pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
click==8.0.4
cloudpickle==2.2.1
-e git+https://github.com/dask/dask.git@5255092ecb98858451d35efaedb3ae03036870b1#egg=dask
distributed==1.28.1
HeapDict==1.0.1
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
locket==1.0.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
msgpack==1.0.5
numpy==1.19.5
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pandas==1.1.5
partd==1.2.0
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
psutil==7.0.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
python-dateutil==2.9.0.post0
pytz==2025.2
PyYAML==6.0.1
six==1.17.0
sortedcontainers==2.4.0
tblib==1.7.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
toolz==0.12.0
tornado==6.1
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zict==2.1.0
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: dask
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - click==8.0.4
      - cloudpickle==2.2.1
      - distributed==1.28.1
      - heapdict==1.0.1
      - locket==1.0.0
      - msgpack==1.0.5
      - numpy==1.19.5
      - pandas==1.1.5
      - partd==1.2.0
      - psutil==7.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - pyyaml==6.0.1
      - six==1.17.0
      - sortedcontainers==2.4.0
      - tblib==1.7.0
      - toolz==0.12.0
      - tornado==6.1
      - zict==2.1.0
prefix: /opt/conda/envs/dask

dask/array/tests/test_atop.py::test_gh_4176
dask/array/tests/test_atop.py::test_rewrite[inputs0-expected0] dask/array/tests/test_atop.py::test_rewrite[inputs1-expected1] dask/array/tests/test_atop.py::test_rewrite[inputs2-expected2] dask/array/tests/test_atop.py::test_rewrite[inputs3-expected3] dask/array/tests/test_atop.py::test_rewrite[inputs4-expected4] dask/array/tests/test_atop.py::test_rewrite[inputs5-expected5] dask/array/tests/test_atop.py::test_rewrite[inputs6-expected6] dask/array/tests/test_atop.py::test_rewrite[inputs7-expected7] dask/array/tests/test_atop.py::test_rewrite[inputs8-expected8] dask/array/tests/test_atop.py::test_rewrite[inputs9-expected9] dask/array/tests/test_atop.py::test_rewrite[inputs10-expected10] dask/array/tests/test_atop.py::test_rewrite[inputs11-expected11] dask/array/tests/test_atop.py::test_rewrite[inputs12-expected12] dask/array/tests/test_atop.py::test_rewrite[inputs13-expected13] dask/array/tests/test_atop.py::test_index_subs dask/array/tests/test_atop.py::test_optimize_atop dask/array/tests/test_atop.py::test_atop_non_atop_output dask/array/tests/test_atop.py::test_top_len dask/array/tests/test_atop.py::test_inner_compute dask/array/tests/test_atop.py::test_common_token_names_args[_] dask/array/tests/test_atop.py::test_common_token_names_args[_0] dask/array/tests/test_atop.py::test_common_token_names_args[_1] dask/array/tests/test_atop.py::test_common_token_names_args[.] dask/array/tests/test_atop.py::test_common_token_names_args[.0] dask/array/tests/test_atop.py::test_common_token_names_kwargs[_0] dask/array/tests/test_atop.py::test_common_token_names_kwargs[_1] dask/array/tests/test_atop.py::test_common_token_names_kwargs[.] dask/array/tests/test_atop.py::test_common_token_names_kwargs[.0] dask/array/tests/test_atop.py::test_common_token_names_kwargs[_] dask/array/tests/test_atop.py::test_atop_names dask/array/tests/test_atop.py::test_atop_new_axes dask/array/tests/test_atop.py::test_atop_new_axes_2 dask/array/tests/test_atop.py::test_atop_stacked_new_axes[True] dask/array/tests/test_atop.py::test_atop_stacked_new_axes[False] dask/array/tests/test_atop.py::test_atop_stacked_new_axes_front[True] dask/array/tests/test_atop.py::test_atop_stacked_new_axes_front[False] dask/array/tests/test_atop.py::test_atop_stacked_new_axes_same_dim[True] dask/array/tests/test_atop.py::test_atop_stacked_new_axes_same_dim[False] dask/array/tests/test_atop.py::test_atop_kwargs dask/array/tests/test_atop.py::test_atop_chunks dask/array/tests/test_atop.py::test_atop_raises_on_incorrect_indices dask/array/tests/test_atop.py::test_atop_numpy_arg dask/array/tests/test_atop.py::test_bag_array_conversion dask/array/tests/test_atop.py::test_svd dask/array/tests/test_atop.py::test_namedtuple[tup0] dask/array/tests/test_atop.py::test_namedtuple[tup1] dask/tests/test_base.py::test_normalize_function dask/tests/test_base.py::test_tokenize dask/tests/test_base.py::test_tokenize_numpy_array_consistent_on_values dask/tests/test_base.py::test_tokenize_numpy_array_supports_uneven_sizes dask/tests/test_base.py::test_tokenize_discontiguous_numpy_array dask/tests/test_base.py::test_tokenize_numpy_datetime dask/tests/test_base.py::test_tokenize_numpy_scalar dask/tests/test_base.py::test_tokenize_numpy_array_on_object_dtype dask/tests/test_base.py::test_tokenize_numpy_memmap dask/tests/test_base.py::test_tokenize_numpy_memmap_no_filename dask/tests/test_base.py::test_tokenize_numpy_ufunc_consistent dask/tests/test_base.py::test_tokenize_partial_func_args_kwargs_consistent dask/tests/test_base.py::test_normalize_base dask/tests/test_base.py::test_tokenize_pandas dask/tests/test_base.py::test_tokenize_kwargs dask/tests/test_base.py::test_tokenize_same_repr dask/tests/test_base.py::test_tokenize_method dask/tests/test_base.py::test_tokenize_sequences dask/tests/test_base.py::test_tokenize_dict dask/tests/test_base.py::test_tokenize_set dask/tests/test_base.py::test_tokenize_ordered_dict dask/tests/test_base.py::test_tokenize_object_array_with_nans dask/tests/test_base.py::test_tokenize_base_types[1] dask/tests/test_base.py::test_tokenize_base_types[True] dask/tests/test_base.py::test_tokenize_base_types[a0] dask/tests/test_base.py::test_tokenize_base_types[a1] dask/tests/test_base.py::test_tokenize_base_types[1.0] dask/tests/test_base.py::test_tokenize_base_types[x5] dask/tests/test_base.py::test_tokenize_base_types[x6] dask/tests/test_base.py::test_tokenize_base_types[x7] dask/tests/test_base.py::test_tokenize_base_types[x8] dask/tests/test_base.py::test_tokenize_base_types[x9] dask/tests/test_base.py::test_tokenize_base_types[None] dask/tests/test_base.py::test_tokenize_base_types[str] dask/tests/test_base.py::test_tokenize_base_types[int] dask/tests/test_base.py::test_tokenize_numpy_matrix dask/tests/test_base.py::test_is_dask_collection dask/tests/test_base.py::test_unpack_collections dask/tests/test_base.py::test_custom_collection dask/tests/test_base.py::test_compute_no_opt dask/tests/test_base.py::test_compute_array dask/tests/test_base.py::test_persist_array dask/tests/test_base.py::test_compute_dataframe dask/tests/test_base.py::test_compute_array_dataframe dask/tests/test_base.py::test_compute_array_bag dask/tests/test_base.py::test_compute_with_literal dask/tests/test_base.py::test_compute_nested dask/tests/test_base.py::test_use_cloudpickle_to_tokenize_functions_in__main__ dask/tests/test_base.py::test_optimizations_keyword dask/tests/test_base.py::test_optimize dask/tests/test_base.py::test_optimize_nested dask/tests/test_base.py::test_default_imports dask/tests/test_base.py::test_persist_literals dask/tests/test_base.py::test_persist_nested dask/tests/test_base.py::test_persist_delayed dask/tests/test_base.py::test_persist_array_bag dask/tests/test_base.py::test_normalize_function_limited_size dask/tests/test_base.py::test_optimize_globals dask/tests/test_base.py::test_optimize_None dask/tests/test_base.py::test_scheduler_keyword dask/tests/test_base.py::test_raise_get_keyword dask/tests/test_base.py::test_get_scheduler dask/tests/test_base.py::test_callable_scheduler dask/tests/test_base.py::test_num_workers_config[threads] dask/tests/test_base.py::test_num_workers_config[processes] dask/tests/test_delayed.py::test_to_task_dask dask/tests/test_delayed.py::test_delayed dask/tests/test_delayed.py::test_operators dask/tests/test_delayed.py::test_methods dask/tests/test_delayed.py::test_attributes dask/tests/test_delayed.py::test_method_getattr_call_same_task dask/tests/test_delayed.py::test_delayed_errors dask/tests/test_delayed.py::test_common_subexpressions dask/tests/test_delayed.py::test_delayed_optimize dask/tests/test_delayed.py::test_lists dask/tests/test_delayed.py::test_literates dask/tests/test_delayed.py::test_literates_keys dask/tests/test_delayed.py::test_lists_are_concrete dask/tests/test_delayed.py::test_iterators dask/tests/test_delayed.py::test_traverse_false dask/tests/test_delayed.py::test_pure dask/tests/test_delayed.py::test_pure_global_setting dask/tests/test_delayed.py::test_nout dask/tests/test_delayed.py::test_kwargs dask/tests/test_delayed.py::test_custom_delayed dask/tests/test_delayed.py::test_array_delayed dask/tests/test_delayed.py::test_array_bag_delayed dask/tests/test_delayed.py::test_delayed_picklable dask/tests/test_delayed.py::test_delayed_compute_forward_kwargs dask/tests/test_delayed.py::test_delayed_method_descriptor dask/tests/test_delayed.py::test_delayed_callable dask/tests/test_delayed.py::test_delayed_name_on_call dask/tests/test_delayed.py::test_callable_obj dask/tests/test_delayed.py::test_name_consistent_across_instances dask/tests/test_delayed.py::test_sensitive_to_partials dask/tests/test_delayed.py::test_delayed_name dask/tests/test_delayed.py::test_finalize_name dask/tests/test_delayed.py::test_keys_from_array dask/tests/test_delayed.py::test_delayed_decorator_on_method
dask/array/top.py dask/delayed.py dask/array/core.py docs/source/array-sparse.rst dask/compatibility.py dask/base.py
dask/array/top.py dask/delayed.py dask/array/core.py docs/source/array-sparse.rst dask/compatibility.py dask/base.py