Skip to content

Instantly share code, notes, and snippets.

@kurtbrose
Created August 25, 2015 04:58
Show Gist options
  • Save kurtbrose/1d664ed008298a1600d1 to your computer and use it in GitHub Desktop.
Save kurtbrose/1d664ed008298a1600d1 to your computer and use it in GitHub Desktop.
Converts functions into simple commands.
'''
Converts functions into simple commands.
Turns function arguments into command line arguments, and docstrings into helpstrings.
Essentially an argparse shortcutter.
e.g.
@f2cmd.cmd(arg1={"type": int})
def my_main_function(arg1, arg2):
pass
if __name__ == "__main__":
my_main_function.run()
'''
import argparse
import functools
import inspect
def cmd(_overrides=None, **kwargs):
overrides = _overrides or {}
overrides.update(kwargs)
class Command(object):
'''
Command is intended to be used as a decorator or wrapper for the
main function.
'''
def __init__(self, f):
self.f = f
code = f.func_code
defaults = f.func_defaults
nargs = code.co_argcount
argnames = code.co_varnames[:nargs]
if defaults:
defaults = zip(argnames[-len(defaults):], defaults)
argnames = argnames[:-len(defaults)]
self.parser = argparse.ArgumentParser(f.__doc__)
for name in argnames:
parser.add_argument(
name, **overrides.get(name, {}))
for name, default in defaults:
parser.add_argument(
name, default=default, **overrides.get(name, {}))
def run(self):
return self.f(**self.parser.parse_args().__dict__)
def __call__(self, *args, **kwargs):
return self.f(*args, **kwargs)
return Command
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment