<div dir="ltr">for a live demo of how getopt is useful and flexible, I like how Audacity uses it:<div><a href="http://www.google.com/codesearch/p?hl=en&amp;sa=N&amp;cd=6&amp;ct=rc#_hWFOhGz9lE/mezzo/scons/sconsign.py&amp;q=getopt%20%22import%20getopt%22%20file:%5C.py$&amp;l=264">http://www.google.com/codesearch/p?hl=en&amp;sa=N&amp;cd=6&amp;ct=rc#_hWFOhGz9lE/mezzo/scons/sconsign.py&amp;q=getopt%20%22import%20getopt%22%20file:%5C.py$&amp;l=264</a></div>
<div><br></div><div>To answer your question, it goes like this:</div><div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">    options, args = getopt.getopt(sys.argv[1:], &quot;a:b&quot;, [&quot;alpha=&quot;, &quot;beta&quot;])<br>
    for o, a in options:</span></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; ">        if o in (&#39;-a&#39;, &#39;--alpha&#39;):</span></font></div>
<div><span class="Apple-style-span" style="font-family: arial, sans-serif; border-collapse: collapse; ">            alpha = a</span></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; ">        elif o in (&#39;-b&#39;, &#39;--beta&#39;):</span></font></div>
<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse; ">            beta = a</span></font></div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; border-collapse: collapse; ">    main(alpha, beta, args)</span></div>
</div><div><br></div><div>Notice a few things:</div><div>1. There is no chance of the script killing itself. In argparse and optparse exit() is called on every parsing error (btw because of this it sucks to debug parse_args in an interpreter).</div>
<div>2. There is no chance the parser will print things I don&#39;t want it to print.</div><div>3. You can do whatever you want using this flow - <span class="Apple-style-span" style="font-family: arial, sans-serif; border-collapse: collapse; ">call a function, a binary operator (ie | is used in audacity scons example above)</span></div>
<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">4. in argparse this flow can be emulated and would be nicer, in (&#39;-a&#39;, &#39;--alpha&#39;) becomes == &#39;alpha&#39;</span></font></div>
<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="border-collapse: separate;"><br></span></span></font></div>
<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="border-collapse: separate; font-family: arial; "><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">In a perfect world, getopt would be the low level parser that argparse and optparse rely on. This is not too far fetched btw, all that needs to be done is add another optional argument to getopt that would allow &#39;-&#39; and &#39;--&#39; to be replaced with arbitrary signs, OR moving the parsing code from argparse into getopt.</span></font></div>
</span></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></font></div><div><div class="gmail_quote">On Mon, Sep 28, 2009 at 10:57 PM, Steven Bethard <span dir="ltr">&lt;<a href="mailto:steven.bethard@gmail.com">steven.bethard@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div></div><div class="h5">On Mon, Sep 28, 2009 at 12:22 PM, Brett Cannon &lt;<a href="mailto:brett@python.org">brett@python.org</a>&gt; wrote:<br>

&gt; On Mon, Sep 28, 2009 at 08:49, Steven Bethard &lt;<a href="mailto:steven.bethard@gmail.com">steven.bethard@gmail.com</a>&gt; wrote:<br>
&gt;&gt; On Mon, Sep 28, 2009 at 8:27 AM, Steven D&#39;Aprano &lt;<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>&gt; wrote:<br>
&gt;&gt;&gt; On Tue, 29 Sep 2009 12:28:39 am Steven Bethard wrote:<br>
&gt;&gt;&gt;&gt; * Would you like argparse to grow an add_getopt_arguments method (as<br>
&gt;&gt;&gt;&gt; in my other post)?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; 0<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; * If argparse grew an add_getopt_arguments, would you still want to<br>
&gt;&gt;&gt;&gt; keep getopt around? And if so, why?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Simplicity of the learning curve. Using it is as simple as:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; getopt.getopt(sys.argv[1:], &quot;a:b&quot;, [&quot;alpha=&quot;, &quot;beta&quot;])<br>
&gt;&gt;<br>
&gt;&gt; You forgot the for-loop, nested if/else statements and type conversions. ;-)<br>
&gt;&gt;<br>
&gt;<br>
&gt; =) I do wonder if people who are advocating for getopt sticking around<br>
&gt; realize how much extra code must be written to make sure what it gives<br>
&gt; back to you is in some sane manner.<br>
&gt;<br>
&gt; Let&#39;s take ``getopt.getopt(sys.argv[1:], &quot;a:b&quot;, [&quot;alpha=&quot;, &quot;beta&quot;])``<br>
&gt; as an example and simply assume that &#39;alpha&#39; takes a string as an<br>
&gt; argument and that it&#39;s required and that &#39;beta&#39; is a boolean flag. To<br>
&gt; pull everything out you could do::<br>
&gt;<br>
&gt;  options, args = getopt.getopt(sys.argv[1:], &quot;a:b&quot;, [&quot;alpha=&quot;, &quot;beta&quot;])<br>
&gt;  options_dict = dict(options)<br>
&gt;  alpha = options_dict.get(&#39;-a&#39;, options_dict.get(&#39;--alpha&#39;, &#39;&#39;))<br>
&gt;  beta = &#39;-b&#39; in options_dict or &#39;--beta&#39; in options_dict<br>
&gt;<br>
&gt;  main(alpha, beta, args)<br>
&gt;<br>
&gt; Obviously if one of the getopt supporters has a better way of doing<br>
&gt; this then please speak up.<br>
&gt;<br>
&gt; Now, Steven, can you show how best to do this in argparse?<br>
<br>
</div></div>Here&#39;s the same option parsing in argparse:<br>
<br>
    parser = argparse.ArgumentParser()<br>
    parser.add_argument(&#39;-a&#39;, &#39;--alpha&#39;)<br>
    parser.add_argument(&#39;-b&#39;, &#39;--beta&#39;, action=&#39;store_true&#39;)<br>
    args = parser.parse_args()<br>
<br>
    main(args.alpha, args.beta)<br>
<br>
Or if those final positional arguments were actually meaningful, then<br>
you would add one more argument like this::<br>
<br>
    parser = argparse.ArgumentParser()<br>
    parser.add_argument(&#39;-a&#39;, &#39;--alpha&#39;)<br>
    parser.add_argument(&#39;-b&#39;, &#39;--beta&#39;, action=&#39;store_true&#39;)<br>
    parser.add_argument(&#39;gammas&#39;, nargs=&#39;*&#39;)<br>
    args = parser.parse_args()<br>
<br>
    main(args.alpha, args.beta, args.gammas)<br>
<div class="im"><br>
Steve<br>
--<br>
Where did you get that preposterous hypothesis?<br>
Did Steve tell you that?<br>
        --- The Hiphopopotamus<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org">Python-Dev@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-dev" target="_blank">http://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="http://mail.python.org/mailman/options/python-dev/ubershmekel%40gmail.com" target="_blank">http://mail.python.org/mailman/options/python-dev/ubershmekel%40gmail.com</a><br>
</div></div></blockquote></div><br></div></div>