summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichele Simionato <michele.simionato@gmail.com>2010-06-03 07:27:45 +0200
committerMichele Simionato <michele.simionato@gmail.com>2010-06-03 07:27:45 +0200
commit21d2edb8c66a1bcb26fa4a6d6c360c443ae841ab (patch)
tree11d764b6a542e51dfe4f1e8878e6d140ca2f7644
parent49984ccba3f51c74ed68602e7b905aa6279ba06c (diff)
downloadmicheles-21d2edb8c66a1bcb26fa4a6d6c360c443ae841ab.tar.gz
Added note about opterator and CLIArgs
-rw-r--r--plac/doc/plac.html36
-rw-r--r--plac/doc/plac.pdf2489
-rw-r--r--plac/doc/plac.txt24
3 files changed, 1417 insertions, 1132 deletions
diff --git a/plac/doc/plac.html b/plac/doc/plac.html
index 006ee7c..e6bbcdf 100644
--- a/plac/doc/plac.html
+++ b/plac/doc/plac.html
@@ -4,7 +4,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
-<title>Parsing the Command Line the Easy Way: Introducing plac, the Easiest Argument Parser in the Python World</title>
+<title>Plac: Parsing the Command Line the Easy Way</title>
<meta name="author" content="Michele Simionato" />
<style type="text/css">
@@ -412,8 +412,8 @@ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
</style>
</head>
<body>
-<div class="document" id="parsing-the-command-line-the-easy-way-introducing-plac-the-easiest-argument-parser-in-the-python-world">
-<h1 class="title">Parsing the Command Line the Easy Way: Introducing plac, the Easiest Argument Parser in the Python World</h1>
+<div class="document" id="plac-parsing-the-command-line-the-easy-way">
+<h1 class="title">Plac: Parsing the Command Line the Easy Way</h1>
<table class="docinfo" frame="void" rules="none">
<col class="docinfo-name" />
<col class="docinfo-content" />
@@ -444,12 +444,13 @@ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
<li><a class="reference internal" href="#scripts-with-flags" id="id5">Scripts with flags</a></li>
<li><a class="reference internal" href="#plac-for-python-2-x-users" id="id6">plac for Python 2.X users</a></li>
<li><a class="reference internal" href="#more-features" id="id7">More features</a></li>
-<li><a class="reference internal" href="#a-more-realistic-example" id="id8">A more realistic example</a></li>
+<li><a class="reference internal" href="#a-realistic-example" id="id8">A realistic example</a></li>
<li><a class="reference internal" href="#advanced-usage" id="id9">Advanced usage</a></li>
<li><a class="reference internal" href="#custom-annotation-objects" id="id10">Custom annotation objects</a></li>
<li><a class="reference internal" href="#plac-vs-argparse" id="id11">plac vs argparse</a></li>
-<li><a class="reference internal" href="#the-future" id="id12">The future</a></li>
-<li><a class="reference internal" href="#trivia-the-story-behind-the-name" id="id13">Trivia: the story behind the name</a></li>
+<li><a class="reference internal" href="#plac-vs-the-rest-of-the-world" id="id12">plac vs the rest of the world</a></li>
+<li><a class="reference internal" href="#the-future" id="id13">The future</a></li>
+<li><a class="reference internal" href="#trivia-the-story-behind-the-name" id="id14">Trivia: the story behind the name</a></li>
</ul>
</div>
<div class="section" id="the-importance-of-scaling-down">
@@ -925,8 +926,8 @@ usage: example10.py [-h] {add,mul} [n [n ...]]
example10.py: error: argument operator: invalid choice: 'ad' (choose from 'add', 'mul')
</pre>
</div>
-<div class="section" id="a-more-realistic-example">
-<h1><a class="toc-backref" href="#id8">A more realistic example</a></h1>
+<div class="section" id="a-realistic-example">
+<h1><a class="toc-backref" href="#id8">A realistic example</a></h1>
<p>Here is a more realistic script using most of the features of <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a> to
run SQL queries on a database by relying on <a class="reference external" href="http://www.sqlalchemy.org/">SQLAlchemy</a>. Notice the usage
of the <tt class="docutils literal">type</tt> feature to automagically convert a SQLAlchemy connection
@@ -1139,8 +1140,23 @@ is then available to you: you can use <tt class="docutils literal">add_argument<
etc. In other words, while some features are not supported directly,
<em>all</em> features are supported indirectly.</p>
</div>
+<div class="section" id="plac-vs-the-rest-of-the-world">
+<h1><a class="toc-backref" href="#id12">plac vs the rest of the world</a></h1>
+<p>Originally <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a> boasted about being &quot;the easiest command-line
+arguments parser in the world&quot;. Since then, people started pointing
+out to me various projects which are based on the same idea
+(extracting the parser from the main function signature) and are
+arguably even easier than <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a>:</p>
+<ul class="simple">
+<li><a class="reference external" href="http://pypi.python.org/pypi/opterator">opterator</a> by Dusty Phillips</li>
+<li><a class="reference external" href="http://pypi.python.org/pypi/CLIArgs">CLIArgs</a> by Pavel Panchekha</li>
+</ul>
+<p>Luckily for me none of such projects had the idea of using
+function annotations and <a class="reference external" href="http://argparse.googlecode.com">argparse</a>; as a consequence, they are
+no match for the capabilities of <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a>.</p>
+</div>
<div class="section" id="the-future">
-<h1><a class="toc-backref" href="#id12">The future</a></h1>
+<h1><a class="toc-backref" href="#id13">The future</a></h1>
<p>Currently plac is below 100 lines of code, not counting blanks, comments
and docstrings. I do not plan to extend it much in the future. The idea is
to keep the module short: it is and it should remain a little wrapper over
@@ -1151,7 +1167,7 @@ I wrote it in three days, including the tests, the documentation and the
time to learn <a class="reference external" href="http://argparse.googlecode.com">argparse</a>.</p>
</div>
<div class="section" id="trivia-the-story-behind-the-name">
-<h1><a class="toc-backref" href="#id13">Trivia: the story behind the name</a></h1>
+<h1><a class="toc-backref" href="#id14">Trivia: the story behind the name</a></h1>
<p>The <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a> project started very humble: I just wanted to make
easy_installable my old <a class="reference external" href="http://code.activestate.com/recipes/278844-parsing-the-command-line/">optionparse</a> recipe, and to publish it on PyPI.
The original name of <a class="reference external" href="http://pypi.python.org/pypi/plac">plac</a> was optionparser and the idea behind it was
diff --git a/plac/doc/plac.pdf b/plac/doc/plac.pdf
index f597b5a..90075ba 100644
--- a/plac/doc/plac.pdf
+++ b/plac/doc/plac.pdf
@@ -7,7 +7,7 @@
/F2 3 0 R
/F3 4 0 R
/F4 8 0 R
- /F5 50 0 R >>
+ /F5 52 0 R >>
endobj
% 'F1': class PDFType1Font
2 0 obj
@@ -45,9 +45,9 @@ endobj
0
0 ]
/Rect [ 153.7323
- 659.5936
+ 707.5936
526.5827
- 671.5936 ]
+ 719.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -60,9 +60,9 @@ endobj
0
0 ]
/Rect [ 153.7323
- 629.5936
+ 677.5936
526.5827
- 641.5936 ]
+ 689.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -75,9 +75,9 @@ endobj
0
0 ]
/Rect [ 153.7323
- 602.5936
+ 650.5936
526.5827
- 614.5936 ]
+ 662.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -96,15 +96,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 42 0 R
+ /Dest [ 48 0 R
/XYZ
62.69291
- 281.0236
+ 311.0236
0 ]
/Rect [ 62.69291
- 515.5936
+ 563.5936
215.5029
- 527.5936 ]
+ 575.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -114,15 +114,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 42 0 R
+ /Dest [ 48 0 R
/XYZ
62.69291
- 281.0236
+ 311.0236
0 ]
/Rect [ 527.0227
- 515.5936
+ 563.5936
532.5827
- 527.5936 ]
+ 575.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -132,15 +132,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 54 0 R
+ /Dest [ 56 0 R
/XYZ
62.69291
- 579.0236
+ 615.0236
0 ]
/Rect [ 62.69291
- 497.5936
+ 545.5936
216.0629
- 509.5936 ]
+ 557.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -150,15 +150,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 54 0 R
+ /Dest [ 56 0 R
/XYZ
62.69291
- 579.0236
+ 615.0236
0 ]
/Rect [ 527.0227
- 497.5936
+ 545.5936
532.5827
- 509.5936 ]
+ 557.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -168,15 +168,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 60 0 R
+ /Dest [ 62 0 R
/XYZ
62.69291
- 295.4236
+ 331.4236
0 ]
/Rect [ 62.69291
- 479.5936
+ 527.5936
208.8329
- 491.5936 ]
+ 539.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -186,15 +186,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 60 0 R
+ /Dest [ 62 0 R
/XYZ
62.69291
- 295.4236
+ 331.4236
0 ]
/Rect [ 527.0227
- 479.5936
+ 527.5936
532.5827
- 491.5936 ]
+ 539.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -204,15 +204,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 72 0 R
+ /Dest [ 74 0 R
/XYZ
62.69291
- 671.8236
+ 717.0236
0 ]
/Rect [ 62.69291
- 461.5936
+ 509.5936
158.2629
- 473.5936 ]
+ 521.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -222,15 +222,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 72 0 R
+ /Dest [ 74 0 R
/XYZ
62.69291
- 671.8236
+ 717.0236
0 ]
/Rect [ 527.0227
- 461.5936
+ 509.5936
532.5827
- 473.5936 ]
+ 521.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -240,15 +240,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 76 0 R
+ /Dest [ 78 0 R
/XYZ
62.69291
- 162.6236
+ 207.8236
0 ]
/Rect [ 62.69291
- 443.5936
+ 491.5936
145.4929
- 455.5936 ]
+ 503.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -258,15 +258,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 76 0 R
+ /Dest [ 78 0 R
/XYZ
62.69291
- 162.6236
+ 207.8236
0 ]
/Rect [ 527.0227
- 443.5936
+ 491.5936
532.5827
- 455.5936 ]
+ 503.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -276,15 +276,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 78 0 R
+ /Dest [ 80 0 R
/XYZ
62.69291
- 351.7299
+ 383.4236
0 ]
/Rect [ 62.69291
- 425.5936
+ 473.5936
182.7329
- 437.5936 ]
+ 485.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -294,15 +294,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 78 0 R
+ /Dest [ 80 0 R
/XYZ
62.69291
- 351.7299
+ 383.4236
0 ]
/Rect [ 527.0227
- 425.5936
+ 473.5936
532.5827
- 437.5936 ]
+ 485.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -312,15 +312,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 85 0 R
+ /Dest [ 87 0 R
/XYZ
62.69291
- 603.8236
+ 647.8236
0 ]
/Rect [ 62.69291
- 407.5936
+ 455.5936
128.2629
- 419.5936 ]
+ 467.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -330,15 +330,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 85 0 R
+ /Dest [ 87 0 R
/XYZ
62.69291
- 603.8236
+ 647.8236
0 ]
/Rect [ 527.0227
- 407.5936
+ 455.5936
532.5827
- 419.5936 ]
+ 467.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -348,15 +348,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 89 0 R
+ /Dest [ 91 0 R
/XYZ
62.69291
- 494.4849
+ 542.4849
0 ]
/Rect [ 62.69291
- 389.5936
- 180.5229
- 401.5936 ]
+ 437.5936
+ 153.2929
+ 449.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -366,15 +366,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 89 0 R
+ /Dest [ 91 0 R
/XYZ
62.69291
- 494.4849
+ 542.4849
0 ]
/Rect [ 527.0227
- 389.5936
+ 437.5936
532.5827
- 401.5936 ]
+ 449.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -384,15 +384,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 100 0 R
+ /Dest [ 102 0 R
/XYZ
62.69291
- 551.8236
+ 571.8236
0 ]
/Rect [ 62.69291
- 371.5936
+ 419.5936
142.1629
- 383.5936 ]
+ 431.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -402,15 +402,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 100 0 R
+ /Dest [ 102 0 R
/XYZ
62.69291
- 551.8236
+ 571.8236
0 ]
/Rect [ 521.4627
- 371.5936
+ 419.5936
532.5827
- 383.5936 ]
+ 431.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -420,15 +420,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 102 0 R
+ /Dest [ 104 0 R
/XYZ
62.69291
623.8236
0 ]
/Rect [ 62.69291
- 353.5936
+ 401.5936
191.5929
- 365.5936 ]
+ 413.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -438,15 +438,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 102 0 R
+ /Dest [ 104 0 R
/XYZ
62.69291
623.8236
0 ]
/Rect [ 521.4627
- 353.5936
+ 401.5936
532.5827
- 365.5936 ]
+ 413.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -456,15 +456,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 126 0 R
+ /Dest [ 131 0 R
/XYZ
62.69291
671.8236
0 ]
/Rect [ 62.69291
- 335.5936
+ 383.5936
141.6229
- 347.5936 ]
+ 395.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -474,15 +474,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 126 0 R
+ /Dest [ 131 0 R
/XYZ
62.69291
671.8236
0 ]
/Rect [ 521.4627
- 335.5936
+ 383.5936
532.5827
- 347.5936 ]
+ 395.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -492,15 +492,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 141 0 R
+ /Dest [ 131 0 R
/XYZ
62.69291
- 765.0236
+ 182.8236
0 ]
/Rect [ 62.69291
- 317.5936
- 111.5829
- 329.5936 ]
+ 365.5936
+ 194.9529
+ 377.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -510,15 +510,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 141 0 R
+ /Dest [ 131 0 R
/XYZ
62.69291
- 765.0236
+ 182.8236
0 ]
/Rect [ 521.4627
- 317.5936
+ 365.5936
532.5827
- 329.5936 ]
+ 377.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -528,15 +528,15 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 141 0 R
+ /Dest [ 149 0 R
/XYZ
62.69291
- 654.0236
+ 705.0236
0 ]
/Rect [ 62.69291
- 299.5936
- 219.9529
- 311.5936 ]
+ 347.5936
+ 111.5829
+ 359.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
@@ -546,20 +546,56 @@ endobj
0
0 ]
/Contents ()
- /Dest [ 141 0 R
+ /Dest [ 149 0 R
/XYZ
62.69291
- 654.0236
+ 705.0236
0 ]
/Rect [ 521.4627
- 299.5936
+ 347.5936
532.5827
- 311.5936 ]
+ 359.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER30': class PDFDictionary
+% 'Annot.NUMBER30': class LinkAnnotation
35 0 obj
+<< /Border [ 0
+ 0
+ 0 ]
+ /Contents ()
+ /Dest [ 149 0 R
+ /XYZ
+ 62.69291
+ 594.0236
+ 0 ]
+ /Rect [ 62.69291
+ 329.5936
+ 219.9529
+ 341.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER31': class LinkAnnotation
+36 0 obj
+<< /Border [ 0
+ 0
+ 0 ]
+ /Contents ()
+ /Dest [ 149 0 R
+ /XYZ
+ 62.69291
+ 594.0236
+ 0 ]
+ /Rect [ 521.4627
+ 329.5936
+ 532.5827
+ 341.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER32': class PDFDictionary
+37 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/getopt.html) >>
@@ -567,14 +603,14 @@ endobj
0
0 ]
/Rect [ 214.8914
- 233.5936
+ 263.5936
246.5585
- 245.5936 ]
+ 275.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER31': class PDFDictionary
-36 0 obj
+% 'Annot.NUMBER33': class PDFDictionary
+38 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html) >>
@@ -582,14 +618,14 @@ endobj
0
0 ]
/Rect [ 346.507
- 233.5936
+ 263.5936
389.2842
- 245.5936 ]
+ 275.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER32': class PDFDictionary
-37 0 obj
+% 'Annot.NUMBER34': class PDFDictionary
+39 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -597,14 +633,14 @@ endobj
0
0 ]
/Rect [ 493.1227
- 233.5936
+ 263.5936
531.4956
- 245.5936 ]
+ 275.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER33': class PDFDictionary
-38 0 obj
+% 'Annot.NUMBER35': class PDFDictionary
+40 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -612,14 +648,14 @@ endobj
0
0 ]
/Rect [ 346.384
- 221.5936
+ 251.5936
388.8477
- 233.5936 ]
+ 263.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER34': class PDFDictionary
-39 0 obj
+% 'Annot.NUMBER36': class PDFDictionary
+41 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://www.welton.it/articles/scalable_systems) >>
@@ -627,14 +663,14 @@ endobj
0
0 ]
/Rect [ 292.1608
- 179.5936
+ 209.5936
350.0128
- 191.5936 ]
+ 221.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER35': class PDFDictionary
-40 0 obj
+% 'Annot.NUMBER37': class PDFDictionary
+42 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -642,14 +678,14 @@ endobj
0
0 ]
/Rect [ 208.2364
- 131.5936
+ 161.5936
229.8923
- 143.5936 ]
+ 173.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER36': class PDFDictionary
-41 0 obj
+% 'Annot.NUMBER38': class PDFDictionary
+43 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -657,14 +693,74 @@ endobj
0
0 ]
/Rect [ 152.7329
- 107.5936
+ 137.5936
192.1929
+ 149.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER39': class PDFDictionary
+44 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 116.9711
+ 119.5936
+ 139.5794
+ 131.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER40': class PDFDictionary
+45 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://argparse.googlecode.com) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 277.9887
+ 119.5936
+ 321.7169
+ 131.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER41': class PDFDictionary
+46 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 504.0394
+ 107.5936
+ 525.3627
119.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
+% 'Annot.NUMBER42': class PDFDictionary
+47 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://argparse.googlecode.com) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 351.0408
+ 95.59362
+ 390.5008
+ 107.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
% 'Page1': class PDFPage
-42 0 obj
+48 0 obj
% Page dictionary
<< /Annots [ 5 0 R
6 0 R
@@ -701,13 +797,19 @@ endobj
38 0 R
39 0 R
40 0 R
- 41 0 R ]
- /Contents 159 0 R
+ 41 0 R
+ 42 0 R
+ 43 0 R
+ 44 0 R
+ 45 0 R
+ 46 0 R
+ 47 0 R ]
+ /Contents 168 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -718,68 +820,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER37': class PDFDictionary
-43 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 116.9711
- 756.5936
- 139.5794
- 768.5936 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER38': class PDFDictionary
-44 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://argparse.googlecode.com) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 277.9887
- 756.5936
- 321.7169
- 768.5936 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER39': class PDFDictionary
-45 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://pypi.python.org/pypi/plac) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 504.0394
- 744.5936
- 525.3627
- 756.5936 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER40': class PDFDictionary
-46 0 obj
-<< /A << /S /URI
- /Type /Action
- /URI (http://argparse.googlecode.com) >>
- /Border [ 0
- 0
- 0 ]
- /Rect [ 351.0408
- 732.5936
- 390.5008
- 744.5936 ]
- /Subtype /Link
- /Type /Annot >>
-endobj
-% 'Annot.NUMBER41': class PDFDictionary
-47 0 obj
+% 'Annot.NUMBER43': class PDFDictionary
+49 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -787,14 +829,14 @@ endobj
0
0 ]
/Rect [ 247.8817
- 708.5936
+ 744.5936
266.2217
- 720.5936 ]
+ 756.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER42': class PDFDictionary
-48 0 obj
+% 'Annot.NUMBER44': class PDFDictionary
+50 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -802,14 +844,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 678.5936
+ 714.5936
85.3538
- 690.5936 ]
+ 726.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER43': class PDFDictionary
-49 0 obj
+% 'Annot.NUMBER45': class PDFDictionary
+51 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -817,14 +859,14 @@ endobj
0
0 ]
/Rect [ 124.2211
- 606.5936
+ 642.5936
146.9252
- 618.5936 ]
+ 654.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'F5': class PDFType1Font
-50 0 obj
+52 0 obj
% Font Helvetica-Oblique
<< /BaseFont /Helvetica-Oblique
/Encoding /WinAnsiEncoding
@@ -832,8 +874,8 @@ endobj
/Subtype /Type1
/Type /Font >>
endobj
-% 'Annot.NUMBER44': class PDFDictionary
-51 0 obj
+% 'Annot.NUMBER46': class PDFDictionary
+53 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/getopt.html) >>
@@ -841,14 +883,14 @@ endobj
0
0 ]
/Rect [ 325.341
- 214.3936
+ 250.3936
356.6198
- 226.3936 ]
+ 262.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER45': class PDFDictionary
-52 0 obj
+% 'Annot.NUMBER47': class PDFDictionary
+54 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html) >>
@@ -856,14 +898,14 @@ endobj
0
0 ]
/Rect [ 376.7786
- 214.3936
+ 250.3936
419.1674
- 226.3936 ]
+ 262.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER46': class PDFDictionary
-53 0 obj
+% 'Annot.NUMBER48': class PDFDictionary
+55 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -871,31 +913,27 @@ endobj
0
0 ]
/Rect [ 365.694
- 202.3936
+ 238.3936
408.8281
- 214.3936 ]
+ 250.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page2': class PDFPage
-54 0 obj
+56 0 obj
% Page dictionary
-<< /Annots [ 43 0 R
- 44 0 R
- 45 0 R
- 46 0 R
- 47 0 R
- 48 0 R
- 49 0 R
+<< /Annots [ 49 0 R
+ 50 0 R
51 0 R
- 52 0 R
- 53 0 R ]
- /Contents 160 0 R
+ 53 0 R
+ 54 0 R
+ 55 0 R ]
+ /Contents 169 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -906,8 +944,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER47': class PDFDictionary
-55 0 obj
+% 'Annot.NUMBER49': class PDFDictionary
+57 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -915,14 +953,14 @@ endobj
0
0 ]
/Rect [ 83.82606
- 609.3936
+ 645.3936
106.0692
- 621.3936 ]
+ 657.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER48': class PDFDictionary
-56 0 obj
+% 'Annot.NUMBER50': class PDFDictionary
+58 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -930,14 +968,14 @@ endobj
0
0 ]
/Rect [ 243.8829
- 597.3936
+ 633.3936
265.0029
- 609.3936 ]
+ 645.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER49': class PDFDictionary
-57 0 obj
+% 'Annot.NUMBER51': class PDFDictionary
+59 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -945,14 +983,14 @@ endobj
0
0 ]
/Rect [ 83.6329
- 460.1936
+ 496.1936
105.6829
- 472.1936 ]
+ 508.1936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER50': class PDFDictionary
-58 0 obj
+% 'Annot.NUMBER52': class PDFDictionary
+60 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -960,14 +998,14 @@ endobj
0
0 ]
/Rect [ 421.9727
- 460.1936
+ 496.1936
465.1427
- 472.1936 ]
+ 508.1936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER51': class PDFDictionary
-59 0 obj
+% 'Annot.NUMBER53': class PDFDictionary
+61 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -975,26 +1013,26 @@ endobj
0
0 ]
/Rect [ 211.6529
- 310.9936
+ 346.9936
232.7729
- 322.9936 ]
+ 358.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page3': class PDFPage
-60 0 obj
+62 0 obj
% Page dictionary
-<< /Annots [ 55 0 R
- 56 0 R
- 57 0 R
+<< /Annots [ 57 0 R
58 0 R
- 59 0 R ]
- /Contents 161 0 R
+ 59 0 R
+ 60 0 R
+ 61 0 R ]
+ /Contents 170 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1005,8 +1043,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER52': class PDFDictionary
-61 0 obj
+% 'Annot.NUMBER54': class PDFDictionary
+63 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1014,14 +1052,14 @@ endobj
0
0 ]
/Rect [ 321.4303
- 651.3936
+ 687.3936
363.754
- 663.3936 ]
+ 699.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER53': class PDFDictionary
-62 0 obj
+% 'Annot.NUMBER55': class PDFDictionary
+64 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1029,14 +1067,14 @@ endobj
0
0 ]
/Rect [ 126.0429
- 639.3936
+ 675.3936
147.1629
- 651.3936 ]
+ 687.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER54': class PDFDictionary
-63 0 obj
+% 'Annot.NUMBER56': class PDFDictionary
+65 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1044,14 +1082,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 424.9936
+ 460.9936
84.20915
- 436.9936 ]
+ 472.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER55': class PDFDictionary
-64 0 obj
+% 'Annot.NUMBER57': class PDFDictionary
+66 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1059,25 +1097,25 @@ endobj
0
0 ]
/Rect [ 91.59679
- 203.7936
+ 239.7936
109.9368
- 215.7936 ]
+ 251.7936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page4': class PDFPage
-65 0 obj
+67 0 obj
% Page dictionary
-<< /Annots [ 61 0 R
- 62 0 R
- 63 0 R
- 64 0 R ]
- /Contents 162 0 R
+<< /Annots [ 63 0 R
+ 64 0 R
+ 65 0 R
+ 66 0 R ]
+ /Contents 171 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1088,8 +1126,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER56': class PDFDictionary
-66 0 obj
+% 'Annot.NUMBER58': class PDFDictionary
+68 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1097,14 +1135,14 @@ endobj
0
0 ]
/Rect [ 446.1627
- 699.3936
+ 744.5936
464.5027
- 711.3936 ]
+ 756.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER57': class PDFDictionary
-67 0 obj
+% 'Annot.NUMBER59': class PDFDictionary
+69 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://code.activestate.com/recipes/278844-parsing-the-command-line/) >>
@@ -1112,14 +1150,14 @@ endobj
0
0 ]
/Rect [ 357.8702
- 588.3936
+ 633.5936
416.0058
- 600.3936 ]
+ 645.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER58': class PDFDictionary
-68 0 obj
+% 'Annot.NUMBER60': class PDFDictionary
+70 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://code.activestate.com/recipes/278844-parsing-the-command-line/) >>
@@ -1127,14 +1165,14 @@ endobj
0
0 ]
/Rect [ 182.0729
- 576.3936
+ 621.5936
234.3229
- 588.3936 ]
+ 633.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER59': class PDFDictionary
-69 0 obj
+% 'Annot.NUMBER61': class PDFDictionary
+71 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1142,14 +1180,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 546.3936
+ 591.5936
84.28901
- 558.3936 ]
+ 603.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER60': class PDFDictionary
-70 0 obj
+% 'Annot.NUMBER62': class PDFDictionary
+72 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://code.activestate.com/recipes/278844-parsing-the-command-line/) >>
@@ -1157,14 +1195,14 @@ endobj
0
0 ]
/Rect [ 161.7834
- 546.3936
+ 591.5936
217.2895
- 558.3936 ]
+ 603.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER61': class PDFDictionary
-71 0 obj
+% 'Annot.NUMBER63': class PDFDictionary
+73 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1172,27 +1210,27 @@ endobj
0
0 ]
/Rect [ 514.2427
- 343.1936
+ 388.3936
532.2243
- 355.1936 ]
+ 400.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page5': class PDFPage
-72 0 obj
+74 0 obj
% Page dictionary
-<< /Annots [ 66 0 R
- 67 0 R
- 68 0 R
+<< /Annots [ 68 0 R
69 0 R
70 0 R
- 71 0 R ]
- /Contents 163 0 R
+ 71 0 R
+ 72 0 R
+ 73 0 R ]
+ /Contents 172 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1203,8 +1241,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER62': class PDFDictionary
-73 0 obj
+% 'Annot.NUMBER64': class PDFDictionary
+75 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1212,14 +1250,14 @@ endobj
0
0 ]
/Rect [ 183.9662
- 431.7936
+ 476.9936
205.2545
- 443.7936 ]
+ 488.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER63': class PDFDictionary
-74 0 obj
+% 'Annot.NUMBER65': class PDFDictionary
+76 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1227,14 +1265,14 @@ endobj
0
0 ]
/Rect [ 184.4029
- 235.3936
+ 280.5936
202.7429
- 247.3936 ]
+ 292.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER64': class PDFDictionary
-75 0 obj
+% 'Annot.NUMBER66': class PDFDictionary
+77 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1242,24 +1280,24 @@ endobj
0
0 ]
/Rect [ 62.69291
- 127.1936
+ 172.3936
84.57878
- 139.1936 ]
+ 184.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page6': class PDFPage
-76 0 obj
+78 0 obj
% Page dictionary
-<< /Annots [ 73 0 R
- 74 0 R
- 75 0 R ]
- /Contents 164 0 R
+<< /Annots [ 75 0 R
+ 76 0 R
+ 77 0 R ]
+ /Contents 173 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1270,8 +1308,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER65': class PDFDictionary
-77 0 obj
+% 'Annot.NUMBER67': class PDFDictionary
+79 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1279,22 +1317,22 @@ endobj
0
0 ]
/Rect [ 110.2829
- 292.2999
+ 323.9936
132.8629
- 304.2999 ]
+ 335.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page7': class PDFPage
-78 0 obj
+80 0 obj
% Page dictionary
-<< /Annots [ 77 0 R ]
- /Contents 165 0 R
+<< /Annots [ 79 0 R ]
+ /Contents 174 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1305,8 +1343,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER66': class PDFDictionary
-79 0 obj
+% 'Annot.NUMBER68': class PDFDictionary
+81 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1314,14 +1352,14 @@ endobj
0
0 ]
/Rect [ 358.6729
- 619.3936
+ 663.3936
379.7929
- 631.3936 ]
+ 675.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER67': class PDFDictionary
-80 0 obj
+% 'Annot.NUMBER69': class PDFDictionary
+82 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1329,14 +1367,14 @@ endobj
0
0 ]
/Rect [ 104.3155
- 556.3936
+ 600.3936
143.7755
- 568.3936 ]
+ 612.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER68': class PDFDictionary
-81 0 obj
+% 'Annot.NUMBER70': class PDFDictionary
+83 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1344,14 +1382,14 @@ endobj
0
0 ]
/Rect [ 414.3275
- 556.3936
+ 600.3936
453.7875
- 568.3936 ]
+ 612.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER69': class PDFDictionary
-82 0 obj
+% 'Annot.NUMBER71': class PDFDictionary
+84 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1359,14 +1397,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 544.3936
+ 588.3936
106.6498
- 556.3936 ]
+ 600.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER70': class PDFDictionary
-83 0 obj
+% 'Annot.NUMBER72': class PDFDictionary
+85 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1374,14 +1412,14 @@ endobj
0
0 ]
/Rect [ 189.6004
- 544.3936
+ 588.3936
207.9404
- 556.3936 ]
+ 600.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER71': class PDFDictionary
-84 0 obj
+% 'Annot.NUMBER73': class PDFDictionary
+86 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1389,27 +1427,27 @@ endobj
0
0 ]
/Rect [ 355.0429
- 352.3936
+ 396.3936
397.2829
- 364.3936 ]
+ 408.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page8': class PDFPage
-85 0 obj
+87 0 obj
% Page dictionary
-<< /Annots [ 79 0 R
- 80 0 R
- 81 0 R
+<< /Annots [ 81 0 R
82 0 R
83 0 R
- 84 0 R ]
- /Contents 166 0 R
+ 84 0 R
+ 85 0 R
+ 86 0 R ]
+ /Contents 175 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1420,8 +1458,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER72': class PDFDictionary
-86 0 obj
+% 'Annot.NUMBER74': class PDFDictionary
+88 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1429,14 +1467,14 @@ endobj
0
0 ]
/Rect [ 338.1568
- 459.0549
+ 507.0549
360.5113
- 471.0549 ]
+ 519.0549 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER73': class PDFDictionary
-87 0 obj
+% 'Annot.NUMBER75': class PDFDictionary
+89 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://www.sqlalchemy.org/) >>
@@ -1444,14 +1482,14 @@ endobj
0
0 ]
/Rect [ 110.6843
- 447.0549
+ 495.0549
169.0343
- 459.0549 ]
+ 507.0549 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER74': class PDFDictionary
-88 0 obj
+% 'Annot.NUMBER76': class PDFDictionary
+90 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://www.sqlalchemy.org/docs/reference/ext/sqlsoup.html) >>
@@ -1459,24 +1497,24 @@ endobj
0
0 ]
/Rect [ 168.3029
- 435.0549
+ 483.0549
208.8829
- 447.0549 ]
+ 495.0549 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page9': class PDFPage
-89 0 obj
+91 0 obj
% Page dictionary
-<< /Annots [ 86 0 R
- 87 0 R
- 88 0 R ]
- /Contents 167 0 R
+<< /Annots [ 88 0 R
+ 89 0 R
+ 90 0 R ]
+ /Contents 176 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1487,8 +1525,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER75': class PDFDictionary
-90 0 obj
+% 'Annot.NUMBER77': class PDFDictionary
+92 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1496,14 +1534,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 516.3936
+ 536.3936
83.9079
- 528.3936 ]
+ 548.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER76': class PDFDictionary
-91 0 obj
+% 'Annot.NUMBER78': class PDFDictionary
+93 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1511,14 +1549,14 @@ endobj
0
0 ]
/Rect [ 133.1029
- 516.3936
+ 536.3936
175.4379
- 528.3936 ]
+ 548.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER77': class PDFDictionary
-92 0 obj
+% 'Annot.NUMBER79': class PDFDictionary
+94 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1526,14 +1564,14 @@ endobj
0
0 ]
/Rect [ 454.1177
- 516.3936
+ 536.3936
496.4527
- 528.3936 ]
+ 548.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER78': class PDFDictionary
-93 0 obj
+% 'Annot.NUMBER80': class PDFDictionary
+95 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com/svn/tags/r11/doc/other-utilities.html?highlight=filetype#FileType) >>
@@ -1541,14 +1579,14 @@ endobj
0
0 ]
/Rect [ 455.2227
- 474.3936
+ 494.3936
534.3667
- 486.3936 ]
+ 506.3936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER79': class PDFDictionary
-94 0 obj
+% 'Annot.NUMBER81': class PDFDictionary
+96 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1556,14 +1594,14 @@ endobj
0
0 ]
/Rect [ 127.99
- 307.1936
+ 327.1936
149.3857
- 319.1936 ]
+ 339.1936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER80': class PDFDictionary
-95 0 obj
+% 'Annot.NUMBER82': class PDFDictionary
+97 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1571,14 +1609,14 @@ endobj
0
0 ]
/Rect [ 326.9971
- 193.9936
+ 213.9936
351.8113
- 205.9936 ]
+ 225.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER81': class PDFDictionary
-96 0 obj
+% 'Annot.NUMBER83': class PDFDictionary
+98 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1586,14 +1624,14 @@ endobj
0
0 ]
/Rect [ 409.706
- 181.9936
+ 201.9936
453.2944
- 193.9936 ]
+ 213.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER82': class PDFDictionary
-97 0 obj
+% 'Annot.NUMBER84': class PDFDictionary
+99 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1601,14 +1639,14 @@ endobj
0
0 ]
/Rect [ 259.0928
- 169.9936
+ 189.9936
302.7528
- 181.9936 ]
+ 201.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER83': class PDFDictionary
-98 0 obj
+% 'Annot.NUMBER85': class PDFDictionary
+100 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1616,14 +1654,14 @@ endobj
0
0 ]
/Rect [ 258.3129
- 145.9936
+ 165.9936
279.4329
- 157.9936 ]
+ 177.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER84': class PDFDictionary
-99 0 obj
+% 'Annot.NUMBER86': class PDFDictionary
+101 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com/svn/tags/r11/doc/ArgumentParser.html) >>
@@ -1631,31 +1669,31 @@ endobj
0
0 ]
/Rect [ 327.2261
- 127.9936
+ 147.9936
410.5152
- 139.9936 ]
+ 159.9936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page10': class PDFPage
-100 0 obj
+102 0 obj
% Page dictionary
-<< /Annots [ 90 0 R
- 91 0 R
- 92 0 R
+<< /Annots [ 92 0 R
93 0 R
94 0 R
95 0 R
96 0 R
97 0 R
98 0 R
- 99 0 R ]
- /Contents 168 0 R
+ 99 0 R
+ 100 0 R
+ 101 0 R ]
+ /Contents 177 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1666,8 +1704,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER85': class PDFDictionary
-101 0 obj
+% 'Annot.NUMBER87': class PDFDictionary
+103 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1682,15 +1720,15 @@ endobj
/Type /Annot >>
endobj
% 'Page11': class PDFPage
-102 0 obj
+104 0 obj
% Page dictionary
-<< /Annots [ 101 0 R ]
- /Contents 169 0 R
+<< /Annots [ 103 0 R ]
+ /Contents 178 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -1701,8 +1739,8 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER86': class PDFDictionary
-103 0 obj
+% 'Annot.NUMBER88': class PDFDictionary
+105 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1716,8 +1754,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER87': class PDFDictionary
-104 0 obj
+% 'Annot.NUMBER89': class PDFDictionary
+106 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1731,8 +1769,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER88': class PDFDictionary
-105 0 obj
+% 'Annot.NUMBER90': class PDFDictionary
+107 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1746,8 +1784,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER89': class PDFDictionary
-106 0 obj
+% 'Annot.NUMBER91': class PDFDictionary
+108 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1761,8 +1799,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER90': class PDFDictionary
-107 0 obj
+% 'Annot.NUMBER92': class PDFDictionary
+109 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html) >>
@@ -1776,8 +1814,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER91': class PDFDictionary
-108 0 obj
+% 'Annot.NUMBER93': class PDFDictionary
+110 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1791,8 +1829,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER92': class PDFDictionary
-109 0 obj
+% 'Annot.NUMBER94': class PDFDictionary
+111 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html) >>
@@ -1806,8 +1844,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER93': class PDFDictionary
-110 0 obj
+% 'Annot.NUMBER95': class PDFDictionary
+112 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1821,8 +1859,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER94': class PDFDictionary
-111 0 obj
+% 'Annot.NUMBER96': class PDFDictionary
+113 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1836,8 +1874,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER95': class PDFDictionary
-112 0 obj
+% 'Annot.NUMBER97': class PDFDictionary
+114 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1851,8 +1889,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER96': class PDFDictionary
-113 0 obj
+% 'Annot.NUMBER98': class PDFDictionary
+115 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1866,8 +1904,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER97': class PDFDictionary
-114 0 obj
+% 'Annot.NUMBER99': class PDFDictionary
+116 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -1881,8 +1919,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER98': class PDFDictionary
-115 0 obj
+% 'Annot.NUMBER100': class PDFDictionary
+117 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1896,8 +1934,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER99': class PDFDictionary
-116 0 obj
+% 'Annot.NUMBER101': class PDFDictionary
+118 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1911,8 +1949,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER100': class PDFDictionary
-117 0 obj
+% 'Annot.NUMBER102': class PDFDictionary
+119 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1926,8 +1964,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER101': class PDFDictionary
-118 0 obj
+% 'Annot.NUMBER103': class PDFDictionary
+120 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1941,8 +1979,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER102': class PDFDictionary
-119 0 obj
+% 'Annot.NUMBER104': class PDFDictionary
+121 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1956,8 +1994,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER103': class PDFDictionary
-120 0 obj
+% 'Annot.NUMBER105': class PDFDictionary
+122 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1971,8 +2009,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER104': class PDFDictionary
-121 0 obj
+% 'Annot.NUMBER106': class PDFDictionary
+123 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -1986,8 +2024,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER105': class PDFDictionary
-122 0 obj
+% 'Annot.NUMBER107': class PDFDictionary
+124 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2001,8 +2039,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER106': class PDFDictionary
-123 0 obj
+% 'Annot.NUMBER108': class PDFDictionary
+125 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -2016,8 +2054,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER107': class PDFDictionary
-124 0 obj
+% 'Annot.NUMBER109': class PDFDictionary
+126 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com/svn/tags/r11/doc/ArgumentParser.html) >>
@@ -2031,8 +2069,8 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER108': class PDFDictionary
-125 0 obj
+% 'Annot.NUMBER110': class PDFDictionary
+127 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2046,12 +2084,55 @@ endobj
/Subtype /Link
/Type /Annot >>
endobj
+% 'Annot.NUMBER111': class PDFDictionary
+128 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 109.0098
+ 147.3936
+ 131.9967
+ 159.3936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER112': class PDFDictionary
+129 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 397.2929
+ 123.3936
+ 415.6329
+ 135.3936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER113': class PDFDictionary
+130 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/opterator) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 85.69291
+ 102.3936
+ 128.4929
+ 114.3936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
% 'Page12': class PDFPage
-126 0 obj
+131 0 obj
% Page dictionary
-<< /Annots [ 103 0 R
- 104 0 R
- 105 0 R
+<< /Annots [ 105 0 R
106 0 R
107 0 R
108 0 R
@@ -2071,13 +2152,18 @@ endobj
122 0 R
123 0 R
124 0 R
- 125 0 R ]
- /Contents 170 0 R
+ 125 0 R
+ 126 0 R
+ 127 0 R
+ 128 0 R
+ 129 0 R
+ 130 0 R ]
+ /Contents 179 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2088,8 +2174,53 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'Annot.NUMBER109': class PDFDictionary
-127 0 obj
+% 'Annot.NUMBER114': class PDFDictionary
+132 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/CLIArgs) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 85.69291
+ 753.5936
+ 124.5929
+ 765.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER115': class PDFDictionary
+133 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://argparse.googlecode.com) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 464.3898
+ 732.5936
+ 503.8498
+ 744.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER116': class PDFDictionary
+134 0 obj
+<< /A << /S /URI
+ /Type /Action
+ /URI (http://pypi.python.org/pypi/plac) >>
+ /Border [ 0
+ 0
+ 0 ]
+ /Rect [ 305.0429
+ 720.5936
+ 323.3829
+ 732.5936 ]
+ /Subtype /Link
+ /Type /Annot >>
+endobj
+% 'Annot.NUMBER117': class PDFDictionary
+135 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2097,14 +2228,14 @@ endobj
0
0 ]
/Rect [ 86.82623
- 705.5936
+ 645.5936
126.2862
- 717.5936 ]
+ 657.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER110': class PDFDictionary
-128 0 obj
+% 'Annot.NUMBER118': class PDFDictionary
+136 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2112,14 +2243,14 @@ endobj
0
0 ]
/Rect [ 415.1627
- 705.5936
+ 645.5936
459.306
- 717.5936 ]
+ 657.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER111': class PDFDictionary
-129 0 obj
+% 'Annot.NUMBER119': class PDFDictionary
+137 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -2127,14 +2258,14 @@ endobj
0
0 ]
/Rect [ 468.9894
- 705.5936
+ 645.5936
492.0127
- 717.5936 ]
+ 657.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER112': class PDFDictionary
-130 0 obj
+% 'Annot.NUMBER120': class PDFDictionary
+138 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2142,14 +2273,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 669.5936
+ 609.5936
102.1529
- 681.5936 ]
+ 621.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER113': class PDFDictionary
-131 0 obj
+% 'Annot.NUMBER121': class PDFDictionary
+139 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -2157,14 +2288,14 @@ endobj
0
0 ]
/Rect [ 83.64556
- 618.5936
+ 558.5936
105.7082
- 630.5936 ]
+ 570.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER114': class PDFDictionary
-132 0 obj
+% 'Annot.NUMBER122': class PDFDictionary
+140 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://code.activestate.com/recipes/278844-parsing-the-command-line/) >>
@@ -2172,14 +2303,14 @@ endobj
0
0 ]
/Rect [ 446.6
- 618.5936
+ 558.5936
502.5727
- 630.5936 ]
+ 570.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER115': class PDFDictionary
-133 0 obj
+% 'Annot.NUMBER123': class PDFDictionary
+141 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/plac) >>
@@ -2187,14 +2318,14 @@ endobj
0
0 ]
/Rect [ 275.6828
- 606.5936
+ 546.5936
297.3688
- 618.5936 ]
+ 558.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER116': class PDFDictionary
-134 0 obj
+% 'Annot.NUMBER124': class PDFDictionary
+142 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://docs.python.org/library/optparse.html?highlight=optionparser#optparse.OptionParser) >>
@@ -2202,14 +2333,14 @@ endobj
0
0 ]
/Rect [ 77.19665
- 594.5936
+ 534.5936
139.4904
- 606.5936 ]
+ 546.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER117': class PDFDictionary
-135 0 obj
+% 'Annot.NUMBER125': class PDFDictionary
+143 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2217,14 +2348,14 @@ endobj
0
0 ]
/Rect [ 96.54131
- 582.5936
+ 522.5936
139.0255
- 594.5936 ]
+ 534.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER118': class PDFDictionary
-136 0 obj
+% 'Annot.NUMBER126': class PDFDictionary
+144 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2232,14 +2363,14 @@ endobj
0
0 ]
/Rect [ 203.5016
- 549.5936
+ 489.5936
245.8453
- 561.5936 ]
+ 501.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER119': class PDFDictionary
-137 0 obj
+% 'Annot.NUMBER127': class PDFDictionary
+145 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com/svn/tags/r11/doc/ArgumentParser.html) >>
@@ -2247,14 +2378,14 @@ endobj
0
0 ]
/Rect [ 62.69291
- 474.5936
+ 414.5936
138.7898
- 486.5936 ]
+ 426.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER120': class PDFDictionary
-138 0 obj
+% 'Annot.NUMBER128': class PDFDictionary
+146 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2262,14 +2393,14 @@ endobj
0
0 ]
/Rect [ 114.6649
- 462.5936
+ 402.5936
154.1249
- 474.5936 ]
+ 414.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER121': class PDFDictionary
-139 0 obj
+% 'Annot.NUMBER129': class PDFDictionary
+147 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://argparse.googlecode.com) >>
@@ -2277,14 +2408,14 @@ endobj
0
0 ]
/Rect [ 191.6329
- 450.5936
+ 390.5936
233.8729
- 462.5936 ]
+ 402.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
-% 'Annot.NUMBER122': class PDFDictionary
-140 0 obj
+% 'Annot.NUMBER130': class PDFDictionary
+148 0 obj
<< /A << /S /URI
/Type /Action
/URI (http://pypi.python.org/pypi/Clap/0.7) >>
@@ -2292,21 +2423,16 @@ endobj
0
0 ]
/Rect [ 263.3429
- 420.5936
+ 360.5936
286.6829
- 432.5936 ]
+ 372.5936 ]
/Subtype /Link
/Type /Annot >>
endobj
% 'Page13': class PDFPage
-141 0 obj
+149 0 obj
% Page dictionary
-<< /Annots [ 127 0 R
- 128 0 R
- 129 0 R
- 130 0 R
- 131 0 R
- 132 0 R
+<< /Annots [ 132 0 R
133 0 R
134 0 R
135 0 R
@@ -2314,13 +2440,21 @@ endobj
137 0 R
138 0 R
139 0 R
- 140 0 R ]
- /Contents 171 0 R
+ 140 0 R
+ 141 0 R
+ 142 0 R
+ 143 0 R
+ 144 0 R
+ 145 0 R
+ 146 0 R
+ 147 0 R
+ 148 0 R ]
+ /Contents 180 0 R
/MediaBox [ 0
0
595.2756
841.8898 ]
- /Parent 158 0 R
+ /Parent 167 0 R
/Resources << /Font 1 0 R
/ProcSet [ /PDF
/Text
@@ -2331,218 +2465,230 @@ endobj
/Trans << >>
/Type /Page >>
endobj
-% 'R142': class PDFCatalog
-142 0 obj
+% 'R150': class PDFCatalog
+150 0 obj
% Document Root
-<< /Outlines 144 0 R
- /PageLabels 172 0 R
+<< /Outlines 152 0 R
+ /PageLabels 181 0 R
/PageMode /UseNone
- /Pages 158 0 R
+ /Pages 167 0 R
/Type /Catalog >>
endobj
-% 'R143': class PDFInfo
-143 0 obj
+% 'R151': class PDFInfo
+151 0 obj
<< /Author (Michele Simionato)
- /CreationDate (D:20100603061743-01'00')
+ /CreationDate (D:20100603072443-01'00')
/Keywords ()
/Producer (ReportLab http://www.reportlab.com)
/Subject (\(unspecified\))
- /Title (Parsing the Command Line the Easy Way: Introducing plac, the Easiest Argument Parser in the Python World) >>
+ /Title (Plac: Parsing the Command Line the Easy Way) >>
endobj
-% 'R144': class PDFOutlines
-144 0 obj
-<< /Count 13
- /First 145 0 R
- /Last 157 0 R
+% 'R152': class PDFOutlines
+152 0 obj
+<< /Count 14
+ /First 153 0 R
+ /Last 166 0 R
/Type /Outlines >>
endobj
% 'Outline.0': class OutlineEntryObject
-145 0 obj
-<< /Dest [ 42 0 R
+153 0 obj
+<< /Dest [ 48 0 R
/XYZ
62.69291
- 281.0236
+ 311.0236
0 ]
- /Next 146 0 R
- /Parent 144 0 R
+ /Next 154 0 R
+ /Parent 152 0 R
/Title (The importance of scaling down) >>
endobj
% 'Outline.1': class OutlineEntryObject
-146 0 obj
-<< /Dest [ 54 0 R
+154 0 obj
+<< /Dest [ 56 0 R
/XYZ
62.69291
- 579.0236
+ 615.0236
0 ]
- /Next 147 0 R
- /Parent 144 0 R
- /Prev 145 0 R
+ /Next 155 0 R
+ /Parent 152 0 R
+ /Prev 153 0 R
/Title (Scripts with required arguments) >>
endobj
% 'Outline.2': class OutlineEntryObject
-147 0 obj
-<< /Dest [ 60 0 R
+155 0 obj
+<< /Dest [ 62 0 R
/XYZ
62.69291
- 295.4236
+ 331.4236
0 ]
- /Next 148 0 R
- /Parent 144 0 R
- /Prev 146 0 R
+ /Next 156 0 R
+ /Parent 152 0 R
+ /Prev 154 0 R
/Title (Scripts with default arguments) >>
endobj
% 'Outline.3': class OutlineEntryObject
-148 0 obj
-<< /Dest [ 72 0 R
+156 0 obj
+<< /Dest [ 74 0 R
/XYZ
62.69291
- 671.8236
+ 717.0236
0 ]
- /Next 149 0 R
- /Parent 144 0 R
- /Prev 147 0 R
+ /Next 157 0 R
+ /Parent 152 0 R
+ /Prev 155 0 R
/Title (Scripts with options) >>
endobj
% 'Outline.4': class OutlineEntryObject
-149 0 obj
-<< /Dest [ 76 0 R
+157 0 obj
+<< /Dest [ 78 0 R
/XYZ
62.69291
- 162.6236
+ 207.8236
0 ]
- /Next 150 0 R
- /Parent 144 0 R
- /Prev 148 0 R
+ /Next 158 0 R
+ /Parent 152 0 R
+ /Prev 156 0 R
/Title (Scripts with flags) >>
endobj
% 'Outline.5': class OutlineEntryObject
-150 0 obj
-<< /Dest [ 78 0 R
+158 0 obj
+<< /Dest [ 80 0 R
/XYZ
62.69291
- 351.7299
+ 383.4236
0 ]
- /Next 151 0 R
- /Parent 144 0 R
- /Prev 149 0 R
+ /Next 159 0 R
+ /Parent 152 0 R
+ /Prev 157 0 R
/Title (plac for Python 2.X users) >>
endobj
% 'Outline.6': class OutlineEntryObject
-151 0 obj
-<< /Dest [ 85 0 R
+159 0 obj
+<< /Dest [ 87 0 R
/XYZ
62.69291
- 603.8236
+ 647.8236
0 ]
- /Next 152 0 R
- /Parent 144 0 R
- /Prev 150 0 R
+ /Next 160 0 R
+ /Parent 152 0 R
+ /Prev 158 0 R
/Title (More features) >>
endobj
% 'Outline.7': class OutlineEntryObject
-152 0 obj
-<< /Dest [ 89 0 R
+160 0 obj
+<< /Dest [ 91 0 R
/XYZ
62.69291
- 494.4849
+ 542.4849
0 ]
- /Next 153 0 R
- /Parent 144 0 R
- /Prev 151 0 R
- /Title (A more realistic example) >>
+ /Next 161 0 R
+ /Parent 152 0 R
+ /Prev 159 0 R
+ /Title (A realistic example) >>
endobj
% 'Outline.8': class OutlineEntryObject
-153 0 obj
-<< /Dest [ 100 0 R
+161 0 obj
+<< /Dest [ 102 0 R
/XYZ
62.69291
- 551.8236
+ 571.8236
0 ]
- /Next 154 0 R
- /Parent 144 0 R
- /Prev 152 0 R
+ /Next 162 0 R
+ /Parent 152 0 R
+ /Prev 160 0 R
/Title (Advanced usage) >>
endobj
% 'Outline.9': class OutlineEntryObject
-154 0 obj
-<< /Dest [ 102 0 R
+162 0 obj
+<< /Dest [ 104 0 R
/XYZ
62.69291
623.8236
0 ]
- /Next 155 0 R
- /Parent 144 0 R
- /Prev 153 0 R
+ /Next 163 0 R
+ /Parent 152 0 R
+ /Prev 161 0 R
/Title (Custom annotation objects) >>
endobj
% 'Outline.10': class OutlineEntryObject
-155 0 obj
-<< /Dest [ 126 0 R
+163 0 obj
+<< /Dest [ 131 0 R
/XYZ
62.69291
671.8236
0 ]
- /Next 156 0 R
- /Parent 144 0 R
- /Prev 154 0 R
+ /Next 164 0 R
+ /Parent 152 0 R
+ /Prev 162 0 R
/Title (plac vs argparse) >>
endobj
% 'Outline.11': class OutlineEntryObject
-156 0 obj
-<< /Dest [ 141 0 R
+164 0 obj
+<< /Dest [ 131 0 R
/XYZ
62.69291
- 765.0236
+ 182.8236
0 ]
- /Next 157 0 R
- /Parent 144 0 R
- /Prev 155 0 R
- /Title (The future) >>
+ /Next 165 0 R
+ /Parent 152 0 R
+ /Prev 163 0 R
+ /Title (plac vs the rest of the world) >>
endobj
% 'Outline.12': class OutlineEntryObject
-157 0 obj
-<< /Dest [ 141 0 R
+165 0 obj
+<< /Dest [ 149 0 R
/XYZ
62.69291
- 654.0236
+ 705.0236
0 ]
- /Parent 144 0 R
- /Prev 156 0 R
+ /Next 166 0 R
+ /Parent 152 0 R
+ /Prev 164 0 R
+ /Title (The future) >>
+endobj
+% 'Outline.13': class OutlineEntryObject
+166 0 obj
+<< /Dest [ 149 0 R
+ /XYZ
+ 62.69291
+ 594.0236
+ 0 ]
+ /Parent 152 0 R
+ /Prev 165 0 R
/Title (Trivia: the story behind the name) >>
endobj
-% 'R158': class PDFPages
-158 0 obj
+% 'R167': class PDFPages
+167 0 obj
% page tree
<< /Count 13
- /Kids [ 42 0 R
- 54 0 R
- 60 0 R
- 65 0 R
- 72 0 R
- 76 0 R
+ /Kids [ 48 0 R
+ 56 0 R
+ 62 0 R
+ 67 0 R
+ 74 0 R
78 0 R
- 85 0 R
- 89 0 R
- 100 0 R
+ 80 0 R
+ 87 0 R
+ 91 0 R
102 0 R
- 126 0 R
- 141 0 R ]
+ 104 0 R
+ 131 0 R
+ 149 0 R ]
/Type /Pages >>
endobj
-% 'R159': class PDFStream
-159 0 obj
+% 'R168': class PDFStream
+168 0 obj
% page stream
-<< /Length 8272 >>
+<< /Length 9065 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 693.0236 cm
+1 0 0 1 62.69291 741.0236 cm
q
-BT 1 0 0 1 0 57.64 Tm 34.89488 0 Td 24 TL /F2 20 Tf 0 0 0 rg (Parsing the Command Line the Easy Way:) Tj T* -31.68 0 Td (Introducing plac, the Easiest Argument Parser in) Tj T* 148.95 0 Td (the Python World) Tj T* -152.1649 0 Td ET
+BT 1 0 0 1 0 9.64 Tm 11.54488 0 Td 24 TL /F2 20 Tf 0 0 0 rg (Plac: Parsing the Command Line the Easy Way) Tj T* -11.54488 0 Td ET
Q
Q
q
-1 0 0 1 62.69291 668.0236 cm
+1 0 0 1 62.69291 716.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2563,7 +2709,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 653.0236 cm
+1 0 0 1 62.69291 701.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2585,7 +2731,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 638.0236 cm
+1 0 0 1 62.69291 686.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2606,7 +2752,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 611.0236 cm
+1 0 0 1 62.69291 659.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2628,7 +2774,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 596.0236 cm
+1 0 0 1 62.69291 644.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2650,7 +2796,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 581.0236 cm
+1 0 0 1 62.69291 629.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2671,7 +2817,7 @@ q
Q
Q
q
-1 0 0 1 62.69291 566.0236 cm
+1 0 0 1 62.69291 614.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -2692,23 +2838,23 @@ q
Q
Q
q
-1 0 0 1 62.69291 533.0236 cm
+1 0 0 1 62.69291 581.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Contents) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 293.0236 cm
+1 0 0 1 62.69291 323.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
-1 0 0 1 0 219 cm
+1 0 0 1 0 237 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (The importance of scaling down) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 219 cm
+1 0 0 1 397.8898 237 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2716,13 +2862,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (1) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 201 cm
+1 0 0 1 0 219 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Scripts with required arguments) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 201 cm
+1 0 0 1 397.8898 219 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2730,13 +2876,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (2) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 183 cm
+1 0 0 1 0 201 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Scripts with default arguments) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 183 cm
+1 0 0 1 397.8898 201 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2744,13 +2890,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (3) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 165 cm
+1 0 0 1 0 183 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Scripts with options) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 165 cm
+1 0 0 1 397.8898 183 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2758,13 +2904,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (5) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 147 cm
+1 0 0 1 0 165 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Scripts with flags) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 147 cm
+1 0 0 1 397.8898 165 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2772,13 +2918,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (6) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 129 cm
+1 0 0 1 0 147 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (plac for Python 2.X users) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 129 cm
+1 0 0 1 397.8898 147 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2786,13 +2932,13 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (7) Tj T* -66.44 0 Td ET
Q
Q
q
-1 0 0 1 0 111 cm
+1 0 0 1 0 129 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (More features) Tj T* ET
Q
Q
q
-1 0 0 1 397.8898 111 cm
+1 0 0 1 397.8898 129 cm
q
0 0 .501961 rg
0 0 .501961 RG
@@ -2800,9 +2946,23 @@ BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET
Q
Q
q
+1 0 0 1 0 111 cm
+q
+BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (A realistic example) Tj T* ET
+Q
+Q
+q
+1 0 0 1 397.8898 111 cm
+q
+0 0 .501961 rg
+0 0 .501961 RG
+BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET
+Q
+Q
+q
1 0 0 1 0 93 cm
q
-BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (A more realistic example) Tj T* ET
+BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Advanced usage) Tj T* ET
Q
Q
q
@@ -2810,13 +2970,13 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET
+BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 75 cm
q
-BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Advanced usage) Tj T* ET
+BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Custom annotation objects) Tj T* ET
Q
Q
q
@@ -2824,13 +2984,13 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 60.88 0 Td (11) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 57 cm
q
-BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Custom annotation objects) Tj T* ET
+BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (plac vs argparse) Tj T* ET
Q
Q
q
@@ -2838,13 +2998,13 @@ q
q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 60.88 0 Td (11) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 4.82 Tm /F2 10 Tf 12 TL 60.88 0 Td (12) Tj T* -60.88 0 Td ET
Q
Q
q
1 0 0 1 0 39 cm
q
-BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (plac vs argparse) Tj T* ET
+BT 1 0 0 1 0 4.82 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (plac vs the rest of the world) Tj T* ET
Q
Q
q
@@ -2887,24 +3047,30 @@ q
Q
Q
q
-1 0 0 1 62.69291 260.0236 cm
+1 0 0 1 62.69291 290.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (The importance of scaling down) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 194.0236 cm
+1 0 0 1 62.69291 224.0236 cm
q
BT 1 0 0 1 0 52.82 Tm 1.50936 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is no want of command line arguments parsers in the Python world. The standard library alone) Tj T* 0 Tw 1.087126 Tw (contains three different modules: ) Tj 0 0 .501961 rg (getopt ) Tj 0 0 0 rg (\(from the stone age\), ) Tj 0 0 .501961 rg (optparse ) Tj 0 0 0 rg (\(from Python 2.3\) and ) Tj 0 0 .501961 rg (argparse) Tj T* 0 Tw .223735 Tw 0 0 0 rg (\(from Python 2.7\). All of them are quite powerful and especially ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (is an industrial strength solution;) Tj T* 0 Tw 1.40311 Tw (unfortunately, all of them feature a non-zero learning curve and a certain verbosity. They do not scale) Tj T* 0 Tw (down well enough, at least in my opinion.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 104.0236 cm
+1 0 0 1 62.69291 134.0236 cm
q
BT 1 0 0 1 0 76.82 Tm .051984 Tw 12 TL /F1 10 Tf 0 0 0 rg (It should not be necessary to stress the importance ) Tj 0 0 .501961 rg (scaling down) Tj 0 0 0 rg (; nevertheless most people are obsessed) Tj T* 0 Tw 1.385868 Tw (with features and concerned with the possibility of scaling up, whereas I think that we should be even) Tj T* 0 Tw .996457 Tw (more concerned with the issue of scaling down. This is an old meme in the computing world: programs) Tj T* 0 Tw 2.499984 Tw (should address the common cases simply, simple things should be kept simple, while at the same) Tj T* 0 Tw .535868 Tw (keeping difficult things possible. ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (adhere as much as possible to this philosophy and it is designed to) Tj T* 0 Tw 2.44686 Tw (handle well the simple cases, while retaining the ability to handle complex cases by relying on the) Tj T* 0 Tw (underlying power of ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
+1 0 0 1 62.69291 92.02362 cm
+q
+BT 1 0 0 1 0 28.82 Tm 1.488221 Tw 12 TL /F1 10 Tf 0 0 0 rg (Technically ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is just a simple wrapper over ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (which hides most of its complexity by using a ) Tj T* 0 Tw .203318 Tw (declarative interface: the argument parser is inferred rather than written down by imperatively. Still, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is ) Tj T* 0 Tw .125984 Tw (surprisingly scalable upwards, even without using the underlying ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (. I have been using Python for 8) Tj T* 0 Tw ET
+Q
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -2915,38 +3081,38 @@ Q
endstream
endobj
-% 'R160': class PDFStream
-160 0 obj
+% 'R169': class PDFStream
+169 0 obj
% page stream
-<< /Length 5349 >>
+<< /Length 4921 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 693.0236 cm
+1 0 0 1 62.69291 729.0236 cm
q
-BT 1 0 0 1 0 64.82 Tm 1.488221 Tw 12 TL /F1 10 Tf 0 0 0 rg (Technically ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is just a simple wrapper over ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (which hides most of its complexity by using a) Tj T* 0 Tw .203318 Tw (declarative interface: the argument parser is inferred rather than written down by imperatively. Still, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is) Tj T* 0 Tw .125984 Tw (surprisingly scalable upwards, even without using the underlying ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (. I have been using Python for 8) Tj T* 0 Tw 1.618876 Tw (years and in my experience it is extremely unlikely that you will ever need to go beyond the features) Tj T* 0 Tw 1.776457 Tw (provided by the declarative interface of ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (: they should be more than enough for 99.9% of the use) Tj T* 0 Tw (cases.) Tj T* ET
+BT 1 0 0 1 0 28.82 Tm 1.618876 Tw 12 TL /F1 10 Tf 0 0 0 rg (years and in my experience it is extremely unlikely that you will ever need to go beyond the features) Tj T* 0 Tw 1.776457 Tw (provided by the declarative interface of ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (: they should be more than enough for 99.9% of the use) Tj T* 0 Tw (cases.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 591.0236 cm
+1 0 0 1 62.69291 627.0236 cm
q
BT 1 0 0 1 0 88.82 Tm 1.540888 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is targetting especially unsophisticated users, programmers, sys-admins, scientists and in general) Tj T* 0 Tw .81284 Tw (people writing throw-away scripts for themselves, choosing the command line interface because it is the) Tj T* 0 Tw .471751 Tw (quick and simple. Such users are not interested in features, they are interested in a small learning curve:) Tj T* 0 Tw .984988 Tw (they just want to be able to write a simple command line tool from a simple specification, not to build a) Tj T* 0 Tw 1.091235 Tw (command line parser by hand. Unfortunately, the modules in the standard library forces them to go the) Tj T* 0 Tw .014104 Tw (hard way. They are designed to implement power user tools and they have a non-trivial learning curve. On) Tj T* 0 Tw 1.584104 Tw (the contrary, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is designed to be simple to use and extremely concise, as the examples below will) Tj T* 0 Tw (show.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 558.0236 cm
+1 0 0 1 62.69291 594.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Scripts with required arguments) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 492.0236 cm
+1 0 0 1 62.69291 528.0236 cm
q
BT 1 0 0 1 0 52.82 Tm .352209 Tw 12 TL /F1 10 Tf 0 0 0 rg (Let me start with the simplest possible thing: a script that takes a single argument and does something to) Tj T* 0 Tw 1.022485 Tw (it. It cannot get simpler than that, unless you consider a script without command line arguments, where) Tj T* 0 Tw .735488 Tw (there is nothing to parse. Still, it is a use case ) Tj /F5 10 Tf (extremely common) Tj /F1 10 Tf (: I need to write scripts like that nearly) Tj T* 0 Tw .486655 Tw (every day, I wrote hundreds of them in the last few years and I have never been happy. Here is a typical) Tj T* 0 Tw (example of code I have been writing by hand for years:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 290.8236 cm
+1 0 0 1 62.69291 326.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -2967,7 +3133,7 @@ Q
Q
Q
q
-1 0 0 1 62.69291 186.8236 cm
+1 0 0 1 62.69291 222.8236 cm
q
BT 1 0 0 1 0 88.82 Tm .880651 Tw 12 TL /F1 10 Tf 0 0 0 rg (As you see the whole ) Tj /F4 10 Tf (if __name__ == '__main__' ) Tj /F1 10 Tf (block \(nine lines\) is essentially boilerplate that) Tj T* 0 Tw 1.67881 Tw (should not exists. Actually I think the language should recognize the main function and pass to it the) Tj T* 0 Tw 3.096905 Tw (command line arguments automatically; unfortunaly this is unlikely to happen. I have been writing) Tj T* 0 Tw 1.767356 Tw (boilerplate like this in hundreds of scripts for years, and every time I ) Tj /F5 10 Tf (hate ) Tj /F1 10 Tf (it. The purpose of using a) Tj T* 0 Tw 1.47229 Tw (scripting language is convenience and trivial things should be trivial. Unfortunately the standard library) Tj T* 0 Tw .69881 Tw (does not help for this incredibly common use case. Using ) Tj 0 0 .501961 rg (getopt ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (optparse ) Tj 0 0 0 rg (does not help, since they) Tj T* 0 Tw .894104 Tw (are intended to manage options and not positional arguments; the ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (module helps a bit and it is) Tj T* 0 Tw (able to reduce the boilerplate from nine lines to six lines:) Tj T* ET
Q
@@ -2983,11 +3149,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 84 re B*
+n -6 -6 468.6898 120 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 65.71 Tm /F4 10 Tf 12 TL (# example2.py) Tj T* (def main\(dsn\):) Tj T* ( "Do something on the database") Tj T* ( print\(dsn\)) Tj T* ( # ...) Tj T* T* ET
+BT 1 0 0 1 0 101.71 Tm /F4 10 Tf 12 TL (# example2.py) Tj T* (def main\(dsn\):) Tj T* ( "Do something on the database") Tj T* ( print\(dsn\)) Tj T* ( # ...) Tj T* T* (if __name__ == '__main__':) Tj T* ( import argparse) Tj T* ( p = argparse.ArgumentParser\(\)) Tj T* ET
Q
Q
Q
@@ -3004,14 +3170,14 @@ Q
endstream
endobj
-% 'R161': class PDFStream
-161 0 obj
+% 'R170': class PDFStream
+170 0 obj
% page stream
-<< /Length 3933 >>
+<< /Length 4017 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 679.8236 cm
+1 0 0 1 62.69291 715.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3021,31 +3187,31 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 84 re B*
+n -6 -6 468.6898 48 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 65.71 Tm /F4 10 Tf 12 TL (if __name__ == '__main__':) Tj T* ( import argparse) Tj T* ( p = argparse.ArgumentParser\(\)) Tj T* ( p.add_argument\('dsn'\)) Tj T* ( arg = p.parse_args\(\)) Tj T* ( main\(arg.dsn\)) Tj T* ET
+BT 1 0 0 1 0 29.71 Tm /F4 10 Tf 12 TL ( p.add_argument\('dsn'\)) Tj T* ( arg = p.parse_args\(\)) Tj T* ( main\(arg.dsn\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 623.8236 cm
+1 0 0 1 62.69291 659.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 40.82 Tm /F1 10 Tf 12 TL 1.644269 Tw (However saving three lines does not justify introducing the external dependency: most people will not) Tj T* 0 Tw 2.206303 Tw (switch to Python 2.7, which at the time of this writing is just about to be released, for many years.) Tj T* 0 Tw .678488 Tw (Moreover, it just feels too complex to instantiate a class and to define a parser by hand for such a trivial) Tj T* 0 Tw (task.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 593.8236 cm
+1 0 0 1 62.69291 629.8236 cm
q
BT 1 0 0 1 0 16.82 Tm 1.123145 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (module is designed to manage well such use cases, and it is able to reduce the original nine) Tj T* 0 Tw (lines of boiler plate to two lines. With the ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (module all you need to write is) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 476.6236 cm
+1 0 0 1 62.69291 512.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -3066,13 +3232,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 444.6236 cm
+1 0 0 1 62.69291 480.6236 cm
q
BT 1 0 0 1 0 16.82 Tm .929986 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (module provides for free \(actually the work is done by the underlying ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (module\) a nice) Tj T* 0 Tw (usage message:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 327.4236 cm
+1 0 0 1 62.69291 363.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -3093,19 +3259,19 @@ Q
Q
Q
q
-1 0 0 1 62.69291 307.4236 cm
+1 0 0 1 62.69291 343.4236 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (This is only the tip of the iceberg: ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is able to do much more than that.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 274.4236 cm
+1 0 0 1 62.69291 310.4236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Scripts with default arguments) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 244.4236 cm
+1 0 0 1 62.69291 280.4236 cm
q
0 0 0 rg
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL 1.33436 Tw (The need to have suitable defaults for command line arguments is quite common. For instance I have) Tj T* 0 Tw (encountered this use case at work hundreds of times:) Tj T* ET
@@ -3122,10 +3288,10 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 144 re B*
+n -6 -6 468.6898 180 re B*
Q
q
-BT 1 0 0 1 0 125.71 Tm 12 TL /F4 10 Tf 0 0 0 rg (# example4.py) Tj T* (from datetime import datetime) Tj T* T* (def main\(dsn, table='product', today=datetime.today\(\)\):) Tj T* ( "Do something on the database") Tj T* ( print\(dsn, table, today\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import sys) Tj T* ( args = sys.argv[1:]) Tj T* ( if not args:) Tj T* ET
+BT 1 0 0 1 0 161.71 Tm 12 TL /F4 10 Tf 0 0 0 rg (# example4.py) Tj T* (from datetime import datetime) Tj T* T* (def main\(dsn, table='product', today=datetime.today\(\)\):) Tj T* ( "Do something on the database") Tj T* ( print\(dsn, table, today\)) Tj T* T* (if __name__ == '__main__':) Tj T* ( import sys) Tj T* ( args = sys.argv[1:]) Tj T* ( if not args:) Tj T* ( sys.exit\('usage: python %s dsn' % sys.argv[0]\)) Tj T* ( elif len\(args\) ) Tj (>) Tj ( 2:) Tj T* ( sys.exit\('Unrecognized arguments: %s' % ' '.join\(argv[2:]\)\)) Tj T* ET
Q
Q
Q
@@ -3142,14 +3308,14 @@ Q
endstream
endobj
-% 'R162': class PDFStream
-162 0 obj
+% 'R171': class PDFStream
+171 0 obj
% page stream
-<< /Length 4252 >>
+<< /Length 4143 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 703.8236 cm
+1 0 0 1 62.69291 739.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3159,23 +3325,23 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 60 re B*
+n -6 -6 468.6898 24 re B*
Q
q
-BT 1 0 0 1 0 41.71 Tm 12 TL /F4 10 Tf 0 0 0 rg ( sys.exit\('usage: python %s dsn' % sys.argv[0]\)) Tj T* ( elif len\(args\) ) Tj (>) Tj ( 2:) Tj T* ( sys.exit\('Unrecognized arguments: %s' % ' '.join\(argv[2:]\)\)) Tj T* ( main\(*args\)) Tj T* ET
+BT 1 0 0 1 0 5.71 Tm 12 TL /F4 10 Tf 0 0 0 rg ( main\(*args\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 635.8236 cm
+1 0 0 1 62.69291 671.8236 cm
q
BT 1 0 0 1 0 52.82 Tm 1.138935 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here I want to perform a query on a database table, by extracting the today's data: it makes sense for) Tj T* 0 Tw .299988 Tw /F4 10 Tf (today ) Tj /F1 10 Tf (to be a default argument. If there is a most used table \(in this example a table called ) Tj /F4 10 Tf ('product') Tj /F1 10 Tf (\)) Tj T* 0 Tw 2.828735 Tw (it also makes sense to make it a default argument. Performing the parsing of the command lines) Tj T* 0 Tw .083735 Tw (arguments by hand takes 8 ugly lines of boilerplate \(using ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (would require about the same number) Tj T* 0 Tw (of lines\). With ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (the entire ) Tj /F4 10 Tf (__main__ ) Tj /F1 10 Tf (block reduces to the usual two lines:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 590.6236 cm
+1 0 0 1 62.69291 626.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -3196,14 +3362,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 570.6236 cm
+1 0 0 1 62.69291 606.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (In other words, six lines of boilerplate have been removed, and we get the usage message for free:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 441.4236 cm
+1 0 0 1 62.69291 477.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -3224,13 +3390,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 409.4236 cm
+1 0 0 1 62.69291 445.4236 cm
q
BT 1 0 0 1 0 16.82 Tm .396235 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (manages transparently even the case when you want to pass a variable number of arguments. Here) Tj T* 0 Tw (is an example, a script running on a database a series of SQL scripts:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 220.2236 cm
+1 0 0 1 62.69291 256.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -3250,13 +3416,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 188.2236 cm
+1 0 0 1 62.69291 224.2236 cm
q
BT 1 0 0 1 0 16.82 Tm .563876 Tw 12 TL /F1 10 Tf 0 0 0 rg (Using ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (, you can just replace the ) Tj /F4 10 Tf (__main__ ) Tj /F1 10 Tf (block with the usual two lines \(I have defined an Emacs) Tj T* 0 Tw (keybinding for them\) and then you get the following nice usage message:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 95.02362 cm
+1 0 0 1 62.69291 107.0236 cm
q
q
1 0 0 1 0 0 cm
@@ -3266,11 +3432,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 84 re B*
+n -6 -6 468.6898 108 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 65.71 Tm /F4 10 Tf 12 TL (usage: example7.py [-h] dsn [scripts [scripts ...]]) Tj T* T* (positional arguments:) Tj T* ( dsn) Tj T* ( scripts) Tj T* T* ET
+BT 1 0 0 1 0 89.71 Tm /F4 10 Tf 12 TL (usage: example7.py [-h] dsn [scripts [scripts ...]]) Tj T* T* (positional arguments:) Tj T* ( dsn) Tj T* ( scripts) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
Q
Q
Q
@@ -3287,65 +3453,44 @@ Q
endstream
endobj
-% 'R163': class PDFStream
-163 0 obj
+% 'R172': class PDFStream
+172 0 obj
% page stream
-<< /Length 5195 >>
+<< /Length 4981 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 727.8236 cm
-q
-q
-1 0 0 1 0 0 cm
-q
-1 0 0 1 6.6 6.6 cm
-q
-.662745 .662745 .662745 RG
-.5 w
-.960784 .960784 .862745 rg
-n -6 -6 468.6898 36 re B*
-Q
-q
-0 0 0 rg
-BT 1 0 0 1 0 17.71 Tm /F4 10 Tf 12 TL (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
-Q
-Q
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 683.8236 cm
+1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 28.82 Tm .92881 Tw 12 TL /F1 10 Tf 0 0 0 rg (The examples here should have made clear that ) Tj /F5 10 Tf (plac is able to figure out the command line arguments) Tj T* 0 Tw .899988 Tw (parser to use from the signature of the main function) Tj /F1 10 Tf (. This is the whole idea behind ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (: if the intent is) Tj T* 0 Tw (clear, let's the machine take care of the details.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 650.8236 cm
+1 0 0 1 62.69291 696.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Scripts with options) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 560.8236 cm
+1 0 0 1 62.69291 606.0236 cm
q
BT 1 0 0 1 0 76.82 Tm .046098 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is surprising how few command line scripts with options I have written over the years \(probably less than) Tj T* 0 Tw 1.02311 Tw (a hundred\), compared to the number of scripts with positional arguments I wrote \(certainly more than a) Tj T* 0 Tw .177045 Tw (thousand of them\). Still, this use case cannot be neglected. The standard library modules \(all of them\) are) Tj T* 0 Tw 2.30686 Tw (quite verbose when it comes to specifying the options and frankly I have never used them directly.) Tj T* 0 Tw 3.10561 Tw (Instead, I have always relied on an old recipe of mine, the ) Tj 0 0 .501961 rg (optionparse ) Tj 0 0 0 rg (recipe, which provides a) Tj T* 0 Tw 2.369982 Tw (convenient wrapper over ) Tj 0 0 .501961 rg (optionparse) Tj 0 0 0 rg (. Alternatively, in the simplest cases, I have just performed the) Tj T* 0 Tw (parsing by hand.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 518.8236 cm
+1 0 0 1 62.69291 564.0236 cm
q
BT 1 0 0 1 0 28.82 Tm .476098 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is inspired to the ) Tj 0 0 .501961 rg (optionparse ) Tj 0 0 0 rg (recipe, in the sense that it delivers the programmer from the burden of) Tj T* 0 Tw .011488 Tw (writing the parser, but is less of a hack: instead of extracting the parser from the docstring of the module, it) Tj T* 0 Tw (extracts it from the signature of the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 488.8236 cm
+1 0 0 1 62.69291 534.0236 cm
q
BT 1 0 0 1 0 16.82 Tm .319987 Tw 12 TL /F1 10 Tf 0 0 0 rg (The idea comes from the ) Tj /F5 10 Tf (function annotations ) Tj /F1 10 Tf (concept, a new feature of Python 3. An example is worth a) Tj T* 0 Tw (thousand words, so here it is:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 371.6236 cm
+1 0 0 1 62.69291 416.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3366,13 +3511,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 303.6236 cm
+1 0 0 1 62.69291 348.8236 cm
q
BT 1 0 0 1 0 52.82 Tm .789983 Tw 12 TL /F1 10 Tf 0 0 0 rg (As you see, the argument ) Tj /F4 10 Tf (command ) Tj /F1 10 Tf (has been annotated with the tuple ) Tj /F4 10 Tf (\("SQL query", 'option',) Tj T* 0 Tw .358409 Tw ('c'\)) Tj /F1 10 Tf (: the first string is the help string which will appear in the usage message, the second string tell ) Tj 0 0 .501961 rg (plac) Tj T* 0 Tw .560988 Tw 0 0 0 rg (that ) Tj /F4 10 Tf (command ) Tj /F1 10 Tf (is an option and the third string that it can be abbreviated with the letter ) Tj /F4 10 Tf (c) Tj /F1 10 Tf (. Of course, the) Tj T* 0 Tw .89284 Tw (long option format \() Tj /F4 10 Tf (--command=) Tj /F1 10 Tf (\) comes from the argument name. The resulting usage message is the) Tj T* 0 Tw (following:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 174.4236 cm
+1 0 0 1 62.69291 219.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -3393,14 +3538,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 154.4236 cm
+1 0 0 1 62.69291 199.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Here are two examples of usage:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 97.22362 cm
+1 0 0 1 62.69291 118.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -3410,11 +3555,11 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 48 re B*
+n -6 -6 468.6898 72 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 29.71 Tm /F4 10 Tf 12 TL ($ python3 example8.py -c"select * from table" dsn) Tj T* (executing select * from table on dsn) Tj T* T* ET
+BT 1 0 0 1 0 53.71 Tm /F4 10 Tf 12 TL ($ python3 example8.py -c"select * from table" dsn) Tj T* (executing select * from table on dsn) Tj T* T* ($ python3 example8.py --command="select * from table" dsn) Tj T* (executing select * from table on dsn) Tj T* ET
Q
Q
Q
@@ -3431,41 +3576,20 @@ Q
endstream
endobj
-% 'R164': class PDFStream
-164 0 obj
+% 'R173': class PDFStream
+173 0 obj
% page stream
-<< /Length 5450 >>
+<< /Length 5467 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 727.8236 cm
-q
-q
-1 0 0 1 0 0 cm
-q
-1 0 0 1 6.6 6.6 cm
-q
-.662745 .662745 .662745 RG
-.5 w
-.960784 .960784 .862745 rg
-n -6 -6 468.6898 36 re B*
-Q
-q
-0 0 0 rg
-BT 1 0 0 1 0 17.71 Tm /F4 10 Tf 12 TL ($ python3 example8.py --command="select * from table" dsn) Tj T* (executing select * from table on dsn) Tj T* ET
-Q
-Q
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 695.8236 cm
+1 0 0 1 62.69291 741.0236 cm
q
BT 1 0 0 1 0 16.82 Tm 1.34104 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that if the option is not passed, the variable ) Tj /F4 10 Tf (command ) Tj /F1 10 Tf (will get the value ) Tj /F4 10 Tf (None) Tj /F1 10 Tf (. It is possible to) Tj T* 0 Tw (specify a non-trivial default for an option. Here is an example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 602.6236 cm
+1 0 0 1 62.69291 647.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3486,13 +3610,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 582.6236 cm
+1 0 0 1 62.69291 627.8236 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Now if you do not pass the ) Tj /F4 10 Tf (command option) Tj /F1 10 Tf (, the default query will be executed:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 537.4236 cm
+1 0 0 1 62.69291 582.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -3513,14 +3637,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 517.4236 cm
+1 0 0 1 62.69291 562.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Positional argument can be annotated too:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 460.2236 cm
+1 0 0 1 62.69291 505.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -3541,13 +3665,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 416.2236 cm
+1 0 0 1 62.69291 461.4236 cm
q
BT 1 0 0 1 0 28.82 Tm 3.203318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Of course explicit is better than implicit, an no special cases are special enough, but sometimes) Tj T* 0 Tw .16832 Tw (practicality beats purity, so ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (is able to use smart defaults; in particular you can omit the third argument) Tj T* 0 Tw (and write:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 359.0236 cm
+1 0 0 1 62.69291 404.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -3568,20 +3692,20 @@ Q
Q
Q
q
-1 0 0 1 62.69291 315.0236 cm
+1 0 0 1 62.69291 360.2236 cm
q
BT 1 0 0 1 0 28.82 Tm 1.123876 Tw 12 TL /F1 10 Tf 0 0 0 rg (When omitted, the third argument is assumed to be the first letter of the variable name for options and) Tj T* 0 Tw .334983 Tw (flags, and ) Tj /F4 10 Tf (None ) Tj /F1 10 Tf (for positional arguments. Moreover, smart enough to convert help messages into tuples;) Tj T* 0 Tw (in other words, you can just write ) Tj /F4 10 Tf ("Database dsn" ) Tj /F1 10 Tf (instead of ) Tj /F4 10 Tf (\("Database dsn", 'positional'\)) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 297.0236 cm
+1 0 0 1 62.69291 342.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (I should notice that varargs \(starred-arguments\) can be annotated too; here is an example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 251.8236 cm
+1 0 0 1 62.69291 297.0236 cm
q
q
1 0 0 1 0 0 cm
@@ -3602,13 +3726,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 231.8236 cm
+1 0 0 1 62.69291 277.0236 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (This is a valid signature for ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (, which will recognize the help strings for both ) Tj /F4 10 Tf (dsn ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (scripts) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 174.6236 cm
+1 0 0 1 62.69291 219.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3629,18 +3753,39 @@ Q
Q
Q
q
-1 0 0 1 62.69291 141.6236 cm
+1 0 0 1 62.69291 186.8236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Scripts with flags) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 111.6236 cm
+1 0 0 1 62.69291 156.8236 cm
q
BT 1 0 0 1 0 16.82 Tm .765868 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (also recognizes flags, i.e. boolean options which are ) Tj /F4 10 Tf (True ) Tj /F1 10 Tf (if they are passed to the command line) Tj T* 0 Tw (and ) Tj /F4 10 Tf (False ) Tj /F1 10 Tf (if they are absent. Here is an example:) Tj T* ET
Q
Q
q
+1 0 0 1 62.69291 101.3717 cm
+q
+q
+.96447 0 0 .96447 0 0 cm
+q
+1 0 0 1 6.6 6.843137 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 486 48 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 29.71 Tm /F4 10 Tf 12 TL (# example9.py) Tj T* T* (def main\(verbose: \('prints more info', 'flag', 'v'\), dsn: 'connection string'\):) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -3651,35 +3796,35 @@ Q
endstream
endobj
-% 'R165': class PDFStream
-165 0 obj
+% 'R174': class PDFStream
+174 0 obj
% page stream
-<< /Length 4359 >>
+<< /Length 4666 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 648.1299 cm
+1 0 0 1 62.69291 679.8236 cm
q
q
-.96447 0 0 .96447 0 0 cm
+1 0 0 1 0 0 cm
q
-1 0 0 1 6.6 6.843137 cm
+1 0 0 1 6.6 6.6 cm
q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 486 120 re B*
+n -6 -6 468.6898 84 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 101.71 Tm /F4 10 Tf 12 TL (# example9.py) Tj T* T* (def main\(verbose: \('prints more info', 'flag', 'v'\), dsn: 'connection string'\):) Tj T* ( if verbose:) Tj T* ( print\('connecting to %s' % dsn\)) Tj T* ( # ...) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac; plac.call\(main\)) Tj T* ET
+BT 1 0 0 1 0 65.71 Tm /F4 10 Tf 12 TL ( if verbose:) Tj T* ( print\('connecting to %s' % dsn\)) Tj T* ( # ...) Tj T* T* (if __name__ == '__main__':) Tj T* ( import plac; plac.call\(main\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 518.9299 cm
+1 0 0 1 62.69291 550.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -3700,7 +3845,7 @@ Q
Q
Q
q
-1 0 0 1 62.69291 473.7299 cm
+1 0 0 1 62.69291 505.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -3721,31 +3866,31 @@ Q
Q
Q
q
-1 0 0 1 62.69291 429.7299 cm
+1 0 0 1 62.69291 461.4236 cm
q
BT 1 0 0 1 0 28.82 Tm .31408 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that it is an error trying to specify a default for flags: the default value for a flag is always ) Tj /F4 10 Tf (False) Tj /F1 10 Tf (. If) Tj T* 0 Tw 2.652485 Tw (you feel the need to implement non-boolean flags, you should use an option with two choices, as) Tj T* 0 Tw (explained in the "more features" section.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 363.7299 cm
+1 0 0 1 62.69291 395.4236 cm
q
BT 1 0 0 1 0 52.82 Tm 5.832651 Tw 12 TL /F1 10 Tf 0 0 0 rg (For consistency with the way the usage message is printed, I suggest you to follow the) Tj T* 0 Tw 1.895433 Tw (Flag-Option-Required-Default \(FORD\) convention: in the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function write first the flag arguments,) Tj T* 0 Tw .881235 Tw (then the option arguments, then the required arguments and finally the default arguments. This is just a) Tj T* 0 Tw .110574 Tw (convention and you are not forced to use it, except for the default arguments \(including the varargs\) which) Tj T* 0 Tw (must stay at the end as it is required by the Python syntax.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 330.7299 cm
+1 0 0 1 62.69291 362.4236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (plac for Python 2.X users) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 264.7299 cm
+1 0 0 1 62.69291 296.4236 cm
q
BT 1 0 0 1 0 52.82 Tm .211807 Tw 12 TL /F1 10 Tf 0 0 0 rg (I do not use Python 3. At work we are just starting to think about migrating to Python 2.6. It will take years) Tj T* 0 Tw .304724 Tw (before we think to migrate to Python 3. I am pretty much sure most Pythonistas are in the same situation.) Tj T* 0 Tw 1.459984 Tw (Therefore ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (provides a way to work with function annotations even in Python 2.X \(including Python) Tj T* 0 Tw .226098 Tw (2.3\). There is no magic involved; you just need to add the annotations by hand. For instance the annotate) Tj T* 0 Tw (function declaration) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 219.5299 cm
+1 0 0 1 62.69291 251.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -3766,14 +3911,14 @@ Q
Q
Q
q
-1 0 0 1 62.69291 199.5299 cm
+1 0 0 1 62.69291 231.2236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (is equivalent to the following code:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 118.3299 cm
+1 0 0 1 62.69291 150.0236 cm
q
q
1 0 0 1 0 0 cm
@@ -3794,6 +3939,12 @@ Q
Q
Q
q
+1 0 0 1 62.69291 106.0236 cm
+q
+BT 1 0 0 1 0 28.82 Tm .536098 Tw 12 TL /F1 10 Tf 0 0 0 rg (One should be careful to match the keys of the annotation dictionary with the names of the arguments in) Tj T* 0 Tw 3.347485 Tw (the annotated function; for lazy people with Python 2.4 available the simplest way is to use the) Tj T* 0 Tw /F4 10 Tf (plac.annotations ) Tj /F1 10 Tf (decorator that performs the check for you:) Tj T* ET
+Q
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -3804,20 +3955,14 @@ Q
endstream
endobj
-% 'R166': class PDFStream
-166 0 obj
+% 'R175': class PDFStream
+175 0 obj
% page stream
-<< /Length 5557 >>
+<< /Length 5471 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 729.0236 cm
-q
-BT 1 0 0 1 0 28.82 Tm .536098 Tw 12 TL /F1 10 Tf 0 0 0 rg (One should be careful to match the keys of the annotation dictionary with the names of the arguments in) Tj T* 0 Tw 3.347485 Tw (the annotated function; for lazy people with Python 2.4 available the simplest way is to use the) Tj T* 0 Tw /F4 10 Tf (plac.annotations ) Tj /F1 10 Tf (decorator that performs the check for you:) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 647.8236 cm
+1 0 0 1 62.69291 691.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3838,28 +3983,28 @@ Q
Q
Q
q
-1 0 0 1 62.69291 615.8236 cm
+1 0 0 1 62.69291 659.8236 cm
q
BT 1 0 0 1 0 16.82 Tm 1.422164 Tw 12 TL /F1 10 Tf 0 0 0 rg (In the rest of this article I will assume that you are using Python 2.X with ) Tj /F4 10 Tf (X >) Tj (= 4 ) Tj /F1 10 Tf (and I will use the) Tj T* 0 Tw /F4 10 Tf (plac.annotations ) Tj /F1 10 Tf (decorator. Notice however that the tests for ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (runs even on Python 2.3.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 582.8236 cm
+1 0 0 1 62.69291 626.8236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (More features) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 528.8236 cm
+1 0 0 1 62.69291 572.8236 cm
q
BT 1 0 0 1 0 40.82 Tm .486179 Tw 12 TL /F1 10 Tf 0 0 0 rg (Even if one of the goals of plac is to have a learning curve of ) Tj /F5 10 Tf (minutes) Tj /F1 10 Tf (, compared to the learning curve of) Tj T* 0 Tw 1.356303 Tw /F5 10 Tf (hours ) Tj /F1 10 Tf (of ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (, it does not mean that I have removed all the features of ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (. Actually a lot of) Tj T* 0 Tw 1.71686 Tw 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (power persists in ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (. Until now, I have only showed simple annotations, but in general an) Tj T* 0 Tw (annotation is a 5-tuple of the form) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 522.8236 cm
+1 0 0 1 62.69291 566.8236 cm
Q
q
-1 0 0 1 62.69291 510.8236 cm
+1 0 0 1 62.69291 554.8236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -3874,40 +4019,40 @@ q
Q
Q
q
-1 0 0 1 62.69291 510.8236 cm
+1 0 0 1 62.69291 554.8236 cm
Q
q
-1 0 0 1 62.69291 468.8236 cm
+1 0 0 1 62.69291 512.8236 cm
q
BT 1 0 0 1 0 28.82 Tm 1.068735 Tw 12 TL /F1 10 Tf 0 0 0 rg (where ) Tj /F4 10 Tf (help ) Tj /F1 10 Tf (is the help message, ) Tj /F4 10 Tf (kind ) Tj /F1 10 Tf (is a string in the set { ) Tj /F4 10 Tf ("flag") Tj /F1 10 Tf (, ) Tj /F4 10 Tf ("option") Tj /F1 10 Tf (, ) Tj /F4 10 Tf ("positional") Tj /F1 10 Tf (},) Tj T* 0 Tw 1.711163 Tw /F4 10 Tf (abbrev ) Tj /F1 10 Tf (is a one-character string, ) Tj /F4 10 Tf (type ) Tj /F1 10 Tf (is a callable taking a string in input, ) Tj /F4 10 Tf (choices ) Tj /F1 10 Tf (is a discrete) Tj T* 0 Tw (sequence of values and ) Tj /F4 10 Tf (metavar ) Tj /F1 10 Tf (is a string.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 438.8236 cm
+1 0 0 1 62.69291 482.8236 cm
q
BT 1 0 0 1 0 16.82 Tm 1.05061 Tw 12 TL /F4 10 Tf 0 0 0 rg (type ) Tj /F1 10 Tf (is used to automagically convert the command line arguments from the string type to any Python) Tj T* 0 Tw (type; by default there is no convertion and ) Tj /F4 10 Tf (type=None) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 408.8236 cm
+1 0 0 1 62.69291 452.8236 cm
q
BT 1 0 0 1 0 16.82 Tm 2.904692 Tw 12 TL /F4 10 Tf 0 0 0 rg (choices ) Tj /F1 10 Tf (is used to restrict the number of the valid options; by default there is no restriction i.e.) Tj T* 0 Tw /F4 10 Tf (choices=None) Tj /F1 10 Tf (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 366.8236 cm
+1 0 0 1 62.69291 410.8236 cm
q
BT 1 0 0 1 0 28.82 Tm 1.071751 Tw 12 TL /F4 10 Tf 0 0 0 rg (metavar ) Tj /F1 10 Tf (is used to change the argument name in the usage message \(and only there\); by default the) Tj T* 0 Tw 1.056654 Tw (metavar is ) Tj /F4 10 Tf (None) Tj /F1 10 Tf (: this means that the name in the usage message is the same as the argument name,) Tj T* 0 Tw (unless the argument has a default and in such a case is equal to the stringified form of the default.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 348.8236 cm
+1 0 0 1 62.69291 392.8236 cm
q
BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 0 rg (Here is an example showing many of the features \(taken from the ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (documentation\):) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 140.4467 cm
+1 0 0 1 62.69291 184.4467 cm
q
q
.976496 0 0 .976496 0 0 cm
@@ -3928,13 +4073,34 @@ Q
Q
Q
q
-1 0 0 1 62.69291 120.4467 cm
+1 0 0 1 62.69291 164.4467 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Here is the usage:) Tj T* ET
Q
Q
q
+1 0 0 1 62.69291 95.24669 cm
+q
+q
+1 0 0 1 0 0 cm
+q
+1 0 0 1 6.6 6.6 cm
+q
+.662745 .662745 .662745 RG
+.5 w
+.960784 .960784 .862745 rg
+n -6 -6 468.6898 60 re B*
+Q
+q
+0 0 0 rg
+BT 1 0 0 1 0 41.71 Tm /F4 10 Tf 12 TL (usage: example10.py [-h] {add,mul} [n [n ...]]) Tj T* T* (A script to add and multiply numbers) Tj T* T* ET
+Q
+Q
+Q
+Q
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -3945,14 +4111,14 @@ Q
endstream
endobj
-% 'R167': class PDFStream
-167 0 obj
+% 'R176': class PDFStream
+176 0 obj
% page stream
-<< /Length 3563 >>
+<< /Length 3577 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 631.8236 cm
+1 0 0 1 62.69291 679.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -3962,24 +4128,24 @@ q
.662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 132 re B*
+n -6 -6 468.6898 84 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 113.71 Tm /F4 10 Tf 12 TL (usage: example10.py [-h] {add,mul} [n [n ...]]) Tj T* T* (A script to add and multiply numbers) Tj T* T* (positional arguments:) Tj T* ( {add,mul} The name of an operator) Tj T* ( n A number) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
+BT 1 0 0 1 0 65.71 Tm /F4 10 Tf 12 TL (positional arguments:) Tj T* ( {add,mul} The name of an operator) Tj T* ( n A number) Tj T* T* (optional arguments:) Tj T* ( -h, --help show this help message and exit) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 599.8236 cm
+1 0 0 1 62.69291 647.8236 cm
q
BT 1 0 0 1 0 16.82 Tm .15186 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that the docstring of the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function has been automatically added to the usage message. Here) Tj T* 0 Tw (are a couple of examples of use:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 506.4849 cm
+1 0 0 1 62.69291 554.4849 cm
q
q
.87797 0 0 .87797 0 0 cm
@@ -4000,19 +4166,19 @@ Q
Q
Q
q
-1 0 0 1 62.69291 473.4849 cm
+1 0 0 1 62.69291 521.4849 cm
q
-BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (A more realistic example) Tj T* ET
+BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (A realistic example) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 431.4849 cm
+1 0 0 1 62.69291 479.4849 cm
q
BT 1 0 0 1 0 28.82 Tm 1.234488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here is a more realistic script using most of the features of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (to run SQL queries on a database by) Tj T* 0 Tw .930697 Tw (relying on ) Tj 0 0 .501961 rg (SQLAlchemy) Tj 0 0 0 rg (. Notice the usage of the ) Tj /F4 10 Tf (type ) Tj /F1 10 Tf (feature to automagically convert a SQLAlchemy) Tj T* 0 Tw (connection string into a ) Tj 0 0 .501961 rg (SqlSoup ) Tj 0 0 0 rg (object:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 98.2849 cm
+1 0 0 1 62.69291 146.2849 cm
q
q
1 0 0 1 0 0 cm
@@ -4033,6 +4199,13 @@ Q
Q
Q
q
+1 0 0 1 62.69291 126.2849 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Here is the usage message:) Tj T* ET
+Q
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -4043,21 +4216,14 @@ Q
endstream
endobj
-% 'R168': class PDFStream
-168 0 obj
+% 'R177': class PDFStream
+177 0 obj
% page stream
-<< /Length 5765 >>
+<< /Length 5637 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 753.0236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (Here is the usage message:) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 563.8236 cm
+1 0 0 1 62.69291 583.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -4078,31 +4244,31 @@ Q
Q
Q
q
-1 0 0 1 62.69291 530.8236 cm
+1 0 0 1 62.69291 550.8236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Advanced usage) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 500.8236 cm
+1 0 0 1 62.69291 520.8236 cm
q
BT 1 0 0 1 0 16.82 Tm .094988 Tw 12 TL /F1 10 Tf 0 0 .501961 rg (plac ) Tj 0 0 0 rg (relies on a ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (for all of the heavy lifting work and it is possible to leverage on ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (features) Tj T* 0 Tw (directly or indirectly.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 458.8236 cm
+1 0 0 1 62.69291 478.8236 cm
q
BT 1 0 0 1 0 28.82 Tm 5.575697 Tw 12 TL /F1 10 Tf 0 0 0 rg (For instance, you can make invisible an argument in the usage message simply by using) Tj T* 0 Tw 1.435976 Tw /F4 10 Tf ('==SUPPRESS==' ) Tj /F1 10 Tf (as help string \(or ) Tj /F4 10 Tf (argparse.SUPPRESS) Tj /F1 10 Tf (\). Similarly, you can use ) Tj 0 0 .501961 rg (argparse.FileType) Tj T* 0 Tw 0 0 0 rg (directly.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 404.8236 cm
+1 0 0 1 62.69291 424.8236 cm
q
BT 1 0 0 1 0 40.82 Tm 1.639213 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is also possible to pass options to the underlying ) Tj /F4 10 Tf (argparse.ArgumentParser ) Tj /F1 10 Tf (object \(currently it) Tj T* 0 Tw .285529 Tw (accepts the default arguments ) Tj /F4 10 Tf (description) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (epilog) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (prog) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (usage) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (add_help) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (argument_default) Tj /F1 10 Tf (,) Tj T* 0 Tw 1.439953 Tw /F4 10 Tf (parents) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (prefix_chars) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (fromfile_prefix_chars) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (conflict_handler) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (formatter_class) Tj /F1 10 Tf (\). It) Tj T* 0 Tw (is enough to set such attributes on the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function. For instance) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 335.6236 cm
+1 0 0 1 62.69291 355.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -4123,13 +4289,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 255.6236 cm
+1 0 0 1 62.69291 275.6236 cm
q
BT 1 0 0 1 0 64.82 Tm 1.256457 Tw 12 TL /F1 10 Tf 0 0 0 rg (disable the recognition of the help flag ) Tj /F4 10 Tf (-h, --help) Tj /F1 10 Tf (. This is not particularly elegant, but I assume the) Tj T* 0 Tw .275703 Tw (typical user of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (will be happy with the defaults and would not want to change them; still it is possible if) Tj T* 0 Tw .365542 Tw (she wants to. For instance, by setting the ) Tj /F4 10 Tf (description ) Tj /F1 10 Tf (attribute, it is possible to add a comment to the) Tj T* 0 Tw .602339 Tw (usage message \(by default the docstring of the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function is used as description\). It is also possible) Tj T* 0 Tw .322988 Tw (to change the option prefix; for instance if your script must run under Windows and you want to use "/" as) Tj T* 0 Tw (option prefix you can add the lines:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 210.4236 cm
+1 0 0 1 62.69291 230.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -4150,13 +4316,13 @@ Q
Q
Q
q
-1 0 0 1 62.69291 142.4236 cm
+1 0 0 1 62.69291 162.4236 cm
q
BT 1 0 0 1 0 52.82 Tm 3.694269 Tw 12 TL /F1 10 Tf 0 0 0 rg (The recognition of the ) Tj /F4 10 Tf (short_prefix ) Tj /F1 10 Tf (attribute is a ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (extension; there is also a companion) Tj T* 0 Tw 1.348314 Tw /F4 10 Tf (long_prefix ) Tj /F1 10 Tf (attribute with default value of ) Tj /F4 10 Tf ("--") Tj /F1 10 Tf (. ) Tj /F4 10 Tf (prefix_chars ) Tj /F1 10 Tf (is an ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (feature. Interested) Tj T* 0 Tw 1.419984 Tw (readers should read the documentation of ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (to understand the meaning of the other options. If) Tj T* 0 Tw .098935 Tw (there is a set of options that you use very often, you may consider writing a decorator adding such options) Tj T* 0 Tw (to the ) Tj /F4 10 Tf (main ) Tj /F1 10 Tf (function for you. For simplicity, ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (does not perform any magic of that kind.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 112.4236 cm
+1 0 0 1 62.69291 132.4236 cm
q
BT 1 0 0 1 0 16.82 Tm 7.709147 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is possible to access directly the underlying ) Tj 0 0 .501961 rg (ArgumentParser ) Tj 0 0 0 rg (object, by invoking the) Tj T* 0 Tw /F4 10 Tf (plac.parser_from ) Tj /F1 10 Tf (utility function:) Tj T* ET
Q
@@ -4172,8 +4338,8 @@ Q
endstream
endobj
-% 'R169': class PDFStream
-169 0 obj
+% 'R178': class PDFStream
+178 0 obj
% page stream
<< /Length 3882 >>
stream
@@ -4311,10 +4477,10 @@ Q
endstream
endobj
-% 'R170': class PDFStream
-170 0 obj
+% 'R179': class PDFStream
+179 0 obj
% page stream
-<< /Length 8313 >>
+<< /Length 9425 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -4551,6 +4717,50 @@ BT 1 0 0 1 0 40.82 Tm 2.14683 Tw 12 TL /F1 10 Tf 0 0 0 rg (I should stress again
Q
Q
q
+1 0 0 1 62.69291 161.8236 cm
+q
+BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (plac vs the rest of the world) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 119.8236 cm
+q
+BT 1 0 0 1 0 28.82 Tm 1.866905 Tw 12 TL /F1 10 Tf 0 0 0 rg (Originally ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (boasted about being "the easiest command-line arguments parser in the world". Since) Tj T* 0 Tw .306457 Tw (then, people started pointing out to me various projects which are based on the same idea \(extracting the) Tj T* 0 Tw (parser from the main function signature\) and are arguably even easier than ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 113.8236 cm
+Q
+q
+1 0 0 1 62.69291 113.8236 cm
+Q
+q
+1 0 0 1 62.69291 95.82362 cm
+0 0 0 rg
+BT /F3 10 Tf 12 TL ET
+q
+1 0 0 1 6 3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 3 cm
+q
+BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (opterator ) Tj 0 0 0 rg (by Dusty Phillips) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 95.82362 cm
+Q
+q
+1 0 0 1 62.69291 95.82362 cm
+Q
+q
1 0 0 1 56.69291 56.69291 cm
q
0 0 0 rg
@@ -4561,44 +4771,76 @@ Q
endstream
endobj
-% 'R171': class PDFStream
-171 0 obj
+% 'R180': class PDFStream
+180 0 obj
% page stream
-<< /Length 4734 >>
+<< /Length 5487 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 744.0236 cm
+1 0 0 1 62.69291 747.0236 cm
+0 0 0 rg
+BT /F3 10 Tf 12 TL ET
+q
+1 0 0 1 6 3 cm
+q
+0 0 0 rg
+BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL 10.5 0 Td (\177) Tj T* -10.5 0 Td ET
+Q
+Q
+q
+1 0 0 1 23 3 cm
+q
+BT 1 0 0 1 0 4.82 Tm 12 TL /F1 10 Tf 0 0 .501961 rg (CLIArgs ) Tj 0 0 0 rg (by Pavel Panchekha) Tj T* ET
+Q
+Q
+q
+Q
+Q
+q
+1 0 0 1 62.69291 747.0236 cm
+Q
+q
+1 0 0 1 62.69291 747.0236 cm
+Q
+q
+1 0 0 1 62.69291 717.0236 cm
+q
+BT 1 0 0 1 0 16.82 Tm 2.136457 Tw 12 TL /F1 10 Tf 0 0 0 rg (Luckily for me none of such projects had the idea of using function annotations and ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (; as a) Tj T* 0 Tw (consequence, they are no match for the capabilities of ) Tj 0 0 .501961 rg (plac) Tj 0 0 0 rg (.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 684.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (The future) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 666.0236 cm
+1 0 0 1 62.69291 606.0236 cm
q
BT 1 0 0 1 0 64.82 Tm .444431 Tw 12 TL /F1 10 Tf 0 0 0 rg (Currently plac is below 100 lines of code, not counting blanks, comments and docstrings. I do not plan to) Tj T* 0 Tw .035444 Tw (extend it much in the future. The idea is to keep the module short: it is and it should remain a little wrapper) Tj T* 0 Tw 1.903318 Tw (over ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (. Actually I have thought about contributing the code back to ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (if ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (becomes) Tj T* 0 Tw 4.105697 Tw (successfull and gains a reasonable number of users. For the moment it should be considered) Tj T* 0 Tw .351654 Tw (experimental: after all I wrote it in three days, including the tests, the documentation and the time to learn) Tj T* 0 Tw 0 0 .501961 rg (argparse) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 633.0236 cm
+1 0 0 1 62.69291 573.0236 cm
q
BT 1 0 0 1 0 8.435 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Trivia: the story behind the name) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 567.0236 cm
+1 0 0 1 62.69291 507.0236 cm
q
BT 1 0 0 1 0 52.82 Tm .942651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (project started very humble: I just wanted to make easy_installable my old ) Tj 0 0 .501961 rg (optionparse ) Tj 0 0 0 rg (recipe,) Tj T* 0 Tw .565988 Tw (and to publish it on PyPI. The original name of ) Tj 0 0 .501961 rg (plac ) Tj 0 0 0 rg (was optionparser and the idea behind it was to build) Tj T* 0 Tw .603735 Tw (an ) Tj 0 0 .501961 rg (OptionParser ) Tj 0 0 0 rg (object from the docstring of the module. However, before doing that, I decided to check) Tj T* 0 Tw .244198 Tw (out the ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (module, since I knew it was going into Python 2.7 and Python 2.7 was coming out. Soon) Tj T* 0 Tw (enough I realized two things:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 561.0236 cm
+1 0 0 1 62.69291 501.0236 cm
Q
q
-1 0 0 1 62.69291 561.0236 cm
+1 0 0 1 62.69291 501.0236 cm
Q
q
-1 0 0 1 62.69291 531.0236 cm
+1 0 0 1 62.69291 471.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -4618,13 +4860,13 @@ q
Q
Q
q
-1 0 0 1 62.69291 531.0236 cm
+1 0 0 1 62.69291 471.0236 cm
Q
q
-1 0 0 1 62.69291 531.0236 cm
+1 0 0 1 62.69291 471.0236 cm
Q
q
-1 0 0 1 62.69291 501.0236 cm
+1 0 0 1 62.69291 441.0236 cm
0 0 0 rg
BT /F3 10 Tf 12 TL ET
q
@@ -4645,32 +4887,32 @@ q
Q
Q
q
-1 0 0 1 62.69291 501.0236 cm
+1 0 0 1 62.69291 441.0236 cm
Q
q
-1 0 0 1 62.69291 501.0236 cm
+1 0 0 1 62.69291 441.0236 cm
Q
q
-1 0 0 1 62.69291 447.0236 cm
+1 0 0 1 62.69291 387.0236 cm
q
BT 1 0 0 1 0 40.82 Tm .600574 Tw 12 TL /F1 10 Tf 0 0 0 rg (Putting together these two observations with the original idea of inferring the parser I decided to build an) Tj T* 0 Tw .516905 Tw 0 0 .501961 rg (ArgumentParser ) Tj 0 0 0 rg (object from function annotations. The ) Tj /F4 10 Tf (optionparser ) Tj /F1 10 Tf (name was ruled out, since I was) Tj T* 0 Tw 2.085984 Tw (now using ) Tj 0 0 .501961 rg (argparse) Tj 0 0 0 rg (; a name like ) Tj /F4 10 Tf (argparse_plus ) Tj /F1 10 Tf (was also ruled out, since the typical usage was) Tj T* 0 Tw (completely different from the ) Tj 0 0 .501961 rg (argparse ) Tj 0 0 0 rg (usage.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 417.0236 cm
+1 0 0 1 62.69291 357.0236 cm
q
BT 1 0 0 1 0 16.82 Tm 1.093876 Tw 12 TL /F1 10 Tf 0 0 0 rg (I made a research on PyPI and the name plac \(Command Line Arguments Parser\) was not taken, so I) Tj T* 0 Tw (renamed everything to plac. After two days a ) Tj 0 0 .501961 rg (Clap ) Tj 0 0 0 rg (module appeared on PyPI <) Tj (expletives deleted) Tj (>) Tj (!) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 387.0236 cm
+1 0 0 1 62.69291 327.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 16.82 Tm /F1 10 Tf 12 TL .877209 Tw (Having little imagination, I decided to rename everything again to plac, an anagram of plac: since it is a) Tj T* 0 Tw (non-existing English name, I hope nobody will steal it from me!) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 369.0236 cm
+1 0 0 1 62.69291 309.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 4.82 Tm /F1 10 Tf 12 TL (That's all, I hope you will enjoy working with plac!) Tj T* ET
@@ -4687,116 +4929,116 @@ Q
endstream
endobj
-% 'R172': class PDFPageLabels
-172 0 obj
+% 'R181': class PDFPageLabels
+181 0 obj
% Document Root
<< /Nums [ 0
- 173 0 R
+ 182 0 R
1
- 174 0 R
+ 183 0 R
2
- 175 0 R
+ 184 0 R
3
- 176 0 R
+ 185 0 R
4
- 177 0 R
+ 186 0 R
5
- 178 0 R
+ 187 0 R
6
- 179 0 R
+ 188 0 R
7
- 180 0 R
+ 189 0 R
8
- 181 0 R
+ 190 0 R
9
- 182 0 R
+ 191 0 R
10
- 183 0 R
+ 192 0 R
11
- 184 0 R
+ 193 0 R
12
- 185 0 R ] >>
+ 194 0 R ] >>
endobj
-% 'R173': class PDFPageLabel
-173 0 obj
+% 'R182': class PDFPageLabel
+182 0 obj
% None
<< /S /D
/St 1 >>
endobj
-% 'R174': class PDFPageLabel
-174 0 obj
+% 'R183': class PDFPageLabel
+183 0 obj
% None
<< /S /D
/St 2 >>
endobj
-% 'R175': class PDFPageLabel
-175 0 obj
+% 'R184': class PDFPageLabel
+184 0 obj
% None
<< /S /D
/St 3 >>
endobj
-% 'R176': class PDFPageLabel
-176 0 obj
+% 'R185': class PDFPageLabel
+185 0 obj
% None
<< /S /D
/St 4 >>
endobj
-% 'R177': class PDFPageLabel
-177 0 obj
+% 'R186': class PDFPageLabel
+186 0 obj
% None
<< /S /D
/St 5 >>
endobj
-% 'R178': class PDFPageLabel
-178 0 obj
+% 'R187': class PDFPageLabel
+187 0 obj
% None
<< /S /D
/St 6 >>
endobj
-% 'R179': class PDFPageLabel
-179 0 obj
+% 'R188': class PDFPageLabel
+188 0 obj
% None
<< /S /D
/St 7 >>
endobj
-% 'R180': class PDFPageLabel
-180 0 obj
+% 'R189': class PDFPageLabel
+189 0 obj
% None
<< /S /D
/St 8 >>
endobj
-% 'R181': class PDFPageLabel
-181 0 obj
+% 'R190': class PDFPageLabel
+190 0 obj
% None
<< /S /D
/St 9 >>
endobj
-% 'R182': class PDFPageLabel
-182 0 obj
+% 'R191': class PDFPageLabel
+191 0 obj
% None
<< /S /D
/St 10 >>
endobj
-% 'R183': class PDFPageLabel
-183 0 obj
+% 'R192': class PDFPageLabel
+192 0 obj
% None
<< /S /D
/St 11 >>
endobj
-% 'R184': class PDFPageLabel
-184 0 obj
+% 'R193': class PDFPageLabel
+193 0 obj
% None
<< /S /D
/St 12 >>
endobj
-% 'R185': class PDFPageLabel
-185 0 obj
+% 'R194': class PDFPageLabel
+194 0 obj
% None
<< /S /D
/St 13 >>
endobj
xref
-0 186
+0 195
0000000000 65535 f
0000000113 00000 n
0000000258 00000 n
@@ -4832,165 +5074,174 @@ xref
0000007303 00000 n
0000007547 00000 n
0000007791 00000 n
-0000008034 00000 n
-0000008296 00000 n
-0000008559 00000 n
-0000008809 00000 n
-0000009058 00000 n
-0000009324 00000 n
-0000009576 00000 n
-0000009811 00000 n
-0000010440 00000 n
-0000010692 00000 n
-0000010942 00000 n
-0000011194 00000 n
-0000011444 00000 n
-0000011696 00000 n
-0000011947 00000 n
-0000012186 00000 n
-0000012381 00000 n
-0000012642 00000 n
-0000012906 00000 n
-0000013140 00000 n
-0000013539 00000 n
-0000013791 00000 n
-0000014043 00000 n
-0000014294 00000 n
-0000014544 00000 n
-0000014781 00000 n
-0000015135 00000 n
-0000015384 00000 n
-0000015636 00000 n
-0000015888 00000 n
-0000016125 00000 n
-0000016470 00000 n
-0000016722 00000 n
-0000017010 00000 n
-0000017298 00000 n
-0000017550 00000 n
-0000017838 00000 n
-0000018075 00000 n
-0000018438 00000 n
-0000018690 00000 n
-0000018942 00000 n
-0000019179 00000 n
-0000019515 00000 n
-0000019752 00000 n
-0000020070 00000 n
-0000020322 00000 n
-0000020572 00000 n
-0000020822 00000 n
-0000021072 00000 n
-0000021324 00000 n
-0000021559 00000 n
-0000021922 00000 n
-0000022174 00000 n
-0000022420 00000 n
-0000022682 00000 n
-0000023018 00000 n
-0000023269 00000 n
-0000023519 00000 n
-0000023769 00000 n
-0000024085 00000 n
-0000024335 00000 n
-0000024587 00000 n
-0000024836 00000 n
-0000025086 00000 n
-0000025338 00000 n
-0000025611 00000 n
-0000026011 00000 n
-0000026250 00000 n
-0000026570 00000 n
-0000026822 00000 n
-0000027073 00000 n
-0000027324 00000 n
-0000027577 00000 n
-0000027842 00000 n
-0000028093 00000 n
-0000028358 00000 n
-0000028609 00000 n
-0000028862 00000 n
-0000029113 00000 n
-0000029366 00000 n
-0000029617 00000 n
-0000029870 00000 n
-0000030122 00000 n
-0000030375 00000 n
-0000030629 00000 n
-0000030883 00000 n
-0000031137 00000 n
-0000031391 00000 n
-0000031643 00000 n
-0000031896 00000 n
-0000032185 00000 n
-0000032422 00000 n
-0000032963 00000 n
-0000033215 00000 n
-0000033466 00000 n
-0000033720 00000 n
-0000033972 00000 n
-0000034226 00000 n
-0000034513 00000 n
-0000034767 00000 n
-0000035078 00000 n
-0000035330 00000 n
-0000035582 00000 n
-0000035871 00000 n
-0000036123 00000 n
-0000036375 00000 n
-0000036618 00000 n
-0000037055 00000 n
-0000037219 00000 n
-0000037554 00000 n
-0000037683 00000 n
-0000037877 00000 n
-0000038088 00000 n
-0000038298 00000 n
-0000038498 00000 n
-0000038696 00000 n
-0000038901 00000 n
-0000039094 00000 n
-0000039298 00000 n
-0000039493 00000 n
-0000039700 00000 n
-0000039898 00000 n
-0000040090 00000 n
-0000040273 00000 n
-0000040496 00000 n
-0000048871 00000 n
-0000054323 00000 n
-0000058359 00000 n
-0000062714 00000 n
-0000068012 00000 n
-0000073565 00000 n
-0000078027 00000 n
-0000083687 00000 n
-0000087353 00000 n
-0000093221 00000 n
-0000097206 00000 n
-0000105622 00000 n
-0000110463 00000 n
-0000110730 00000 n
-0000110809 00000 n
-0000110888 00000 n
-0000110967 00000 n
-0000111046 00000 n
-0000111125 00000 n
-0000111204 00000 n
-0000111283 00000 n
-0000111362 00000 n
-0000111441 00000 n
-0000111521 00000 n
-0000111601 00000 n
-0000111681 00000 n
+0000008035 00000 n
+0000008279 00000 n
+0000008522 00000 n
+0000008784 00000 n
+0000009047 00000 n
+0000009297 00000 n
+0000009546 00000 n
+0000009812 00000 n
+0000010064 00000 n
+0000010314 00000 n
+0000010566 00000 n
+0000010816 00000 n
+0000011068 00000 n
+0000011303 00000 n
+0000011986 00000 n
+0000012238 00000 n
+0000012489 00000 n
+0000012728 00000 n
+0000012923 00000 n
+0000013184 00000 n
+0000013448 00000 n
+0000013682 00000 n
+0000014045 00000 n
+0000014297 00000 n
+0000014549 00000 n
+0000014800 00000 n
+0000015050 00000 n
+0000015287 00000 n
+0000015641 00000 n
+0000015890 00000 n
+0000016142 00000 n
+0000016394 00000 n
+0000016631 00000 n
+0000016976 00000 n
+0000017228 00000 n
+0000017516 00000 n
+0000017804 00000 n
+0000018056 00000 n
+0000018344 00000 n
+0000018581 00000 n
+0000018944 00000 n
+0000019196 00000 n
+0000019448 00000 n
+0000019685 00000 n
+0000020021 00000 n
+0000020258 00000 n
+0000020576 00000 n
+0000020828 00000 n
+0000021078 00000 n
+0000021328 00000 n
+0000021578 00000 n
+0000021830 00000 n
+0000022065 00000 n
+0000022428 00000 n
+0000022680 00000 n
+0000022926 00000 n
+0000023188 00000 n
+0000023524 00000 n
+0000023775 00000 n
+0000024025 00000 n
+0000024275 00000 n
+0000024591 00000 n
+0000024841 00000 n
+0000025093 00000 n
+0000025342 00000 n
+0000025592 00000 n
+0000025845 00000 n
+0000026119 00000 n
+0000026521 00000 n
+0000026760 00000 n
+0000027080 00000 n
+0000027332 00000 n
+0000027583 00000 n
+0000027834 00000 n
+0000028087 00000 n
+0000028352 00000 n
+0000028603 00000 n
+0000028868 00000 n
+0000029119 00000 n
+0000029372 00000 n
+0000029623 00000 n
+0000029876 00000 n
+0000030128 00000 n
+0000030382 00000 n
+0000030634 00000 n
+0000030887 00000 n
+0000031141 00000 n
+0000031395 00000 n
+0000031649 00000 n
+0000031903 00000 n
+0000032155 00000 n
+0000032408 00000 n
+0000032697 00000 n
+0000032949 00000 n
+0000033203 00000 n
+0000033457 00000 n
+0000033701 00000 n
+0000034272 00000 n
+0000034529 00000 n
+0000034781 00000 n
+0000035035 00000 n
+0000035287 00000 n
+0000035538 00000 n
+0000035792 00000 n
+0000036044 00000 n
+0000036298 00000 n
+0000036585 00000 n
+0000036839 00000 n
+0000037150 00000 n
+0000037402 00000 n
+0000037654 00000 n
+0000037943 00000 n
+0000038195 00000 n
+0000038447 00000 n
+0000038690 00000 n
+0000039157 00000 n
+0000039321 00000 n
+0000039595 00000 n
+0000039724 00000 n
+0000039918 00000 n
+0000040129 00000 n
+0000040339 00000 n
+0000040539 00000 n
+0000040737 00000 n
+0000040942 00000 n
+0000041135 00000 n
+0000041334 00000 n
+0000041529 00000 n
+0000041736 00000 n
+0000041934 00000 n
+0000042145 00000 n
+0000042337 00000 n
+0000042520 00000 n
+0000042743 00000 n
+0000051911 00000 n
+0000056935 00000 n
+0000061055 00000 n
+0000065301 00000 n
+0000070385 00000 n
+0000075955 00000 n
+0000080724 00000 n
+0000086298 00000 n
+0000089978 00000 n
+0000095718 00000 n
+0000099703 00000 n
+0000109231 00000 n
+0000114825 00000 n
+0000115092 00000 n
+0000115171 00000 n
+0000115250 00000 n
+0000115329 00000 n
+0000115408 00000 n
+0000115487 00000 n
+0000115566 00000 n
+0000115645 00000 n
+0000115724 00000 n
+0000115803 00000 n
+0000115883 00000 n
+0000115963 00000 n
+0000116043 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
- [(\305N3\010k7t\356\372\037\270\254\236\337\002\013) (\305N3\010k7t\356\372\037\270\254\236\337\002\013)]
+ [(\212\300\352\333b\3304uY\004{\325\346`L\356) (\212\300\352\333b\3304uY\004{\325\346`L\356)]
- /Info 143 0 R
- /Root 142 0 R
- /Size 186 >>
+ /Info 151 0 R
+ /Root 150 0 R
+ /Size 195 >>
startxref
-111730
+116092
%%EOF
diff --git a/plac/doc/plac.txt b/plac/doc/plac.txt
index 8e87992..9423aa0 100644
--- a/plac/doc/plac.txt
+++ b/plac/doc/plac.txt
@@ -1,5 +1,5 @@
-Parsing the Command Line the Easy Way: Introducing plac, the Easiest Argument Parser in the Python World
-==========================================================================================================
+Plac: Parsing the Command Line the Easy Way
+=====================================================================
:Author: Michele Simionato
:E-mail: michele.simionato@gmail.com
@@ -412,7 +412,7 @@ to the usage message. Here are a couple of examples of use::
usage: example10.py [-h] {add,mul} [n [n ...]]
example10.py: error: argument operator: invalid choice: 'ad' (choose from 'add', 'mul')
-A more realistic example
+A realistic example
---------------------------------------
Here is a more realistic script using most of the features of plac_ to
@@ -596,6 +596,22 @@ is then available to you: you can use ``add_argument``, ``add_subparsers()``,
etc. In other words, while some features are not supported directly,
*all* features are supported indirectly.
+plac vs the rest of the world
+------------------------------------------
+
+Originally plac_ boasted about being "the easiest command-line
+arguments parser in the world". Since then, people started pointing
+out to me various projects which are based on the same idea
+(extracting the parser from the main function signature) and are
+arguably even easier than plac_:
+
+- opterator_ by Dusty Phillips
+- CLIArgs_ by Pavel Panchekha
+
+Luckily for me none of such projects had the idea of using
+function annotations and argparse_; as a consequence, they are
+no match for the capabilities of plac_.
+
The future
-------------------------------
@@ -652,3 +668,5 @@ That's all, I hope you will enjoy working with plac!
.. _OptionParser: http://docs.python.org/library/optparse.html?highlight=optionparser#optparse.OptionParser
.. _SQLAlchemy: http://www.sqlalchemy.org/
.. _SqlSoup: http://www.sqlalchemy.org/docs/reference/ext/sqlsoup.html
+.. _CLIArgs: http://pypi.python.org/pypi/CLIArgs
+.. _opterator: http://pypi.python.org/pypi/opterator