def gen_args(name, args): usage = [""] usage += [name + ':'] usage += \ [" {key}: <{usage}> ({default})".format( key = key, usage = usage, default = default) for (key, usage, default, _) in args] usage.append('') usage.append(name + ':') usage += \ [" {key}: {default}".format( key = key, default = default) for (key, _, default, _) in args] usage = '\n'.join(' ' + i for i in usage) def ret(config): class Object(object): pass obj = Object() for (key, usage, default, conv) in args: if key in config: setattr(obj, key, conv(config[key])) else: setattr(obj, key, conv(default)) return obj return usage, ret def argify(name, args): (usage, config_func) = gen_args(name, args) def ret1(f): def ret2(**kwargs): config = kwargs.get('config', {}) if config is None: config = {} kwargs['config'] = config_func(config) return f(**kwargs) ret2.__doc__ = f.__doc__ + usage return ret2 return ret1