2323from yaml import load as yaml_load
2424
2525from .protocol import SUPPORT_SCHEMA
26- from .utils import get_parent_tree , parse_value_string_by_schema , parse_schema_as_cmd
26+ from .utils import SchemaType , get_parent_tree , parse_value_string_by_schema , parse_schema_as_cmd
2727from .entrypoint_base import EntryPointABC
2828
2929
@@ -55,7 +55,77 @@ def _check_schema(self) -> None:
5555 raise e
5656 # sys.exit(1)
5757
58- def __init__ (self ) -> None :
58+ def __init__ (self , * ,
59+ description : Optional [str ] = None ,
60+ epilog : Optional [str ] = None ,
61+ usage : Optional [str ] = None ,
62+ name : Optional [str ] = None ,
63+ schema : Optional [SchemaType ] = None ,
64+ verify_schema : Optional [bool ] = None ,
65+ default_config_file_paths : Optional [List [str ]] = None ,
66+ config_file_only_get_need : Optional [bool ] = None ,
67+ load_all_config_file : Optional [bool ] = None ,
68+ env_prefix : Optional [str ] = None ,
69+ parse_env : Optional [bool ] = None ,
70+ argparse_check_required : Optional [bool ] = None ,
71+ argparse_noflag : Optional [str ] = None ,
72+ config_file_parser_map : Optional [Dict [str , Callable [[Path ], Dict [str , Any ]]]] = None ,
73+ main : Optional [Callable [..., None ]] = None
74+ ) -> None :
75+ """初始化时定义配置.
76+
77+ 使用这一特性我们就可以不用继承也可以定义节点了.这一特性比较适合用于那些非叶子节点.
78+
79+ Args:
80+ description (Optional[str], optional): 节点命令行的描述信息. Defaults to None.
81+ epilog (Optional[str], optional): 节点命令行的epilog信息. Defaults to None.
82+ usage (Optional[str], optional): 节点命令行的usage信息. Defaults to None.
83+ name (Optional[str], optional): 节点的name属性. Defaults to None.
84+ schema (Optional[Dict[str, Union[str, List[str], Dict[str, Dict[str, Any]]]]], optional): 节点的校验json schema. Defaults to None.
85+ verify_schema (Optional[bool], optional): 配置是否校验schema. Defaults to None.
86+ default_config_file_paths (Optional[List[str]], optional): 默认配置文件路径列表. Defaults to None.
87+ config_file_only_get_need (Optional[bool], optional): 设置是否在加载配置文件时只获取schema中定义的内容. Defaults to None.
88+ load_all_config_file (Optional[bool], optional): 是否尝试加载全部指定的配置文件路径下的配置文件. Defaults to None.
89+ env_prefix (Optional[str], optional): 设置环境变量的前缀. Defaults to None.
90+ parse_env (Optional[bool], optional): 设置是否加载环境变量. Defaults to None.
91+ argparse_check_required (Optional[bool], optional): 设置是否构造叶子节点命令行时指定schema中定义为必须的参数项为必填项. Defaults to None.
92+ argparse_noflag (Optional[str], optional): 指定命令行中noflag的参数. Defaults to None.
93+ config_file_parser_map (Optional[Dict[str, Callable[[Path], Dict[str, Any]]]], optional): 设置自定义配置文件名的解析映射. Defaults to None.
94+ main (Optional[Callable[..., None]], optional): 设置作为入口的执行函数. Defaults to None.
95+ """
96+ if description is not None :
97+ self .__doc__ = description
98+ if epilog is not None :
99+ self .epilog = epilog
100+ if usage is not None :
101+ self .usage = usage
102+ if name is not None :
103+ self ._name = name
104+ if schema is not None :
105+ self .schema = schema
106+ if verify_schema is not None :
107+ self .verify_schema = verify_schema
108+ if default_config_file_paths is not None :
109+ self .default_config_file_paths = default_config_file_paths
110+ if config_file_only_get_need is not None :
111+ self .config_file_only_get_need = config_file_only_get_need
112+ if load_all_config_file is not None :
113+ self .load_all_config_file = load_all_config_file
114+ if env_prefix is not None :
115+ self .env_prefix = env_prefix
116+ if parse_env is not None :
117+ self .parse_env = parse_env
118+ if argparse_check_required is not None :
119+ self .argparse_check_required = argparse_check_required
120+ if argparse_noflag is not None :
121+ self .argparse_noflag = argparse_noflag
122+ if config_file_parser_map is not None :
123+ self ._config_file_parser_map = config_file_parser_map
124+ if config_file_parser_map is not None :
125+ self ._config_file_parser_map = config_file_parser_map
126+ if main is not None :
127+ self ._main = main
128+
59129 self ._check_schema ()
60130 self ._subcmds = {}
61131 self ._main = None
@@ -79,8 +149,8 @@ def regist_subcmd(self, subcmd: EntryPointABC) -> None:
79149 subcmd .parent = self
80150 self ._subcmds [subcmd .name ] = subcmd
81151
82- def regist_sub (self , subcmdclz : type ) -> EntryPointABC :
83- instance = subcmdclz ()
152+ def regist_sub (self , subcmdclz : type , ** kwargs : Any ) -> EntryPointABC :
153+ instance = subcmdclz (** kwargs )
84154 self .regist_subcmd (instance )
85155 return instance
86156
@@ -139,7 +209,7 @@ def _make_commandline_parse_by_schema(self, parser: argparse.ArgumentParser) ->
139209 if self .schema is None :
140210 raise AttributeError ("此处不该被执行" )
141211 else :
142- properties : Dict [str , Any ] = self .schema .get ("properties" , {})
212+ properties : Dict [str , Dict [ str , Any ] ] = self .schema .get ("properties" , {})
143213 requireds : List [str ] = self .schema .get ("required" , [])
144214 for key , prop in properties .items ():
145215 required = False
@@ -235,7 +305,7 @@ def file_config_filter(self, file_param: Dict[str, Any]) -> Dict[str, Any]:
235305 Dict[str, Any]: 筛选过后的参数
236306 """
237307 if self .config_file_only_get_need and self .schema is not None and self .schema .get ("properties" ) is not None :
238- needs = list (self .schema . get ( "properties" ) .keys ())
308+ needs = list (self .schema [ "properties" ] .keys ())
239309 res = {}
240310 for key in needs :
241311 if file_param .get (key ) is not None :
0 commit comments