I still don't really see why it's necessary. BalancingLearner.load could take something additional that maps learners to filenames, for example. The API for 'BalancingLearner.load' is already not the same as for the other learners, because it expects a path to a directory rather than to a regular file, so it doesn't seem bad to have it also differ in other ways.
For example, for BalancingLearner, 'fname' could expect a callable that takes a learner and gives back a filename where the data can be got.
In fact it can be even simpler because BalancingLearner.from_product uses functools:
defcombo_fname(learner):# this function is pureval=learner.function.keywords# from functools.partialreturn'data_folder/'+'__'.join([f'{k}_{v}'fork,vinval.items()])combos=dict(a=[1,2],b=[1])learner=BalancingLearner.from_product(f,Learner1D,dict(bounds=(-1,1)),combos)learner.load(fname=combo_fname)