Updating NamedTuple members based on a function and previous value
I decided that since I'll likely never need to associate the same function with multiple keys, I might as well just associate the keys with a function directly:

def update3(self, **kwargs: Callable[[T], T]) -&gt; GameSettings:
    return self._replace(**{k: f(getattr(self, k)) for k, f in kwargs.items()})

&gt;&gt;&gt; sett = GameSettings(fps=30, is_running=True)

&gt;&gt;&gt; sett.update3(is_running=lambda x: not x)
GameSettings(fps=30, is_running=False)


The code still isn't beautiful, but it makes a lot more sense when calling now.