Package: argparse-best-practice
argparse-best-practicedefbest_practice_bool()->None:defdefault_false()->None:parser=ArgumentParser()parser.add_argument('--default-false',action=BooleanOptionalAction,default=False)parser.add_argument('--default-false-exist',action=BooleanOptionalAction,default=False)parser.add_argument('--default-false-exist-with-no',action=BooleanOptionalAction,default=False)args=parser.parse_args(['--default-false-exist','--no-default-false-exist-with-no'])assertargs.default_false==Falseassertargs.default_false_exist==Trueassertargs.default_false_exist_with_no==Falsedefault_false()defdefault_true()->None:parser=ArgumentParser()parser.add_argument('--default-true',action=BooleanOptionalAction,default=True)parser.add_argument('--default-true-exist',action=BooleanOptionalAction,default=True)parser.add_argument('--default-true-exist-with-no',action=BooleanOptionalAction,default=True)args=parser.parse_args(['--default-true-exist','--no-default-true-exist-with-no'])assertargs.default_true==Trueassertargs.default_true_exist==Trueassertargs.default_true_exist_with_no==Falsedefault_true()defbest_practice_string()->None:defdefault_string()->None:parser=ArgumentParser()parser.add_argument('--default-string',default='a')parser.add_argument('--default-string-exist',default='a')args=parser.parse_args(['--default-string-exist','b'])assertargs.default_string=='a'assertargs.default_string_exist=='b'default_string()defmy_string_validation()->None:classMyStringValidationError(Exception):def__init__(self,value:str)->None:self.value=valuesuper().__init__()classMyStringValidator(Action):def__call__(self,parser:ArgumentParser,namespace:Namespace,values:Union[Text,Sequence[Any],None],option_string:Optional[Text])->None:ifvalues.islower():raiseMyStringValidationError(values)setattr(namespace,self.dest,values)parser=ArgumentParser()parser.add_argument('--my-string-validation',action=MyStringValidator)try:args=parser.parse_args(['--my-string-validation','a'])exceptMyStringValidationErrorase:assertMyStringValidationError('a').value==e.valueelse:assertFalseargs=parser.parse_args(['--my-string-validation','A'])assertargs.my_string_validation=='A'my_string_validation()defbest_practice_number()->None:defdefault_number()->None:parser=ArgumentParser()parser.add_argument('--default-number',type=int,default=0)parser.add_argument('--default-number-exist',type=int,default=0)args=parser.parse_args(['--default-number-exist','1'])assertargs.default_number==0assertargs.default_number_exist==1default_number()defmy_number_validation()->None:classMyNumberValidationError(Exception):def__init__(self,value:int)->None:self.value=valuesuper().__init__()classMyNumberValidator(Action):def__call__(self,parser:ArgumentParser,namespace:Namespace,values:Union[Text,Sequence[Any],None],option_string:Optional[Text])->None:if0>values:raiseMyNumberValidationError(values)setattr(namespace,self.dest,values)parser=ArgumentParser()parser.add_argument('--my-number-validation',action=MyNumberValidator,type=int,default=0)try:args=parser.parse_args(['--my-number-validation','-1'])exceptMyNumberValidationErrorase:assertMyNumberValidationError(-1).value==e.valueelse:assertFalsemy_number_validation()defbest_practice_list()->None:defdefault_empty_list()->None:parser=ArgumentParser()parser.add_argument('--default-empty-list',action='extend',nargs='+',default=[])parser.add_argument('--default-empty-list-exist',action='extend',nargs='+',default=[])args=parser.parse_args(['--default-empty-list-exist','a','b'])assertargs.default_empty_list==[]assertargs.default_empty_list_exist==['a','b']default_empty_list()defmy_unique_list()->None:classMyUniqueListCreator(Action):def__call__(self,parser:ArgumentParser,namespace:Namespace,values:Union[Text,Sequence[Any],None],option_string:Optional[Text])->None:default=getattr(namespace,self.dest)ifhasattr(namespace,self.dest)else[]default.extend(values)new_value=list(set(default))new_value.sort()setattr(namespace,self.dest,new_value)parser=ArgumentParser()parser.add_argument('--my-unique-list',action=MyUniqueListCreator,nargs='+',default=['a'])args=parser.parse_args(['--my-unique-list','a','b'])assertargs.my_unique_list==['a','b']my_unique_list()