config_utils.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from typing import Tuple, Dict, Union, List
  2. from dw_base import NORM_GRN, NORM_MGT
  3. from dw_base.utils.log_utils import pretty_print
  4. def parse_args(args: [str]) -> Tuple[Dict[str, Union[str, bool, List[str]]], list]:
  5. """
  6. 解析参数,返回参数map和未识别参数
  7. Args:
  8. args: 参数
  9. Returns: 参数map和未识别参数
  10. """
  11. args_length = len(args)
  12. unrecognized_args = []
  13. config = {}
  14. skip_next = False
  15. for index in range(0, args_length):
  16. if skip_next:
  17. skip_next = False
  18. continue
  19. arg = args[index]
  20. if arg.startswith('--') or arg.startswith('-'):
  21. if arg.startswith('--'):
  22. key_start = 2
  23. else:
  24. key_start = 1
  25. if arg.__contains__('='):
  26. # --key=value形式或-key=value形式
  27. key = arg[key_start:arg.index('=')]
  28. value = arg[arg.index('=') + 1:].strip()
  29. elif index + 1 == args_length:
  30. # --key形式或-key形式,且是最后一个参数
  31. key = arg[key_start:]
  32. value = True
  33. else:
  34. # --key形式或-key形式,后面还有参数
  35. key = arg[key_start:]
  36. next_arg = args[index + 1]
  37. if next_arg.startswith('--') or next_arg.startswith('-'):
  38. # 下一个参数也是--key或-key形式
  39. value = True
  40. else:
  41. # 下一个参数是当前key的value,跳过下一个参数的处理
  42. value = next_arg.strip()
  43. skip_next = True
  44. if config.__contains__(key):
  45. # 列表类配置,例如: -c c1 -c c2 -c c3
  46. if isinstance(config[key], list):
  47. # 第三次以后识别到
  48. list_value = config.get(key) # type:List
  49. if not list_value.__contains__(value):
  50. list_value.append(value)
  51. config[key] = list_value
  52. else:
  53. # 第二次识别到
  54. if config[key] != value:
  55. config[key] = [config.get(key), value]
  56. else:
  57. # 第一次识别到
  58. config[key] = value
  59. else:
  60. # 其他情况的参数丢弃
  61. unrecognized_args.append(arg)
  62. print_config(config)
  63. return config, unrecognized_args
  64. def print_config(config: Dict[str, str]):
  65. """
  66. 打印配置
  67. Args:
  68. config: 配置
  69. Returns:
  70. """
  71. for key, value in config.items():
  72. if isinstance(value, list):
  73. key_value = f'{NORM_GRN}{key} => [{", ".join(value)}]'
  74. else:
  75. key_value = f'{NORM_GRN}{key} => {str(value)}'
  76. pretty_print(f'{NORM_MGT}解析到参数: {key_value}')