Issue #18973: Command-line interface of the calendar module now uses argparse
instead of optparse.
diff --git a/Lib/calendar.py b/Lib/calendar.py
index 02050ea..4ff154c 100644
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -605,51 +605,63 @@
 
 
 def main(args):
-    import optparse
-    parser = optparse.OptionParser(usage="usage: %prog [options] [year [month]]")
-    parser.add_option(
+    import argparse
+    parser = argparse.ArgumentParser()
+    textgroup = parser.add_argument_group('text only arguments')
+    htmlgroup = parser.add_argument_group('html only arguments')
+    textgroup.add_argument(
         "-w", "--width",
-        dest="width", type="int", default=2,
-        help="width of date column (default 2, text only)"
+        type=int, default=2,
+        help="width of date column (default 2)"
     )
-    parser.add_option(
+    textgroup.add_argument(
         "-l", "--lines",
-        dest="lines", type="int", default=1,
-        help="number of lines for each week (default 1, text only)"
+        type=int, default=1,
+        help="number of lines for each week (default 1)"
     )
-    parser.add_option(
+    textgroup.add_argument(
         "-s", "--spacing",
-        dest="spacing", type="int", default=6,
-        help="spacing between months (default 6, text only)"
+        type=int, default=6,
+        help="spacing between months (default 6)"
     )
-    parser.add_option(
+    textgroup.add_argument(
         "-m", "--months",
-        dest="months", type="int", default=3,
-        help="months per row (default 3, text only)"
+        type=int, default=3,
+        help="months per row (default 3)"
     )
-    parser.add_option(
+    htmlgroup.add_argument(
         "-c", "--css",
-        dest="css", default="calendar.css",
-        help="CSS to use for page (html only)"
+        default="calendar.css",
+        help="CSS to use for page"
     )
-    parser.add_option(
+    parser.add_argument(
         "-L", "--locale",
-        dest="locale", default=None,
+        default=None,
         help="locale to be used from month and weekday names"
     )
-    parser.add_option(
+    parser.add_argument(
         "-e", "--encoding",
-        dest="encoding", default=None,
-        help="Encoding to use for output."
+        default=None,
+        help="encoding to use for output"
     )
-    parser.add_option(
+    parser.add_argument(
         "-t", "--type",
-        dest="type", default="text",
+        default="text",
         choices=("text", "html"),
         help="output type (text or html)"
     )
+    parser.add_argument(
+        "year",
+        nargs='?', type=int,
+        help="year number (1-9999)"
+    )
+    parser.add_argument(
+        "month",
+        nargs='?', type=int,
+        help="month number (1-12, text only)"
+    )
 
-    (options, args) = parser.parse_args(args)
+    options = parser.parse_args(args[1:])
 
     if options.locale and not options.encoding:
         parser.error("if --locale is specified --encoding is required")
@@ -667,10 +679,10 @@
             encoding = sys.getdefaultencoding()
         optdict = dict(encoding=encoding, css=options.css)
         write = sys.stdout.buffer.write
-        if len(args) == 1:
+        if options.year is None:
             write(cal.formatyearpage(datetime.date.today().year, **optdict))
-        elif len(args) == 2:
-            write(cal.formatyearpage(int(args[1]), **optdict))
+        elif options.month is None:
+            write(cal.formatyearpage(options.year, **optdict))
         else:
             parser.error("incorrect number of arguments")
             sys.exit(1)
@@ -680,18 +692,15 @@
         else:
             cal = TextCalendar()
         optdict = dict(w=options.width, l=options.lines)
-        if len(args) != 3:
+        if options.month is None:
             optdict["c"] = options.spacing
             optdict["m"] = options.months
-        if len(args) == 1:
+        if options.year is None:
             result = cal.formatyear(datetime.date.today().year, **optdict)
-        elif len(args) == 2:
-            result = cal.formatyear(int(args[1]), **optdict)
-        elif len(args) == 3:
-            result = cal.formatmonth(int(args[1]), int(args[2]), **optdict)
+        elif options.month is None:
+            result = cal.formatyear(options.year, **optdict)
         else:
-            parser.error("incorrect number of arguments")
-            sys.exit(1)
+            result = cal.formatmonth(options.year, options.month, **optdict)
         write = sys.stdout.write
         if options.encoding:
             result = result.encode(options.encoding)