diff mbox

[nfs-utils,RFC,05/15] mountstats: Convert existing option parsing to use the getopt module

Message ID 1415206872-864-6-git-send-email-smayhew@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Scott Mayhew Nov. 5, 2014, 5:01 p.m. UTC
Signed-off-by: Scott Mayhew <smayhew@redhat.com>
---
 tools/mountstats/mountstats.py | 62 +++++++++++++++++++++---------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

Comments

Chuck Lever III Nov. 6, 2014, 1:52 a.m. UTC | #1
On Nov 5, 2014, at 12:01 PM, Scott Mayhew <smayhew@redhat.com> wrote:

I’m not clear why you need to replace this code. But if
you really do need to replace it, why not use the more
Python-esque argparse module, which would replace both
the option parsing and help text?

> Signed-off-by: Scott Mayhew <smayhew@redhat.com>
> ---
> tools/mountstats/mountstats.py | 62 +++++++++++++++++++++---------------------
> 1 file changed, 31 insertions(+), 31 deletions(-)
> 
> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
> index 2fe1362..272a8f9 100755
> --- a/tools/mountstats/mountstats.py
> +++ b/tools/mountstats/mountstats.py
> @@ -24,6 +24,7 @@ MA 02110-1301 USA
> """
> 
> import sys, os, time
> +import getopt
> 
> Mountstats_version = '0.2'
> 
> @@ -547,37 +548,33 @@ def print_mountstats_help(name):
> def mountstats_command():
>     """Mountstats command
>     """
> +    try:
> +        opts, args = getopt.getopt(sys.argv[1:], "ehnrsv", ["end", "help", "nfs", "rpc", "start", "version"])
> +    except getopt.GetoptError as err:
> +        print_mountstats_help(prog)
> +
>     mountpoints = []
>     nfs_only = False
>     rpc_only = False
> 
> -    for arg in sys.argv:
> -        if arg in ['-h', '--help', 'help', 'usage']:
> +    for o, a in opts:
> +        if o in ("-e", "--end"):
> +            raise Exception('Sampling is not yet implemented')
> +        elif o in ("-h", "--help"):
>             print_mountstats_help(prog)
> -            return
> -
> -        if arg in ['-v', '--version', 'version']:
> -            print('%s version %s' % (sys.argv[0], Mountstats_version))
>             sys.exit(0)
> -
> -        if arg in ['-n', '--nfs']:
> +        elif o in ("-n", "--nfs"):
>             nfs_only = True
> -            continue
> -
> -        if arg in ['-r', '--rpc']:
> +        elif o in ("-r", "--rpc"):
>             rpc_only = True
> -            continue
> -
> -        if arg in ['-s', '--start']:
> -            raise Exception('Sampling is not yet implemented')
> -
> -        if arg in ['-e', '--end']:
> +        elif o in ("-s", "--start"):
>             raise Exception('Sampling is not yet implemented')
> -
> -        if arg == sys.argv[0]:
> -            continue
> -
> -        mountpoints += [arg]
> +        elif o in ("-v", "--version"):
> +            print('%s version %s' % (sys.argv[0], Mountstats_version))
> +            sys.exit(0)
> +        else:
> +            assert False, "unhandled option"
> +    mountpoints += args
> 
>     if mountpoints == []:
>         print_mountstats_help(prog)
> @@ -662,23 +659,26 @@ def print_iostat_summary(old, new, devices, time):
> def iostat_command():
>     """iostat-like command for NFS mount points
>     """
> +    try:
> +        opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "version"])
> +    except getopt.GetoptError as err:
> +        print_iostat_help(prog)
>     mountstats = parse_stats_file('/proc/self/mountstats')
>     devices = []
>     interval_seen = False
>     count_seen = False
> 
> -    for arg in sys.argv:
> -        if arg in ['-h', '--help', 'help', 'usage']:
> +    for o, a in opts:
> +        if o in ("-h", "--help"):
>             print_iostat_help(prog)
> -            return
> -
> -        if arg in ['-v', '--version', 'version']:
> +            sys.exit(0)
> +        elif o in ("-v", "--version"):
>             print('%s version %s' % (sys.argv[0], Mountstats_version))
> -            return
> -
> -        if arg == sys.argv[0]:
> -            continue
> +            sys.exit(0)
> +        else:
> +            assert False, "unhandled option"
> 
> +    for arg in args:
>         if arg in mountstats:
>             devices += [arg]
>         elif not interval_seen:
> -- 
> 1.9.3
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com



--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Scott Mayhew Nov. 6, 2014, 2:44 p.m. UTC | #2
On Wed, 05 Nov 2014, Chuck Lever wrote:

> 
> On Nov 5, 2014, at 12:01 PM, Scott Mayhew <smayhew@redhat.com> wrote:
> 
> I?m not clear why you need to replace this code. But if
> you really do need to replace it, why not use the more
> Python-esque argparse module, which would replace both
> the option parsing and help text?

This started out as a hacked up version of the mountstats program that I
was really planning on sending anywhere, and originally I had only done
the nfsstat options using getopt.  When I redid the changes in git I
decided to convert the rest of them to use getopt as well.  I can change
it back to the original parsing or I can use argparse.  Let me know
which you prefer (I have no preference either way).

> 
> > Signed-off-by: Scott Mayhew <smayhew@redhat.com>
> > ---
> > tools/mountstats/mountstats.py | 62 +++++++++++++++++++++---------------------
> > 1 file changed, 31 insertions(+), 31 deletions(-)
> > 
> > diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
> > index 2fe1362..272a8f9 100755
> > --- a/tools/mountstats/mountstats.py
> > +++ b/tools/mountstats/mountstats.py
> > @@ -24,6 +24,7 @@ MA 02110-1301 USA
> > """
> > 
> > import sys, os, time
> > +import getopt
> > 
> > Mountstats_version = '0.2'
> > 
> > @@ -547,37 +548,33 @@ def print_mountstats_help(name):
> > def mountstats_command():
> >     """Mountstats command
> >     """
> > +    try:
> > +        opts, args = getopt.getopt(sys.argv[1:], "ehnrsv", ["end", "help", "nfs", "rpc", "start", "version"])
> > +    except getopt.GetoptError as err:
> > +        print_mountstats_help(prog)
> > +
> >     mountpoints = []
> >     nfs_only = False
> >     rpc_only = False
> > 
> > -    for arg in sys.argv:
> > -        if arg in ['-h', '--help', 'help', 'usage']:
> > +    for o, a in opts:
> > +        if o in ("-e", "--end"):
> > +            raise Exception('Sampling is not yet implemented')
> > +        elif o in ("-h", "--help"):
> >             print_mountstats_help(prog)
> > -            return
> > -
> > -        if arg in ['-v', '--version', 'version']:
> > -            print('%s version %s' % (sys.argv[0], Mountstats_version))
> >             sys.exit(0)
> > -
> > -        if arg in ['-n', '--nfs']:
> > +        elif o in ("-n", "--nfs"):
> >             nfs_only = True
> > -            continue
> > -
> > -        if arg in ['-r', '--rpc']:
> > +        elif o in ("-r", "--rpc"):
> >             rpc_only = True
> > -            continue
> > -
> > -        if arg in ['-s', '--start']:
> > -            raise Exception('Sampling is not yet implemented')
> > -
> > -        if arg in ['-e', '--end']:
> > +        elif o in ("-s", "--start"):
> >             raise Exception('Sampling is not yet implemented')
> > -
> > -        if arg == sys.argv[0]:
> > -            continue
> > -
> > -        mountpoints += [arg]
> > +        elif o in ("-v", "--version"):
> > +            print('%s version %s' % (sys.argv[0], Mountstats_version))
> > +            sys.exit(0)
> > +        else:
> > +            assert False, "unhandled option"
> > +    mountpoints += args
> > 
> >     if mountpoints == []:
> >         print_mountstats_help(prog)
> > @@ -662,23 +659,26 @@ def print_iostat_summary(old, new, devices, time):
> > def iostat_command():
> >     """iostat-like command for NFS mount points
> >     """
> > +    try:
> > +        opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "version"])
> > +    except getopt.GetoptError as err:
> > +        print_iostat_help(prog)
> >     mountstats = parse_stats_file('/proc/self/mountstats')
> >     devices = []
> >     interval_seen = False
> >     count_seen = False
> > 
> > -    for arg in sys.argv:
> > -        if arg in ['-h', '--help', 'help', 'usage']:
> > +    for o, a in opts:
> > +        if o in ("-h", "--help"):
> >             print_iostat_help(prog)
> > -            return
> > -
> > -        if arg in ['-v', '--version', 'version']:
> > +            sys.exit(0)
> > +        elif o in ("-v", "--version"):
> >             print('%s version %s' % (sys.argv[0], Mountstats_version))
> > -            return
> > -
> > -        if arg == sys.argv[0]:
> > -            continue
> > +            sys.exit(0)
> > +        else:
> > +            assert False, "unhandled option"
> > 
> > +    for arg in args:
> >         if arg in mountstats:
> >             devices += [arg]
> >         elif not interval_seen:
> > -- 
> > 1.9.3
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
> 
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chuck Lever III Nov. 6, 2014, 3:02 p.m. UTC | #3
On Nov 6, 2014, at 9:44 AM, Scott Mayhew <smayhew@redhat.com> wrote:

> On Wed, 05 Nov 2014, Chuck Lever wrote:
> 
>> 
>> On Nov 5, 2014, at 12:01 PM, Scott Mayhew <smayhew@redhat.com> wrote:
>> 
>> I?m not clear why you need to replace this code. But if
>> you really do need to replace it, why not use the more
>> Python-esque argparse module, which would replace both
>> the option parsing and help text?
> 
> This started out as a hacked up version of the mountstats program that I
> was really planning on sending anywhere, and originally I had only done
> the nfsstat options using getopt.  When I redid the changes in git I
> decided to convert the rest of them to use getopt as well.  I can change
> it back to the original parsing or I can use argparse.  Let me know
> which you prefer (I have no preference either way).

I wrote mountstats almost 10 years ago, and Python has changed a lot
since then. It makes sense to modernize this a bit. I think argparse:

+ is more idiomatic Python

+ allows you to fix up the help text and attach it directly to each option

+ maybe makes it easier to manage the coexistence of the different commands
  in the same source code?

Give it a try. Here’s some sample code:

  http://git.linux-nfs.org/?p=cel/fedfs-utils.git;a=blob;f=src/domainroot/fedfs-domainroot.in;h=6db32eb0fdb47b90e25189929ec9588dbf342eda;hb=HEAD

If it starts looking crazy, then stick with getopt.


>> 
>>> Signed-off-by: Scott Mayhew <smayhew@redhat.com>
>>> ---
>>> tools/mountstats/mountstats.py | 62 +++++++++++++++++++++---------------------
>>> 1 file changed, 31 insertions(+), 31 deletions(-)
>>> 
>>> diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
>>> index 2fe1362..272a8f9 100755
>>> --- a/tools/mountstats/mountstats.py
>>> +++ b/tools/mountstats/mountstats.py
>>> @@ -24,6 +24,7 @@ MA 02110-1301 USA
>>> """
>>> 
>>> import sys, os, time
>>> +import getopt
>>> 
>>> Mountstats_version = '0.2'
>>> 
>>> @@ -547,37 +548,33 @@ def print_mountstats_help(name):
>>> def mountstats_command():
>>>    """Mountstats command
>>>    """
>>> +    try:
>>> +        opts, args = getopt.getopt(sys.argv[1:], "ehnrsv", ["end", "help", "nfs", "rpc", "start", "version"])
>>> +    except getopt.GetoptError as err:
>>> +        print_mountstats_help(prog)
>>> +
>>>    mountpoints = []
>>>    nfs_only = False
>>>    rpc_only = False
>>> 
>>> -    for arg in sys.argv:
>>> -        if arg in ['-h', '--help', 'help', 'usage']:
>>> +    for o, a in opts:
>>> +        if o in ("-e", "--end"):
>>> +            raise Exception('Sampling is not yet implemented')
>>> +        elif o in ("-h", "--help"):
>>>            print_mountstats_help(prog)
>>> -            return
>>> -
>>> -        if arg in ['-v', '--version', 'version']:
>>> -            print('%s version %s' % (sys.argv[0], Mountstats_version))
>>>            sys.exit(0)
>>> -
>>> -        if arg in ['-n', '--nfs']:
>>> +        elif o in ("-n", "--nfs"):
>>>            nfs_only = True
>>> -            continue
>>> -
>>> -        if arg in ['-r', '--rpc']:
>>> +        elif o in ("-r", "--rpc"):
>>>            rpc_only = True
>>> -            continue
>>> -
>>> -        if arg in ['-s', '--start']:
>>> -            raise Exception('Sampling is not yet implemented')
>>> -
>>> -        if arg in ['-e', '--end']:
>>> +        elif o in ("-s", "--start"):
>>>            raise Exception('Sampling is not yet implemented')
>>> -
>>> -        if arg == sys.argv[0]:
>>> -            continue
>>> -
>>> -        mountpoints += [arg]
>>> +        elif o in ("-v", "--version"):
>>> +            print('%s version %s' % (sys.argv[0], Mountstats_version))
>>> +            sys.exit(0)
>>> +        else:
>>> +            assert False, "unhandled option"
>>> +    mountpoints += args
>>> 
>>>    if mountpoints == []:
>>>        print_mountstats_help(prog)
>>> @@ -662,23 +659,26 @@ def print_iostat_summary(old, new, devices, time):
>>> def iostat_command():
>>>    """iostat-like command for NFS mount points
>>>    """
>>> +    try:
>>> +        opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "version"])
>>> +    except getopt.GetoptError as err:
>>> +        print_iostat_help(prog)
>>>    mountstats = parse_stats_file('/proc/self/mountstats')
>>>    devices = []
>>>    interval_seen = False
>>>    count_seen = False
>>> 
>>> -    for arg in sys.argv:
>>> -        if arg in ['-h', '--help', 'help', 'usage']:
>>> +    for o, a in opts:
>>> +        if o in ("-h", "--help"):
>>>            print_iostat_help(prog)
>>> -            return
>>> -
>>> -        if arg in ['-v', '--version', 'version']:
>>> +            sys.exit(0)
>>> +        elif o in ("-v", "--version"):
>>>            print('%s version %s' % (sys.argv[0], Mountstats_version))
>>> -            return
>>> -
>>> -        if arg == sys.argv[0]:
>>> -            continue
>>> +            sys.exit(0)
>>> +        else:
>>> +            assert False, "unhandled option"
>>> 
>>> +    for arg in args:
>>>        if arg in mountstats:
>>>            devices += [arg]
>>>        elif not interval_seen:
>>> -- 
>>> 1.9.3
>>> 
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> 
>> --
>> Chuck Lever
>> chuck[dot]lever[at]oracle[dot]com
>> 
>> 
>> 

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com



--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/tools/mountstats/mountstats.py b/tools/mountstats/mountstats.py
index 2fe1362..272a8f9 100755
--- a/tools/mountstats/mountstats.py
+++ b/tools/mountstats/mountstats.py
@@ -24,6 +24,7 @@  MA 02110-1301 USA
 """
 
 import sys, os, time
+import getopt
 
 Mountstats_version = '0.2'
 
@@ -547,37 +548,33 @@  def print_mountstats_help(name):
 def mountstats_command():
     """Mountstats command
     """
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "ehnrsv", ["end", "help", "nfs", "rpc", "start", "version"])
+    except getopt.GetoptError as err:
+        print_mountstats_help(prog)
+
     mountpoints = []
     nfs_only = False
     rpc_only = False
 
-    for arg in sys.argv:
-        if arg in ['-h', '--help', 'help', 'usage']:
+    for o, a in opts:
+        if o in ("-e", "--end"):
+            raise Exception('Sampling is not yet implemented')
+        elif o in ("-h", "--help"):
             print_mountstats_help(prog)
-            return
-
-        if arg in ['-v', '--version', 'version']:
-            print('%s version %s' % (sys.argv[0], Mountstats_version))
             sys.exit(0)
-
-        if arg in ['-n', '--nfs']:
+        elif o in ("-n", "--nfs"):
             nfs_only = True
-            continue
-
-        if arg in ['-r', '--rpc']:
+        elif o in ("-r", "--rpc"):
             rpc_only = True
-            continue
-
-        if arg in ['-s', '--start']:
-            raise Exception('Sampling is not yet implemented')
-
-        if arg in ['-e', '--end']:
+        elif o in ("-s", "--start"):
             raise Exception('Sampling is not yet implemented')
-
-        if arg == sys.argv[0]:
-            continue
-
-        mountpoints += [arg]
+        elif o in ("-v", "--version"):
+            print('%s version %s' % (sys.argv[0], Mountstats_version))
+            sys.exit(0)
+        else:
+            assert False, "unhandled option"
+    mountpoints += args
 
     if mountpoints == []:
         print_mountstats_help(prog)
@@ -662,23 +659,26 @@  def print_iostat_summary(old, new, devices, time):
 def iostat_command():
     """iostat-like command for NFS mount points
     """
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "version"])
+    except getopt.GetoptError as err:
+        print_iostat_help(prog)
     mountstats = parse_stats_file('/proc/self/mountstats')
     devices = []
     interval_seen = False
     count_seen = False
 
-    for arg in sys.argv:
-        if arg in ['-h', '--help', 'help', 'usage']:
+    for o, a in opts:
+        if o in ("-h", "--help"):
             print_iostat_help(prog)
-            return
-
-        if arg in ['-v', '--version', 'version']:
+            sys.exit(0)
+        elif o in ("-v", "--version"):
             print('%s version %s' % (sys.argv[0], Mountstats_version))
-            return
-
-        if arg == sys.argv[0]:
-            continue
+            sys.exit(0)
+        else:
+            assert False, "unhandled option"
 
+    for arg in args:
         if arg in mountstats:
             devices += [arg]
         elif not interval_seen: