{"record":{"id":"93b6c7a4ea933b64","repo":"jax-ml/jax","slug":"iteration-over-a-0-d-array-93b6c7","errorCode":null,"errorMessage":"iteration over a 0-d array","messagePattern":"iteration over a 0-d array","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"jax/_src/earray.py","lineNumber":58,"sourceCode":"  @property\n  def aval(self):\n    return self._aval\n\n  def block_until_ready(self):\n    _ = self._data.block_until_ready()\n    return self\n\n  def copy_to_host_async(self):\n    self._data.copy_to_host_async()\n\n  def copy(self):\n    return EArray(self.aval, self._data.copy())\n\n  def __repr__(self):\n    return 'E' + repr(self._data)\n\n  def __iter__(self):\n    if self.ndim == 0: raise TypeError('iteration over a 0-d array')\n    raise NotImplementedError\n\n  # forward to aval\n  shape = property(lambda self: self.aval.shape)\n  dtype = property(lambda self: self.aval.dtype)\n\n  # computed from shape and dtype\n  ndim = property(lambda self: len(self.aval.shape))\n  size = property(lambda self: math.prod(self.aval.shape))\n  itemsize = property(lambda self: self.aval.dtype.itemsize)\n  def __len__(self):\n    if self.ndim == 0: raise TypeError('len() of unsized object')\n    return self.shape[0]\n\n  # forward to self._data\n  devices = property(lambda self: self._data.devices)  # pyrefly: ignore[bad-override]\n  _committed = property(lambda self: self._data._committed)\n  is_fully_addressable = property(lambda self: self._data.is_fully_addressable)","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/earray.py#L40-L76","documentation":"EArray (an etuple-backed lazy array used internally by JAX's symbolic/OOO machinery) mimics ndarray semantics; NumPy disallows iteration over 0-d arrays, so EArray.__iter__ raises TypeError for ndim==0 and NotImplementedError otherwise.","triggerScenarios":"Iterating (for x in earr, list(earr), *earr) over an EArray whose aval shape is (). This class is internal to jax._src.earray and mostly encountered when embedding etuples in control-flow/metaprogramming code.","commonSituations":"Internal JAX development or libraries built on jax.experimental serialization / etuples hitting an EArray where a scalar was expected; debugging repr-based code that iterates values.","solutions":["Check ndim/shape before iterating: if earr.ndim > 0: ...","Index the scalar directly: earr[()] to extract the 0-d value","Avoid generic iteration over unknown JAX container types; convert to a concrete array first"],"exampleFix":"# before\nvals = list(earr)  # TypeError when 0-d\n\n# after\nvals = [earr[()]] if earr.ndim == 0 else list(earr)","handlingStrategy":"type-guard","validationCode":"if earr.ndim == 0:\n    value = earr[()]  # extract scalar instead of iterating","typeGuard":"def is_iterable_earray(e) -> bool:\n    return getattr(e, 'ndim', 0) > 0","tryCatchPattern":null,"preventionTips":["Treat JAX containers uniformly: check ndim before iter/list","Prefer .reshape(-1) or indexing over blanket iteration"],"tags":["jax","earray","iteration","zero-d-array"],"backgroundTag":"iteration-over-scalar-array","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}