[Python-ideas] Re: argparse.py in version 3.8.2 Action=Custom ActionClass needs an option to have methods
Hi Ranga, I think I understand what you're after, but this really looks like something you can solve yourself in several ways (e.g. just creating classes that override one method) so I don't think it's worth changing the argparse module to support this directly. --Guido On Thu, Sep 10, 2020 at 9:48 PM Ranga Swamy wrote: > Hi Guido, > > Great to hear back from you. > > Currently we have the add_argument calling the custom action like shown > below... > > Example: > class MyAction(argparse.Action): > def __init__(self, option_strings, dest, nargs=None, **kwargs): > if nargs is not None: > raise ValueError("nargs not allowed") > super(MyAction, self).__init__(option_strings, dest, **kwargs) > def __call__(self, parser, namespace, values, option_string=None): > print('%r %r %r' % (namespace, values, option_string)) > t1 = subprocess.run("docker container ls", capture_output=True, > shell=True, text=True, check=True) > l = [] > for line in t1.stdout.splitlines(): >r = re.findall(r'\S+',line) >l.append(r[0]) > values = l > setattr(namespace, self.dest, values) > if __name__ == '__main__': > parser = argparse.ArgumentParser(description='A python code to display > Docker stats', epilog='Hope you like this program') > parser.add_argument('-s', action=MyAction) > args = parser.parse_args() > print(args) > > Now in addition to calling the class I want to have a subfunction (may be > a few methods ) under the same custom Actionclass which I want to execute > by calling them in the action=MyAction.Method1/method2/Method3... > instead of calling the custom ClassAction itself. This way I don't have to > create multiple CustomActionClasses, just the multiple > methods under same CustomAction Class > > Currently the way function(or Methods) can be called is by specifying them > in > 1. type=Class.Method (since type can take a callable) > 2. action=CustomAction(with modified _call_ in the CutomClass subclass of > argparse.Action) > and > 3. also via sub_parser=(func=custom method) >eg: subparser.set_defaults(func=Method1) > > So my suggestion is if there are ways of creating a CustomActionClass with > modified __call__ methods then why > not have additional methods that a user can define in those CustomAction > subclass and be called in the action. > > So my code becomes readable based on different classes and different sub > methods and debugging becomes convenient > and the code looks elegant. So my modified CustomActionClass will look > similar to below... > > class MyAction(argparse.Action): > def __init__(self, option_strings, dest, nargs=None, **kwargs): > if nargs is not None: > raise ValueError("nargs not allowed") > super(MyAction, self).__init__(option_strings, dest, **kwargs) > def __call__(self, parser, namespace, values, option_string=None): > print('%r %r %r' % (namespace, values, option_string)) > > def Method1(self, parser, namespace, values, option_string=None): > t1 = subprocess.run("docker container ls", capture_output=True, > shell=True, text=True, check=True) > l = [] > for line in t1.stdout.splitlines(): >r = re.findall(r'\S+',line) >l.append(r[0]) > values = l > setattr(namespace, self.dest, values) > > def Method1(self, parser, namespace, values, option_string=None): > DO Something > > > if __name__ == '__main__': > parser = argparse.ArgumentParser(description='A python code to display > Docker stats', epilog='Hope you like this program') > parser.add_argument('-s', action=MyAction.Method1) > parser.add_argument('-t', action=MyAction.Method2) > parser.add_argument('-b', action=MyAction2.Method1) > args = parser.parse_args() > print(args) > > Thanks and Regards > Rangaswamy > > > > On Thu, Sep 10, 2020 at 7:25 PM Guido van Rossum wrote: > >> Rangarajan, >> >> You may be on to something but the description is a bit dense. >> >> Can you show some examples of how this would work, and contrast those >> with how the same thing would have to be done without your proposed feature? >> >> —Guido >> >> On Thu, Sep 10, 2020 at 05:47 wrote: >> >>> Hi, >>> >>> Got the argparse() in version 3.8.2 and above the action=CusotmClass can >>> have a user defined custom subclass and override the functionality in the >>> def __init__() method. Along with this can we also have a built in custom >>> method/methods that I can define under this custom Class, so that instead >>> of calling the Action itself I have the option of calling the >>> Action.Method() during the add_argument defintition. >>> >>> >>> >>> Regards >>> >>> Ranga >>> >>> ___ >>> >>> Python-ideas mailing list -- python-ideas@python.org >>> >>> To unsubscribe send an email to python-ideas-le...@python.org >>> >>>
[Python-ideas] Re: argparse.py in version 3.8.2 Action=Custom ActionClass needs an option to have methods
Hi Guido, Great to hear back from you. Currently we have the add_argument calling the custom action like shown below... Example: class MyAction(argparse.Action): def __init__(self, option_strings, dest, nargs=None, **kwargs): if nargs is not None: raise ValueError("nargs not allowed") super(MyAction, self).__init__(option_strings, dest, **kwargs) def __call__(self, parser, namespace, values, option_string=None): print('%r %r %r' % (namespace, values, option_string)) t1 = subprocess.run("docker container ls", capture_output=True, shell=True, text=True, check=True) l = [] for line in t1.stdout.splitlines(): r = re.findall(r'\S+',line) l.append(r[0]) values = l setattr(namespace, self.dest, values) if __name__ == '__main__': parser = argparse.ArgumentParser(description='A python code to display Docker stats', epilog='Hope you like this program') parser.add_argument('-s', action=MyAction) args = parser.parse_args() print(args) Now in addition to calling the class I want to have a subfunction (may be a few methods ) under the same custom Actionclass which I want to execute by calling them in the action=MyAction.Method1/method2/Method3... instead of calling the custom ClassAction itself. This way I don't have to create multiple CustomActionClasses, just the multiple methods under same CustomAction Class Currently the way function(or Methods) can be called is by specifying them in 1. type=Class.Method (since type can take a callable) 2. action=CustomAction(with modified _call_ in the CutomClass subclass of argparse.Action) and 3. also via sub_parser=(func=custom method) eg: subparser.set_defaults(func=Method1) So my suggestion is if there are ways of creating a CustomActionClass with modified __call__ methods then why not have additional methods that a user can define in those CustomAction subclass and be called in the action. So my code becomes readable based on different classes and different sub methods and debugging becomes convenient and the code looks elegant. So my modified CustomActionClass will look similar to below... class MyAction(argparse.Action): def __init__(self, option_strings, dest, nargs=None, **kwargs): if nargs is not None: raise ValueError("nargs not allowed") super(MyAction, self).__init__(option_strings, dest, **kwargs) def __call__(self, parser, namespace, values, option_string=None): print('%r %r %r' % (namespace, values, option_string)) def Method1(self, parser, namespace, values, option_string=None): t1 = subprocess.run("docker container ls", capture_output=True, shell=True, text=True, check=True) l = [] for line in t1.stdout.splitlines(): r = re.findall(r'\S+',line) l.append(r[0]) values = l setattr(namespace, self.dest, values) def Method1(self, parser, namespace, values, option_string=None): DO Something if __name__ == '__main__': parser = argparse.ArgumentParser(description='A python code to display Docker stats', epilog='Hope you like this program') parser.add_argument('-s', action=MyAction.Method1) parser.add_argument('-t', action=MyAction.Method2) parser.add_argument('-b', action=MyAction2.Method1) args = parser.parse_args() print(args) Thanks and Regards Rangaswamy On Thu, Sep 10, 2020 at 7:25 PM Guido van Rossum wrote: > Rangarajan, > > You may be on to something but the description is a bit dense. > > Can you show some examples of how this would work, and contrast those with > how the same thing would have to be done without your proposed feature? > > —Guido > > On Thu, Sep 10, 2020 at 05:47 wrote: > >> Hi, >> >> Got the argparse() in version 3.8.2 and above the action=CusotmClass can >> have a user defined custom subclass and override the functionality in the >> def __init__() method. Along with this can we also have a built in custom >> method/methods that I can define under this custom Class, so that instead >> of calling the Action itself I have the option of calling the >> Action.Method() during the add_argument defintition. >> >> >> >> Regards >> >> Ranga >> >> ___ >> >> Python-ideas mailing list -- python-ideas@python.org >> >> To unsubscribe send an email to python-ideas-le...@python.org >> >> https://mail.python.org/mailman3/lists/python-ideas.python.org/ >> >> Message archived at >> https://mail.python.org/archives/list/python-ideas@python.org/message/JBVLH244IKOVLHFBZKC7DDMB6QT2T5QQ/ >> >> Code of Conduct: http://python.org/psf/codeofconduct/ >> >> -- > --Guido (mobile) > ___ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at
[Python-ideas] Re: argparse.py in version 3.8.2 Action=Custom ActionClass needs an option to have methods
Rangarajan, You may be on to something but the description is a bit dense. Can you show some examples of how this would work, and contrast those with how the same thing would have to be done without your proposed feature? —Guido On Thu, Sep 10, 2020 at 05:47 wrote: > Hi, > > Got the argparse() in version 3.8.2 and above the action=CusotmClass can > have a user defined custom subclass and override the functionality in the > def __init__() method. Along with this can we also have a built in custom > method/methods that I can define under this custom Class, so that instead > of calling the Action itself I have the option of calling the > Action.Method() during the add_argument defintition. > > > > Regards > > Ranga > > ___ > > Python-ideas mailing list -- python-ideas@python.org > > To unsubscribe send an email to python-ideas-le...@python.org > > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/JBVLH244IKOVLHFBZKC7DDMB6QT2T5QQ/ > > Code of Conduct: http://python.org/psf/codeofconduct/ > > -- --Guido (mobile) ___ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/HH3NUZEJUHK4RMPWMJ2523DADVXDN2B5/ Code of Conduct: http://python.org/psf/codeofconduct/
[Python-ideas] Re: argparse.py in version 3.8.2 Action=Custom ActionClass needs an option to have methods
On 2020-09-10 at 11:45:37 -, rangap...@gmail.com wrote: > Got the argparse() in version 3.8.2 and above the action=CusotmClass > can have a user defined custom subclass and override the functionality > in the def __init__() method. Along with this can we also have a built > in custom method/methods that I can define under this custom Class, so > that instead of calling the Action itself I have the option of calling > the Action.Method() during the add_argument defintition. Why do you want that? What, exactly, could you do (or do better) with another method that you can't do with another class's __init__? ___ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/XYHLMUASGUC3BAGHUKL5B5XQSHLGJU3L/ Code of Conduct: http://python.org/psf/codeofconduct/