Skip to content

CIDSet.for_each() doesn't propagate errors — Go's ForEach() does #69

Description

@sumanjeet0012

Go's Set.ForEach(f func(c Cid) error) error stops iteration and returns the first error from the callback. Python's CIDSet.for_each(func) ignores return values and always returns None.

Problem

Go:

func (s *Set) ForEach(f func(c Cid) error) error {
    for c := range s.set {
        err := f(c)
        if err != nil {
            return err  // ← Stops and returns error
        }
    }
    return nil
}

Python:

def for_each(self, func):
    for cid in self._set:
        func(cid)  # ← Return value ignored, always continues

Proposed Solution

Update for_each() to propagate errors:

def for_each(self, func):
    """Call func(cid) for each CID. Stop and return error if func raises or returns an error."""
    for cid in self._set:
        try:
            result = func(cid)
            if result is not None and isinstance(result, Exception):
                return result
        except Exception as e:
            return e
    return None

Add tests:

def test_cid_set_for_each_error_propagation():
    cid_set = CIDSet()
    cid_set.add(cidv0)
    cid_set.add(cidv1)

    def failing_func(cid):
        raise ValueError("test error")

    result = cid_set.for_each(failing_func)
    assert isinstance(result, ValueError)
    assert str(result) == "test error"

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions