{"record":{"id":"8cb9a8cab183a382","repo":"jax-ml/jax","slug":"len-of-unsized-object-8cb9a8","errorCode":null,"errorMessage":"len() of unsized object","messagePattern":"len\\(\\) of unsized object","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"jax/_src/earray.py","lineNumber":70,"sourceCode":"    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)\n  is_fully_replicated = property(lambda self: self._data.is_fully_replicated)\n  delete = property(lambda self: self._data.delete)  # pyrefly: ignore[bad-override]\n  is_deleted = property(lambda self: self._data.is_deleted)  # pyrefly: ignore[bad-override]\n  on_device_size_in_bytes = property(lambda self: self._data.on_device_size_in_bytes)  # pyrefly: ignore[bad-override]\n  unsafe_buffer_pointer = property(lambda self: self._data.unsafe_buffer_pointer)  # pyrefly: ignore[bad-override]\n\n  # defer to extended dtype rules\n  @property\n  def sharding(self):\n    phys_sharding = self._data.sharding\n    return sharding_impls.logical_sharding(self.shape, self.dtype, phys_sharding)\n","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/earray.py#L52-L88","documentation":"len() of an EArray with ndim==0 has no first-axis length, matching NumPy's 'len() of unsized object' TypeError for 0-d arrays. EArray.__len__ returns shape[0], which does not exist for scalars.","triggerScenarios":"len(earr) where the EArray's aval shape is (); often inside generic container code (dataclasses, serializers) that calls len() on every value.","commonSituations":"Serialization or logging utilities that call len(x) to size containers; mixed scalar/array pipelines where a value is sometimes 0-d; etuple-driven symbolic expressions.","solutions":["Guard with ndim: n = earr.shape[0] if earr.ndim > 0 else 1","Use size for element count: earr.size works for 0-d (returns 1)","Use np.ndim(earr)==0 checks in generic helpers before calling len"],"exampleFix":"# before\nn = len(earr)\n\n# after\nn = earr.shape[0] if earr.ndim > 0 else 1","handlingStrategy":"validation","validationCode":"n = earr.shape[0] if getattr(earr, 'ndim', 0) > 0 else 1","typeGuard":"def has_len(e) -> bool:\n    return getattr(e, 'ndim', None) not in (0, None)","tryCatchPattern":null,"preventionTips":["Use .size instead of len() for element counts","In generic helpers, branch on np.ndim(x) == 0 before calling len"],"tags":["jax","earray","len","zero-d-array"],"backgroundTag":"len-of-unsized-object","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}