aosabook/500lines · error · ValueError

arguments to project tasks must be immutable and hashable…

Error message

arguments to project tasks must be immutable and hashable, not the {}

What it means

Error "arguments to project tasks must be immutable and hashable, not the {}" thrown in aosabook/500lines.

Solutions

  1. Pass only immutable, hashable argument types (str, int, tuple, frozenset) to project task functions.
  2. Convert mutable arguments like lists or dicts to tuples/frozensets before creating the task.
  3. Do not pass objects whose __hash__ changes over time, since tasks are cached by hash.

Example fix

task(project.read_files, (tuple(filenames),))  # tuple(...) instead of the mutable list

When it happens

Trigger: Thrown at contingent/code/contingent/projectlib.py:203 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of aosabook/500lines@fba689d101 (2026-08-13). Data as JSON: /api/errors/5cca64d9d3bc73c5. Report an issue: GitHub.

Appendix: source

Thrown at contingent/code/contingent/projectlib.py:203

    return function.__name__, args

class Task(namedtuple('Task', ('task_function', 'args'))):
    """Turn a call to a function into a task 2-tuple.

    Given a task function and an argument list, returns a task 2-tuple
    that encapsulates the call as a single object. `Project` uses these
    task objects for consequence tracking and caching.

    Raises `ValueError` if `args` is not hashable.

    """
    __slots__ = ()

    def __new__(cls, task_function, args):
        try:
            hash(args)
        except TypeError as e:
            raise ValueError('arguments to project tasks must be immutable'
                             ' and hashable, not the {}'.format(e))

        return super().__new__(cls, task_function, args)

    def __repr__(self):
        "Produce a “syntactic,” source-like representation of the task."

        return '{}({})'.format(self.task_function.__name__,
                               ', '.join(repr(arg) for arg in self.args))

View on GitHub (pinned to fba689d101)