Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.94 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. from functools import wraps
  3. import inspect
  4.  
  5. def argparse_compatible(func):
  6. """Decorator that enables calling a function with its arguments or using an argparse.Namespace object.
  7. For example, the function
  8.  
  9. @argparse_compatible
  10. def f(a, b, c):
  11. return None
  12.  
  13. can be called via
  14.  
  15. f(a, b, c)
  16.  
  17. or via
  18.  
  19. parser = argparse.ArgumentParser()
  20. parser.add_argument("-a")
  21. parser.add_argument("-b")
  22. parser.add_argument("-c")
  23. args = parser.parse_args()
  24.  
  25. f(args)
  26. """
  27. @wraps(func)
  28. def wrapper(*args, **kwargs):
  29. if len(args) == 1 and type(args[0]) == argparse.Namespace:
  30. expected_args = inspect.signature(func).parameters.keys()
  31. args = {arg: getattr(args[0], arg) for arg in expected_args if hasattr(args[0], arg)}
  32. return func(**args)
  33. else:
  34. return func(*args, **kwargs)
  35.  
  36. return wrapper
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement