custom_argparse.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2018-10-15 14:32:12
  4. ---------
  5. @summary: 封装ArgumentParser, 使其支持function, 调用start自动执行
  6. ---------
  7. @author: Boris
  8. @email: boris_liu@foxmail.com
  9. """
  10. import argparse
  11. class ArgumentParser(argparse.ArgumentParser):
  12. def __init__(self, *args, **kwargs):
  13. self.functions = {}
  14. super(ArgumentParser, self).__init__(*args, **kwargs)
  15. def add_argument(self, *args, **kwargs):
  16. function = kwargs.pop("function") if "function" in kwargs else None
  17. key = self._get_optional_kwargs(*args, **kwargs).get("dest")
  18. self.functions[key] = function
  19. return super(ArgumentParser, self).add_argument(*args, **kwargs)
  20. def start(self, args=None, namespace=None):
  21. args = self.parse_args(args=args, namespace=namespace)
  22. for key, value in vars(args).items(): # vars() 函数返回对象object的属性和属性值的字典对象
  23. if value not in (None, False):
  24. if callable(self.functions[key]):
  25. if value != True:
  26. if isinstance(value, list) and len(value) == 1:
  27. value = value[0]
  28. self.functions[key](value)
  29. else:
  30. self.functions[key]()
  31. def run(self, args, values=None):
  32. if args in self.functions:
  33. if values:
  34. self.functions[args](values)
  35. else:
  36. self.functions[args]()
  37. else:
  38. raise Exception(f"无此方法: {args}")
  39. if __name__ == "__main__":
  40. def test():
  41. print("test not args func")
  42. def test2(args):
  43. print("test args func", args)
  44. parser = ArgumentParser(description="测试")
  45. parser.add_argument("--test2", type=int, nargs=1, help="(1|2)", function=test2)
  46. parser.add_argument("--test", action="store_true", help="", function=test)
  47. parser.start()