]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109164: Replace `getopt` with `argparse` in pdb (#109165)
authorTian Gao <gaogaotiantian@hotmail.com>
Fri, 22 Sep 2023 16:55:48 +0000 (09:55 -0700)
committerGitHub <noreply@github.com>
Fri, 22 Sep 2023 16:55:48 +0000 (16:55 +0000)
Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/pdb.py
Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst [new file with mode: 0644]

index a391bc1df74d8e76ed606481c4279390c1378ab6..fd62d246f124abe15154bea6641b87e116df50cf 100755 (executable)
@@ -2081,8 +2081,6 @@ def help():
     pydoc.pager(__doc__)
 
 _usage = """\
-usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ...
-
 Debug the Python program given by pyfile. Alternatively,
 an executable module or package to debug can be specified using
 the -m switch.
@@ -2097,34 +2095,44 @@ To let the script run up to a given line X in the debugged file, use
 
 
 def main():
-    import getopt
-
-    opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command='])
-
-    if not args:
-        print(_usage)
+    import argparse
+
+    parser = argparse.ArgumentParser(prog="pdb",
+                                     description=_usage,
+                                     formatter_class=argparse.RawDescriptionHelpFormatter,
+                                     allow_abbrev=False)
+
+    parser.add_argument('-c', '--command', action='append', default=[], metavar='command')
+    group = parser.add_mutually_exclusive_group(required=True)
+    group.add_argument('-m', metavar='module')
+    group.add_argument('pyfile', nargs='?')
+    parser.add_argument('args', nargs="*")
+
+    if len(sys.argv) == 1:
+        # If no arguments were given (python -m pdb), print the whole help message.
+        # Without this check, argparse would only complain about missing required arguments.
+        parser.print_help()
         sys.exit(2)
 
-    if any(opt in ['-h', '--help'] for opt, optarg in opts):
-        print(_usage)
-        sys.exit()
-
-    commands = [optarg for opt, optarg in opts if opt in ['-c', '--command']]
+    opts = parser.parse_args()
 
-    module_indicated = any(opt in ['-m'] for opt, optarg in opts)
-    cls = _ModuleTarget if module_indicated else _ScriptTarget
-    target = cls(args[0])
+    if opts.m:
+        file = opts.m
+        target = _ModuleTarget(file)
+    else:
+        file = opts.pyfile
+        target = _ScriptTarget(file)
 
     target.check()
 
-    sys.argv[:] = args      # Hide "pdb.py" and pdb options from argument list
+    sys.argv[:] = [file] + opts.args  # Hide "pdb.py" and pdb options from argument list
 
     # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
     # modified by the script being debugged. It's a bad idea when it was
     # changed by the user from the command line. There is a "restart" command
     # which allows explicit specification of command line arguments.
     pdb = Pdb()
-    pdb.rcLines.extend(commands)
+    pdb.rcLines.extend(opts.command)
     while True:
         try:
             pdb._run(target)
diff --git a/Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst b/Misc/NEWS.d/next/Library/2023-09-08-22-26-26.gh-issue-109164.-9BFWR.rst
new file mode 100644 (file)
index 0000000..b439c14
--- /dev/null
@@ -0,0 +1 @@
+:mod:`pdb`: Replace :mod:`getopt` with :mod:`argparse` for parsing command line arguments.