"""Miscellaneous functions without a home."""from__future__importannotationsfromcollections.abcimportIteratorfromtypingimportAny__all__:list[str]=["iterate_2d_array"]
[docs]defiterate_2d_array(n_elements:int=5,n_cols:int=2)->Iterator[tuple[int,int]]:""" Iterator for 2-dimensional array iterating first over columns then over rows. Parameters ---------- n_elements Number of elements n_cols Number of columns Returns ------- Iterator[tuple[int, int]] Indices for (row, column) in each iteration. """n_rows=-(-n_elements//n_cols)iterator=((i,j)foriinrange(n_rows)forjinrange(n_cols))return(itemforitem,_inzip(iterator,range(n_elements)))
def_get_subclasses(cls:Any)->set[Any]:""" Recursively identify all classes that inherit from `cls`. Parameters ---------- cls class object Returns ------- set[Any] """returnset(cls.__subclasses__()).union([sforcincls.__subclasses__()forsin_get_subclasses(c)])