code: def get_obj_dtype(obj):
      """Get the effective dtype of an array-like object"""
      if is_proxy(obj):
          # Read and potentially apply scaling to one value
          idx = (0,) * len(obj.shape)
          return obj[idx].dtype
      elif hasattr(obj, "dtype"):
          # Trust the dtype (probably an ndarray)
          return obj.dtype
      else:
          # Coerce; this could be expensive but we don't know what we can do with it
          return np.asanyarray(obj).dtype
  
imports: from __future__ import annotations
  import typing
  import warnings
  from contextlib import contextmanager
  from threading import RLock
  import numpy
  from .None import openers
  from .fileslice import canonical_slicers, fileslice
  from .volumeutils import apply_read_scaling, array_from_file
label_desc: Use image node_id 3 for calling a global function with example usage: get_obj_dtype(obj) and returns: obj, obj, np