diff options
author | Michele Simionato <michele.simionato@gmail.com> | 2015-07-19 19:13:36 +0200 |
---|---|---|
committer | Michele Simionato <michele.simionato@gmail.com> | 2015-07-19 19:13:36 +0200 |
commit | a4e7a82790a134ca44746de88bdc0354e90c442c (patch) | |
tree | 471fc9c4775b2a3660148e4a0c77acb58bbee788 /documentation.pdf | |
parent | cf20ab367249c9eca473d6f9989f0721e451b033 (diff) | |
download | python-decorator-git-a4e7a82790a134ca44746de88bdc0354e90c442c.tar.gz |
Simplified the concurrency example by using a Future class
Diffstat (limited to 'documentation.pdf')
-rw-r--r-- | documentation.pdf | 1634 |
1 files changed, 722 insertions, 912 deletions
diff --git a/documentation.pdf b/documentation.pdf index f518aac..cb3ebe6 100644 --- a/documentation.pdf +++ b/documentation.pdf @@ -79,64 +79,64 @@ endobj << /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 434.6236 0 ] /Rect [ 527.0227 416.7736 532.5827 428.7736 ] /Subtype /Link /Type /Annot >>
endobj
27 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 595.8236 0 ] /Rect [ 62.69291 398.0236 139.9329 410.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 336.6236 0 ] /Rect [ 62.69291 398.0236 139.9329 410.0236 ] /Subtype /Link /Type /Annot >>
endobj
28 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 595.8236 0 ] /Rect [ 527.0227 398.7736 532.5827 410.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 336.6236 0 ] /Rect [ 527.0227 398.7736 532.5827 410.7736 ] /Subtype /Link /Type /Annot >>
endobj
29 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 717.0236 0 ] /Rect [ 62.69291 380.0236 80.47291 392.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 471.8236 0 ] /Rect [ 62.69291 380.0236 80.47291 392.0236 ] /Subtype /Link /Type /Annot >>
endobj
30 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 717.0236 0 ] /Rect [ 83.25291 380.0236 161.2529 392.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 471.8236 0 ] /Rect [ 83.25291 380.0236 161.2529 392.0236 ] /Subtype /Link /Type /Annot >>
endobj
31 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 717.0236 0 ] /Rect [ 167.2529 380.0236 192.2729 392.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 471.8236 0 ] /Rect [ 167.2529 380.0236 192.2729 392.0236 ] /Subtype /Link /Type /Annot >>
endobj
32 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 717.0236 0 ] /Rect [ 521.4627 380.7736 532.5827 392.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 471.8236 0 ] /Rect [ 527.0227 380.7736 532.5827 392.7736 ] /Subtype /Link /Type /Annot >>
endobj
33 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 362.0236 177.1629 374.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 551.8236 0 ] /Rect [ 62.69291 362.0236 177.1629 374.0236 ] /Subtype /Link /Type /Annot >>
endobj
34 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 521.4627 362.7736 532.5827 374.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 551.8236 0 ] /Rect [ 521.4627 362.7736 532.5827 374.7736 ] /Subtype /Link /Type /Annot >>
endobj
35 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 294.4236 0 ] /Rect [ 62.69291 344.0236 228.2829 356.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 344.0236 228.2829 356.0236 ] /Subtype /Link /Type /Annot >>
endobj
36 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 294.4236 0 ] /Rect [ 521.4627 344.7736 532.5827 356.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 521.4627 344.7736 532.5827 356.7736 ] /Subtype /Link /Type /Annot >>
endobj
37 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 558.6236 0 ] /Rect [ 62.69291 326.0236 174.3929 338.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 335.0236 0 ] /Rect [ 62.69291 326.0236 174.3929 338.0236 ] /Subtype /Link /Type /Annot >>
endobj
38 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 558.6236 0 ] /Rect [ 521.4627 326.7736 532.5827 338.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 335.0236 0 ] /Rect [ 521.4627 326.7736 532.5827 338.7736 ] /Subtype /Link /Type /Annot >>
endobj
39 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 671.8236 0 ] /Rect [ 62.69291 308.0236 155.4829 320.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 474.6236 0 ] /Rect [ 62.69291 308.0236 155.4829 320.0236 ] /Subtype /Link /Type /Annot >>
endobj
40 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 671.8236 0 ] /Rect [ 521.4627 308.7736 532.5827 320.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 474.6236 0 ] /Rect [ 521.4627 308.7736 532.5827 320.7736 ] /Subtype /Link /Type /Annot >>
endobj
41 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 596.8236 0 ] /Rect [ 62.69291 290.0236 137.7129 302.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 399.6236 0 ] /Rect [ 62.69291 290.0236 137.7129 302.0236 ] /Subtype /Link /Type /Annot >>
endobj
42 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 596.8236 0 ] /Rect [ 521.4627 290.7736 532.5827 302.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 399.6236 0 ] /Rect [ 521.4627 290.7736 532.5827 302.7736 ] /Subtype /Link /Type /Annot >>
endobj
43 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 173.8236 0 ] /Rect [ 62.69291 272.0236 106.0329 284.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 663.0236 0 ] /Rect [ 62.69291 272.0236 106.0329 284.0236 ] /Subtype /Link /Type /Annot >>
endobj
44 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 173.8236 0 ] /Rect [ 521.4627 272.7736 532.5827 284.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 663.0236 0 ] /Rect [ 521.4627 272.7736 532.5827 284.7736 ] /Subtype /Link /Type /Annot >>
endobj
45 0 obj
<< /Annots [ 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R
15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R
25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R
- 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R ] /Contents 95 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R ] /Contents 94 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
46 0 obj
@@ -155,156 +155,152 @@ endobj << /A << /S /URI /Type /Action /URI (https://docs.python.org/3/library/functools.html#functools.update_wrapper) >> /Border [ 0 0 0 ] /Rect [ 151.0486 111.8236 267.91 123.8236 ] /Subtype /Link /Type /Annot >>
endobj
51 0 obj
-<< /Annots [ 47 0 R 50 0 R ] /Contents 96 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 47 0 R 50 0 R ] /Contents 95 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
52 0 obj
-<< /Contents 97 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 96 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
53 0 obj
-<< /Contents 98 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 97 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
54 0 obj
<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-3107/) >> /Border [ 0 0 0 ] /Rect [ 231.6368 527.6236 323.0741 539.6236 ] /Subtype /Link /Type /Annot >>
endobj
55 0 obj
-<< /Annots [ 54 0 R ] /Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 54 0 R ] /Contents 98 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
56 0 obj
-<< /Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
57 0 obj
-<< /Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
58 0 obj
-<< /Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
59 0 obj
-<< /Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
60 0 obj
-<< /Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
- /Type /Page >>
+<< /A << /S /URI /Type /Action /URI (http://bugs.python.org/issue1764286) >> /Border [ 0 0 0 ] /Rect [ 137.6966 246.4236 178.0879 258.4236 ] /Subtype /Link /Type /Annot >>
endobj
61 0 obj
-<< /A << /S /URI /Type /Action /URI (http://bugs.python.org/issue1764286) >> /Border [ 0 0 0 ] /Rect [ 137.6966 459.6236 178.0879 471.6236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 60 0 R ] /Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
62 0 obj
-<< /Annots [ 61 0 R ] /Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
- /Trans << >> /Type /Page >>
+<< /A << /S /URI /Type /Action /URI (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) >> /Border [ 0 0 0 ] /Rect [ 62.69291 444.8236 363.4029 456.8236 ] /Subtype /Link /Type /Annot >>
endobj
63 0 obj
-<< /A << /S /URI /Type /Action /URI (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) >> /Border [ 0 0 0 ] /Rect [ 62.69291 645.0236 363.4029 657.0236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 62 0 R ] /Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
64 0 obj
-<< /Annots [ 63 0 R ] /Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
- /Trans << >> /Type /Page >>
+<< /Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
65 0 obj
-<< /Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
- /Type /Page >>
+<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 248.2236 317.8397 260.2236 ] /Subtype /Link /Type /Annot >>
endobj
66 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 444.6236 317.8397 456.6236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 65 0 R ] /Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
67 0 obj
-<< /Annots [ 66 0 R ] /Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
- /Trans << >> /Type /Page >>
+<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-3107/) >> /Border [ 0 0 0 ] /Rect [ 384.6306 276.6236 474.9013 288.6236 ] /Subtype /Link /Type /Annot >>
endobj
68 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-3107/) >> /Border [ 0 0 0 ] /Rect [ 384.6306 473.8236 474.9013 485.8236 ] /Subtype /Link /Type /Annot >>
+<< /A << /S /URI /Type /Action /URI (http://docutils.sourceforge.net/) >> /Border [ 0 0 0 ] /Rect [ 476.7077 252.6236 513.1227 264.6236 ] /Subtype /Link /Type /Annot >>
endobj
69 0 obj
-<< /A << /S /URI /Type /Action /URI (http://docutils.sourceforge.net/) >> /Border [ 0 0 0 ] /Rect [ 476.7077 449.8236 513.1227 461.8236 ] /Subtype /Link /Type /Annot >>
+<< /A << /S /URI /Type /Action /URI (http://pygments.org/) >> /Border [ 0 0 0 ] /Rect [ 62.69291 240.6236 106.0429 252.6236 ] /Subtype /Link /Type /Annot >>
endobj
70 0 obj
-<< /A << /S /URI /Type /Action /URI (http://pygments.org/) >> /Border [ 0 0 0 ] /Rect [ 62.69291 437.8236 106.0429 449.8236 ] /Subtype /Link /Type /Annot >>
+<< /A << /S /URI /Type /Action /URI (http://www.phyast.pitt.edu/~micheles/python/documentation.html#class-decorators-and-decorator-factories) >> /Border [ 0 0 0 ] /Rect [ 364.2921 102.6236 535.3627 114.6236 ] /Subtype /Link /Type /Annot >>
endobj
71 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.phyast.pitt.edu/~micheles/python/documentation.html#class-decorators-and-decorator-factories) >> /Border [ 0 0 0 ] /Rect [ 364.2921 299.8236 531.64 311.8236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 67 0 R 68 0 R 69 0 R 70 0 R ] /Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
72 0 obj
-<< /Annots [ 68 0 R 69 0 R 70 0 R 71 0 R ] /Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
- /Trans << >> /Type /Page >>
+<< /Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 93 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
73 0 obj
-<< /Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 94 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
- /Type /Page >>
+<< /Outlines 75 0 R /PageLabels 109 0 R /PageMode /UseNone /Pages 93 0 R /Type /Catalog >>
endobj
74 0 obj
-<< /Outlines 76 0 R /PageLabels 111 0 R /PageMode /UseNone /Pages 94 0 R /Type /Catalog >>
+<< /Author (Michele Simionato) /CreationDate (D:20150719191227-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
+ /Title (The decorator module) >>
endobj
75 0 obj
-<< /Author (Michele Simionato) /CreationDate (D:20150719093323-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
- /Title (The decorator module) >>
+<< /Count 17 /First 76 0 R /Last 92 0 R /Type /Outlines >>
endobj
76 0 obj
-<< /Count 17 /First 77 0 R /Last 93 0 R /Type /Outlines >>
+<< /Dest [ 45 0 R /XYZ 62.69291 257.0236 0 ] /Next 77 0 R /Parent 75 0 R /Title (Introduction) >>
endobj
77 0 obj
-<< /Dest [ 45 0 R /XYZ 62.69291 257.0236 0 ] /Next 78 0 R /Parent 76 0 R /Title (Introduction) >>
+<< /Dest [ 51 0 R /XYZ 62.69291 633.0236 0 ] /Next 78 0 R /Parent 75 0 R /Prev 76 0 R /Title (Definitions) >>
endobj
78 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 633.0236 0 ] /Next 79 0 R /Parent 76 0 R /Prev 77 0 R /Title (Definitions) >>
+<< /Dest [ 51 0 R /XYZ 62.69291 396.0236 0 ] /Next 79 0 R /Parent 75 0 R /Prev 77 0 R /Title (Statement of the problem) >>
endobj
79 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 396.0236 0 ] /Next 80 0 R /Parent 76 0 R /Prev 78 0 R /Title (Statement of the problem) >>
+<< /Dest [ 52 0 R /XYZ 62.69291 397.4236 0 ] /Next 80 0 R /Parent 75 0 R /Prev 78 0 R /Title (The solution) >>
endobj
80 0 obj
-<< /Dest [ 52 0 R /XYZ 62.69291 397.4236 0 ] /Next 81 0 R /Parent 76 0 R /Prev 79 0 R /Title (The solution) >>
+<< /Dest [ 53 0 R /XYZ 62.69291 435.4236 0 ] /Next 81 0 R /Parent 75 0 R /Prev 79 0 R /Title (A trace decorator) >>
endobj
81 0 obj
-<< /Dest [ 53 0 R /XYZ 62.69291 435.4236 0 ] /Next 82 0 R /Parent 76 0 R /Prev 80 0 R /Title (A trace decorator) >>
+<< /Dest [ 55 0 R /XYZ 62.69291 566.6236 0 ] /Next 82 0 R /Parent 75 0 R /Prev 80 0 R /Title (Function annotations) >>
endobj
82 0 obj
-<< /Dest [ 55 0 R /XYZ 62.69291 566.6236 0 ] /Next 83 0 R /Parent 76 0 R /Prev 81 0 R /Title (Function annotations) >>
+<< /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Next 83 0 R /Parent 75 0 R /Prev 81 0 R /Title (decorator.decorator) >>
endobj
83 0 obj
-<< /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Next 84 0 R /Parent 76 0 R /Prev 82 0 R /Title (decorator.decorator) >>
+<< /Dest [ 56 0 R /XYZ 62.69291 317.2236 0 ] /Next 84 0 R /Parent 75 0 R /Prev 82 0 R /Title (blocking) >>
endobj
84 0 obj
-<< /Dest [ 56 0 R /XYZ 62.69291 317.2236 0 ] /Next 85 0 R /Parent 76 0 R /Prev 83 0 R /Title (blocking) >>
+<< /Dest [ 57 0 R /XYZ 62.69291 434.6236 0 ] /Next 85 0 R /Parent 75 0 R /Prev 83 0 R /Title (async) >>
endobj
85 0 obj
-<< /Dest [ 57 0 R /XYZ 62.69291 434.6236 0 ] /Next 86 0 R /Parent 76 0 R /Prev 84 0 R /Title (async) >>
+<< /Dest [ 58 0 R /XYZ 62.69291 336.6236 0 ] /Next 86 0 R /Parent 75 0 R /Prev 84 0 R /Title (contextmanager) >>
endobj
86 0 obj
-<< /Dest [ 59 0 R /XYZ 62.69291 595.8236 0 ] /Next 87 0 R /Parent 76 0 R /Prev 85 0 R /Title (contextmanager) >>
+<< /Dest [ 59 0 R /XYZ 62.69291 471.8236 0 ] /Next 87 0 R /Parent 75 0 R /Prev 85 0 R /Title (The FunctionMaker class) >>
endobj
87 0 obj
-<< /Dest [ 60 0 R /XYZ 62.69291 717.0236 0 ] /Next 88 0 R /Parent 76 0 R /Prev 86 0 R /Title (The FunctionMaker class) >>
+<< /Dest [ 61 0 R /XYZ 62.69291 551.8236 0 ] /Next 88 0 R /Parent 75 0 R /Prev 86 0 R /Title (Getting the source code) >>
endobj
88 0 obj
-<< /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Next 89 0 R /Parent 76 0 R /Prev 87 0 R /Title (Getting the source code) >>
+<< /Dest [ 63 0 R /XYZ 62.69291 765.0236 0 ] /Next 89 0 R /Parent 75 0 R /Prev 87 0 R /Title (Dealing with third party decorators) >>
endobj
89 0 obj
-<< /Dest [ 62 0 R /XYZ 62.69291 294.4236 0 ] /Next 90 0 R /Parent 76 0 R /Prev 88 0 R /Title (Dealing with third party decorators) >>
+<< /Dest [ 64 0 R /XYZ 62.69291 335.0236 0 ] /Next 90 0 R /Parent 75 0 R /Prev 88 0 R /Title (Caveats and limitations) >>
endobj
90 0 obj
-<< /Dest [ 65 0 R /XYZ 62.69291 558.6236 0 ] /Next 91 0 R /Parent 76 0 R /Prev 89 0 R /Title (Caveats and limitations) >>
+<< /Dest [ 71 0 R /XYZ 62.69291 474.6236 0 ] /Next 91 0 R /Parent 75 0 R /Prev 89 0 R /Title (Compatibility notes) >>
endobj
91 0 obj
-<< /Dest [ 72 0 R /XYZ 62.69291 671.8236 0 ] /Next 92 0 R /Parent 76 0 R /Prev 90 0 R /Title (Compatibility notes) >>
+<< /Dest [ 71 0 R /XYZ 62.69291 399.6236 0 ] /Next 92 0 R /Parent 75 0 R /Prev 90 0 R /Title (Historical notes) >>
endobj
92 0 obj
-<< /Dest [ 72 0 R /XYZ 62.69291 596.8236 0 ] /Next 93 0 R /Parent 76 0 R /Prev 91 0 R /Title (Historical notes) >>
+<< /Dest [ 72 0 R /XYZ 62.69291 663.0236 0 ] /Parent 75 0 R /Prev 91 0 R /Title (LICENSE) >>
endobj
93 0 obj
-<< /Dest [ 72 0 R /XYZ 62.69291 173.8236 0 ] /Parent 76 0 R /Prev 92 0 R /Title (LICENSE) >>
+<< /Count 15 /Kids [ 45 0 R 51 0 R 52 0 R 53 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 61 0 R
+ 63 0 R 64 0 R 66 0 R 71 0 R 72 0 R ] /Type /Pages >>
endobj
94 0 obj
-<< /Count 16 /Kids [ 45 0 R 51 0 R 52 0 R 53 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R
- 62 0 R 64 0 R 65 0 R 67 0 R 72 0 R 73 0 R ] /Type /Pages >>
-endobj
-95 0 obj
-<< /Length 9234 >>
+<< /Length 9233 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -606,7 +602,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 66.44 0 Td (8) Tj T* -66.44 0 Td ET
Q
Q
q
@@ -620,7 +616,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 66.44 0 Td (9) Tj T* -66.44 0 Td ET
Q
Q
q
@@ -634,7 +630,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (11) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (10) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -662,7 +658,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (13) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (12) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -676,7 +672,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (15) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (14) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -690,7 +686,7 @@ q q
0 0 .501961 rg
0 0 .501961 RG
-BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (15) Tj T* -60.88 0 Td ET
+BT 1 0 0 1 0 2 Tm /F2 10 Tf 12 TL 60.88 0 Td (14) Tj T* -60.88 0 Td ET
Q
Q
q
@@ -828,7 +824,7 @@ Q endstream
endobj
-96 0 obj
+95 0 obj
<< /Length 11913 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1131,7 +1127,7 @@ Q endstream
endobj
-97 0 obj
+96 0 obj
<< /Length 16750 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1596,7 +1592,7 @@ Q endstream
endobj
-98 0 obj
+97 0 obj
<< /Length 17672 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2160,7 +2156,7 @@ Q endstream
endobj
-99 0 obj
+98 0 obj
<< /Length 19633 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2754,7 +2750,7 @@ Q endstream
endobj
-100 0 obj
+99 0 obj
<< /Length 18436 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -3266,8 +3262,8 @@ Q endstream
endobj
-101 0 obj
-<< /Length 13895 >>
+100 0 obj
+<< /Length 19237 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -3525,58 +3521,19 @@ BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (async) Tj T* ET Q
Q
q
-1 0 0 1 62.69291 371.6236 cm
-q
-0 0 0 rg
-BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.647485 Tw (We have just seen an examples of a simple decorator factory, implemented as a function returning a) Tj T* 0 Tw .25784 Tw (decorator. For more complex situations, it is more convenient to implement decorator factories as callable) Tj T* 0 Tw (objects that can be converted into decorators.) Tj T* ET
-Q
-Q
-q
-1 0 0 1 62.69291 305.6236 cm
+1 0 0 1 62.69291 395.6236 cm
q
-BT 1 0 0 1 0 50 Tm 2.853876 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an example, here will I show a decorator which is able to convert a blocking function into an) Tj T* 0 Tw 2.477126 Tw (asynchronous function. The function, when called, is executed in a separate thread. Moreover, it is) Tj T* 0 Tw .288443 Tw (possible to set three callbacks ) Tj /F3 10 Tf 0 0 0 rg (on_success) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F3 10 Tf 0 0 0 rg (on_failure ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F3 10 Tf 0 0 0 rg (on_closing) Tj /F1 10 Tf 0 0 0 rg (, to specify how to manage) Tj T* 0 Tw 1.854724 Tw (the function call \(of course the code here is just an example, it is not a recommended way of doing) Tj T* 0 Tw (multi-threaded programming\). The implementation is the following:) Tj T* ET
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (facility can also produce a decorator starting from a class with the signature of a caller.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 248.4236 cm
+1 0 0 1 62.69291 341.6236 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 48 re B*
-Q
-q
-.960784 .960784 .862745 rg
-n 0 24 18 12 re f*
-.960784 .960784 .862745 rg
-n 24 24 60 12 re f*
-.960784 .960784 .862745 rg
-n 84 24 6 12 re f*
-.960784 .960784 .862745 rg
-n 90 24 36 12 re f*
-.960784 .960784 .862745 rg
-n 126 24 12 12 re f*
-.960784 .960784 .862745 rg
-n 150 24 144 12 re f*
-.960784 .960784 .862745 rg
-n 24 12 228 12 re f*
-.960784 .960784 .862745 rg
-n 24 0 36 12 re f*
-.960784 .960784 .862745 rg
-n 66 0 36 12 re f*
-BT 1 0 0 1 0 26 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_success) Tj 0 0 0 rg (\() Tj 0 0 0 rg (result) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called on the result of the function") Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj T* ET
-Q
-Q
-Q
+BT 1 0 0 1 0 38 Tm 2.853876 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an example, here will I show a decorator which is able to convert a blocking function into an) Tj T* 0 Tw .29311 Tw (asynchronous function. The function, when called, is executed in a separate thread. This is very similar in) Tj T* 0 Tw .94686 Tw (spirit to the approach used in the ) Tj /F3 10 Tf 0 0 0 rg (concurrent.futures ) Tj /F1 10 Tf 0 0 0 rg (package. Of course the code here is just an) Tj T* 0 Tw (example, it is not a recommended way of implementing futures. The implementation is the following:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 191.2236 cm
+1 0 0 1 62.69291 80.42362 cm
q
q
1 0 0 1 0 0 cm
@@ -3586,449 +3543,263 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 48 re B*
+n -6 -6 468.6898 252 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 24 18 12 re f*
-.960784 .960784 .862745 rg
-n 24 24 60 12 re f*
-.960784 .960784 .862745 rg
-n 84 24 6 12 re f*
-.960784 .960784 .862745 rg
-n 90 24 48 12 re f*
-.960784 .960784 .862745 rg
-n 138 24 12 12 re f*
-.960784 .960784 .862745 rg
-n 162 24 144 12 re f*
-.960784 .960784 .862745 rg
-n 24 12 180 12 re f*
-.960784 .960784 .862745 rg
-n 24 0 24 12 re f*
-BT 1 0 0 1 0 26 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_failure) Tj 0 0 0 rg (\() Tj 0 0 0 rg (exc_info) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called if the function fails") Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (pass) Tj T* ET
-Q
-Q
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 134.0236 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 48 re B*
-Q
-q
-.960784 .960784 .862745 rg
-n 0 24 18 12 re f*
-.960784 .960784 .862745 rg
-n 24 24 60 12 re f*
-.960784 .960784 .862745 rg
-n 84 24 18 12 re f*
-.960784 .960784 .862745 rg
-n 114 24 144 12 re f*
-.960784 .960784 .862745 rg
-n 24 12 336 12 re f*
-.960784 .960784 .862745 rg
-n 24 0 24 12 re f*
-BT 1 0 0 1 0 26 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_closing) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called at the end, both in case of success and failure") Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (pass) Tj T* ET
-Q
-Q
-Q
-Q
-Q
-q
-1 0 0 1 62.69291 88.82362 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
-.960784 .960784 .862745 rg
-n 0 12 30 12 re f*
-.960784 .960784 .862745 rg
-n 36 12 30 12 re f*
-.960784 .960784 .862745 rg
-n 66 12 6 12 re f*
-.960784 .960784 .862745 rg
-n 72 12 36 12 re f*
-.960784 .960784 .862745 rg
-n 108 12 12 12 re f*
-.960784 .960784 .862745 rg
-n 24 0 18 12 re f*
-BT 1 0 0 1 0 14 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (class) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf 0 0 1 rg (Async) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ET
-Q
-Q
-Q
-Q
-Q
-
-endstream
-endobj
-102 0 obj
-<< /Length 19056 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 355.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 408 re B*
-Q
-q
-.960784 .960784 .862745 rg
-n 0 384 378 12 re f*
-.960784 .960784 .862745 rg
-n 0 372 330 12 re f*
-.960784 .960784 .862745 rg
-n 0 360 0 12 re f*
-.960784 .960784 .862745 rg
-n 0 348 288 12 re f*
-.960784 .960784 .862745 rg
-n 0 336 342 12 re f*
+n 0 228 30 12 re f*
.960784 .960784 .862745 rg
-n 0 324 42 12 re f*
+n 36 228 36 12 re f*
.960784 .960784 .862745 rg
-n 24 300 18 12 re f*
-.960784 .960784 .862745 rg
-n 48 300 48 12 re f*
-.960784 .960784 .862745 rg
-n 96 300 6 12 re f*
-.960784 .960784 .862745 rg
-n 102 300 24 12 re f*
-.960784 .960784 .862745 rg
-n 126 300 6 12 re f*
-.960784 .960784 .862745 rg
-n 138 300 78 12 re f*
-.960784 .960784 .862745 rg
-n 216 300 6 12 re f*
-.960784 .960784 .862745 rg
-n 228 300 60 12 re f*
-.960784 .960784 .862745 rg
-n 288 300 6 12 re f*
-.960784 .960784 .862745 rg
-n 294 300 60 12 re f*
-.960784 .960784 .862745 rg
-n 354 300 6 12 re f*
-.960784 .960784 .862745 rg
-n 102 288 60 12 re f*
-.960784 .960784 .862745 rg
-n 162 288 6 12 re f*
-.960784 .960784 .862745 rg
-n 168 288 60 12 re f*
-.960784 .960784 .862745 rg
-n 228 288 6 12 re f*
-.960784 .960784 .862745 rg
-n 240 288 60 12 re f*
-.960784 .960784 .862745 rg
-n 300 288 6 12 re f*
-.960784 .960784 .862745 rg
-n 306 288 60 12 re f*
-.960784 .960784 .862745 rg
-n 366 288 12 12 re f*
-.960784 .960784 .862745 rg
-n 48 276 24 12 re f*
-.960784 .960784 .862745 rg
-n 72 276 6 12 re f*
-.960784 .960784 .862745 rg
-n 78 276 78 12 re f*
-.960784 .960784 .862745 rg
-n 162 276 6 12 re f*
-.960784 .960784 .862745 rg
-n 174 276 78 12 re f*
-.960784 .960784 .862745 rg
-n 48 264 24 12 re f*
-.960784 .960784 .862745 rg
-n 72 264 6 12 re f*
-.960784 .960784 .862745 rg
-n 78 264 60 12 re f*
-.960784 .960784 .862745 rg
-n 144 264 6 12 re f*
-.960784 .960784 .862745 rg
-n 156 264 60 12 re f*
-.960784 .960784 .862745 rg
-n 48 252 24 12 re f*
-.960784 .960784 .862745 rg
-n 72 252 6 12 re f*
-.960784 .960784 .862745 rg
-n 78 252 60 12 re f*
-.960784 .960784 .862745 rg
-n 144 252 6 12 re f*
-.960784 .960784 .862745 rg
-n 156 252 60 12 re f*
-.960784 .960784 .862745 rg
-n 48 240 24 12 re f*
+n 72 228 6 12 re f*
.960784 .960784 .862745 rg
-n 72 240 6 12 re f*
+n 78 228 54 12 re f*
.960784 .960784 .862745 rg
-n 78 240 60 12 re f*
+n 132 228 6 12 re f*
.960784 .960784 .862745 rg
-n 144 240 6 12 re f*
+n 138 228 36 12 re f*
.960784 .960784 .862745 rg
-n 156 240 60 12 re f*
+n 174 228 12 12 re f*
.960784 .960784 .862745 rg
n 24 216 18 12 re f*
.960784 .960784 .862745 rg
-n 48 216 48 12 re f*
-.960784 .960784 .862745 rg
-n 96 216 6 12 re f*
-.960784 .960784 .862745 rg
-n 102 216 24 12 re f*
-.960784 .960784 .862745 rg
-n 126 216 6 12 re f*
-.960784 .960784 .862745 rg
-n 138 216 24 12 re f*
+n 0 204 354 12 re f*
.960784 .960784 .862745 rg
-n 162 216 6 12 re f*
+n 0 192 186 12 re f*
.960784 .960784 .862745 rg
-n 174 216 6 12 re f*
+n 0 180 42 12 re f*
.960784 .960784 .862745 rg
-n 180 216 24 12 re f*
+n 24 168 18 12 re f*
.960784 .960784 .862745 rg
-n 204 216 6 12 re f*
+n 48 168 48 12 re f*
.960784 .960784 .862745 rg
-n 216 216 12 12 re f*
+n 96 168 6 12 re f*
.960784 .960784 .862745 rg
-n 228 216 12 12 re f*
+n 102 168 24 12 re f*
.960784 .960784 .862745 rg
-n 240 216 12 12 re f*
+n 126 168 6 12 re f*
.960784 .960784 .862745 rg
-n 48 204 18 12 re f*
+n 138 168 24 12 re f*
.960784 .960784 .862745 rg
-n 66 204 6 12 re f*
+n 162 168 6 12 re f*
.960784 .960784 .862745 rg
-n 72 192 42 12 re f*
+n 174 168 6 12 re f*
.960784 .960784 .862745 rg
-n 120 192 6 12 re f*
+n 180 168 24 12 re f*
.960784 .960784 .862745 rg
-n 132 192 24 12 re f*
+n 204 168 6 12 re f*
.960784 .960784 .862745 rg
-n 156 192 6 12 re f*
+n 216 168 12 12 re f*
.960784 .960784 .862745 rg
-n 162 192 42 12 re f*
+n 228 168 12 12 re f*
.960784 .960784 .862745 rg
-n 48 180 36 12 re f*
+n 240 168 12 12 re f*
.960784 .960784 .862745 rg
-n 90 180 84 12 re f*
+n 48 156 18 12 re f*
.960784 .960784 .862745 rg
-n 174 180 6 12 re f*
+n 66 156 6 12 re f*
.960784 .960784 .862745 rg
-n 192 180 258 12 re f*
+n 72 144 42 12 re f*
.960784 .960784 .862745 rg
-n 72 168 42 12 re f*
+n 120 144 6 12 re f*
.960784 .960784 .862745 rg
-n 120 168 6 12 re f*
+n 132 144 24 12 re f*
.960784 .960784 .862745 rg
-n 132 168 24 12 re f*
+n 156 144 6 12 re f*
.960784 .960784 .862745 rg
-n 156 168 6 12 re f*
+n 162 144 42 12 re f*
.960784 .960784 .862745 rg
-n 162 168 42 12 re f*
+n 48 132 36 12 re f*
.960784 .960784 .862745 rg
-n 210 168 6 12 re f*
+n 90 132 84 12 re f*
.960784 .960784 .862745 rg
-n 222 168 54 12 re f*
+n 174 132 6 12 re f*
.960784 .960784 .862745 rg
-n 276 168 6 12 re f*
+n 192 132 258 12 re f*
.960784 .960784 .862745 rg
-n 282 168 30 12 re f*
+n 72 120 42 12 re f*
.960784 .960784 .862745 rg
-n 312 168 6 12 re f*
+n 120 120 6 12 re f*
.960784 .960784 .862745 rg
-n 318 168 6 12 re f*
+n 132 120 24 12 re f*
.960784 .960784 .862745 rg
-n 324 168 6 12 re f*
+n 156 120 6 12 re f*
.960784 .960784 .862745 rg
-n 48 156 24 12 re f*
+n 162 120 42 12 re f*
.960784 .960784 .862745 rg
-n 78 156 6 12 re f*
+n 210 120 6 12 re f*
.960784 .960784 .862745 rg
-n 90 156 6 12 re f*
+n 222 120 54 12 re f*
.960784 .960784 .862745 rg
-n 96 156 12 12 re f*
+n 276 120 6 12 re f*
.960784 .960784 .862745 rg
-n 108 156 6 12 re f*
+n 282 120 30 12 re f*
.960784 .960784 .862745 rg
-n 114 156 12 12 re f*
+n 312 120 6 12 re f*
.960784 .960784 .862745 rg
-n 126 156 6 12 re f*
+n 318 120 6 12 re f*
.960784 .960784 .862745 rg
-n 138 156 6 12 re f*
+n 324 120 6 12 re f*
.960784 .960784 .862745 rg
-n 150 156 6 12 re f*
+n 48 108 24 12 re f*
.960784 .960784 .862745 rg
-n 156 156 24 12 re f*
+n 78 108 6 12 re f*
.960784 .960784 .862745 rg
-n 180 156 6 12 re f*
+n 90 108 6 12 re f*
.960784 .960784 .862745 rg
-n 186 156 48 12 re f*
+n 96 108 12 12 re f*
.960784 .960784 .862745 rg
-n 234 156 6 12 re f*
+n 108 108 6 12 re f*
.960784 .960784 .862745 rg
-n 246 156 24 12 re f*
+n 114 108 12 12 re f*
.960784 .960784 .862745 rg
-n 270 156 6 12 re f*
+n 126 108 6 12 re f*
.960784 .960784 .862745 rg
-n 276 156 42 12 re f*
+n 138 108 6 12 re f*
.960784 .960784 .862745 rg
-n 318 156 12 12 re f*
+n 150 108 6 12 re f*
.960784 .960784 .862745 rg
-n 48 132 18 12 re f*
+n 156 108 24 12 re f*
.960784 .960784 .862745 rg
-n 72 132 72 12 re f*
+n 180 108 6 12 re f*
.960784 .960784 .862745 rg
-n 144 132 18 12 re f*
+n 186 108 48 12 re f*
.960784 .960784 .862745 rg
-n 72 120 18 12 re f*
+n 234 108 6 12 re f*
.960784 .960784 .862745 rg
-n 90 120 6 12 re f*
+n 246 108 24 12 re f*
.960784 .960784 .862745 rg
-n 96 108 36 12 re f*
+n 270 108 6 12 re f*
.960784 .960784 .862745 rg
-n 138 108 6 12 re f*
+n 276 108 42 12 re f*
.960784 .960784 .862745 rg
-n 150 108 24 12 re f*
+n 318 108 12 12 re f*
.960784 .960784 .862745 rg
-n 174 108 6 12 re f*
+n 48 84 18 12 re f*
.960784 .960784 .862745 rg
-n 180 108 6 12 re f*
+n 72 84 72 12 re f*
.960784 .960784 .862745 rg
-n 186 108 24 12 re f*
+n 144 84 18 12 re f*
.960784 .960784 .862745 rg
-n 210 108 6 12 re f*
+n 72 72 24 12 re f*
.960784 .960784 .862745 rg
-n 222 108 12 12 re f*
+n 96 72 6 12 re f*
.960784 .960784 .862745 rg
-n 234 108 12 12 re f*
+n 102 72 42 12 re f*
.960784 .960784 .862745 rg
-n 246 108 6 12 re f*
+n 150 72 6 12 re f*
.960784 .960784 .862745 rg
-n 72 96 36 12 re f*
+n 162 72 24 12 re f*
.960784 .960784 .862745 rg
-n 108 96 6 12 re f*
+n 186 72 6 12 re f*
.960784 .960784 .862745 rg
-n 96 84 24 12 re f*
+n 192 72 6 12 re f*
.960784 .960784 .862745 rg
-n 120 84 6 12 re f*
+n 198 72 24 12 re f*
.960784 .960784 .862745 rg
-n 126 84 60 12 re f*
+n 222 72 6 12 re f*
.960784 .960784 .862745 rg
-n 186 84 6 12 re f*
+n 234 72 12 12 re f*
.960784 .960784 .862745 rg
-n 192 84 18 12 re f*
+n 246 72 12 12 re f*
.960784 .960784 .862745 rg
-n 210 84 6 12 re f*
+n 258 72 6 12 re f*
.960784 .960784 .862745 rg
-n 216 84 48 12 re f*
+n 48 60 30 12 re f*
.960784 .960784 .862745 rg
-n 264 84 18 12 re f*
+n 78 60 6 12 re f*
.960784 .960784 .862745 rg
-n 72 72 24 12 re f*
+n 84 60 36 12 re f*
.960784 .960784 .862745 rg
-n 96 72 6 12 re f*
+n 120 60 6 12 re f*
.960784 .960784 .862745 rg
-n 96 60 36 12 re f*
+n 132 60 24 12 re f*
.960784 .960784 .862745 rg
-n 138 60 24 12 re f*
+n 156 60 6 12 re f*
.960784 .960784 .862745 rg
n 162 60 6 12 re f*
.960784 .960784 .862745 rg
-n 168 60 60 12 re f*
+n 168 60 48 12 re f*
.960784 .960784 .862745 rg
-n 228 60 6 12 re f*
+n 216 60 6 12 re f*
.960784 .960784 .862745 rg
-n 234 60 36 12 re f*
+n 222 60 36 12 re f*
.960784 .960784 .862745 rg
-n 270 60 6 12 re f*
+n 258 60 6 12 re f*
.960784 .960784 .862745 rg
-n 72 48 42 12 re f*
+n 264 60 72 12 re f*
.960784 .960784 .862745 rg
-n 114 48 6 12 re f*
-.960784 .960784 .862745 rg
-n 96 36 24 12 re f*
+n 336 60 6 12 re f*
.960784 .960784 .862745 rg
-n 120 36 6 12 re f*
+n 348 60 24 12 re f*
.960784 .960784 .862745 rg
-n 126 36 60 12 re f*
+n 372 60 6 12 re f*
.960784 .960784 .862745 rg
-n 186 36 12 12 re f*
+n 378 60 24 12 re f*
.960784 .960784 .862745 rg
-n 48 24 36 12 re f*
+n 402 60 6 12 re f*
.960784 .960784 .862745 rg
-n 90 24 6 12 re f*
+n 48 48 24 12 re f*
.960784 .960784 .862745 rg
-n 102 24 24 12 re f*
+n 72 48 6 12 re f*
.960784 .960784 .862745 rg
-n 126 24 6 12 re f*
+n 78 48 30 12 re f*
.960784 .960784 .862745 rg
-n 132 24 78 12 re f*
+n 108 48 12 12 re f*
.960784 .960784 .862745 rg
-n 210 24 6 12 re f*
+n 24 24 18 12 re f*
.960784 .960784 .862745 rg
-n 216 24 24 12 re f*
+n 48 24 36 12 re f*
.960784 .960784 .862745 rg
-n 240 24 6 12 re f*
+n 84 24 6 12 re f*
.960784 .960784 .862745 rg
-n 252 24 72 12 re f*
+n 90 24 24 12 re f*
.960784 .960784 .862745 rg
-n 324 24 6 12 re f*
+n 114 24 12 12 re f*
.960784 .960784 .862745 rg
-n 336 24 24 12 re f*
+n 48 12 24 12 re f*
.960784 .960784 .862745 rg
-n 360 24 6 12 re f*
+n 72 12 6 12 re f*
.960784 .960784 .862745 rg
-n 48 12 36 12 re f*
+n 78 12 24 12 re f*
.960784 .960784 .862745 rg
-n 84 12 6 12 re f*
+n 102 12 12 12 re f*
.960784 .960784 .862745 rg
-n 90 12 30 12 re f*
+n 48 0 36 12 re f*
.960784 .960784 .862745 rg
-n 120 12 12 12 re f*
+n 90 0 24 12 re f*
.960784 .960784 .862745 rg
-n 48 0 36 12 re f*
+n 114 0 6 12 re f*
.960784 .960784 .862745 rg
-n 90 0 36 12 re f*
-BT 1 0 0 1 0 386 Tm 12 TL /F6 10 Tf .729412 .129412 .129412 rg ( A decorator converting blocking functions into asynchronous) Tj T* ( functions, by using threads or processes. Examples:) Tj T* T* ( async_with_threads = Async\(threading.Thread\)) Tj T* ( async_with_processes = Async\(multiprocessing.Process\)) Tj T* ( """) Tj /F3 10 Tf 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_success) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg (,) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (on_failure) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_closing) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (try) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (except) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf .823529 .254902 .227451 rg (AttributeError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# instantiate the counter at the first call) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (itertools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (count) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (name) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (') Tj /F5 10 Tf .733333 .4 .533333 rg (%s) Tj /F3 10 Tf .729412 .129412 .129412 rg (-) Tj /F5 10 Tf .733333 .4 .533333 rg (%s) Tj /F3 10 Tf .729412 .129412 .129412 rg (') Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (next) Tj 0 0 0 rg (\() Tj 0 0 0 rg (counter) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func_wrapper) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (try) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (except) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg (\() Tj 0 0 0 rg (sys) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (exc_info) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (else) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg (\() Tj 0 0 0 rg (result) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (finally) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (thread) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func_wrapper) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (name) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (thread) Tj T* ET
+n 120 0 42 12 re f*
+BT 1 0 0 1 0 230 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (class) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf 0 0 1 rg (Future) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( A class converting blocking functions into asynchronous) Tj T* ( functions by using threads.) Tj T* ( """) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (try) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (except) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf .823529 .254902 .227451 rg (AttributeError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# instantiate the counter at the first call) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (itertools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (count) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (name) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (') Tj /F5 10 Tf .733333 .4 .533333 rg (%s) Tj /F3 10 Tf .729412 .129412 .129412 rg (-) Tj /F5 10 Tf .733333 .4 .533333 rg (%s) Tj /F3 10 Tf .729412 .129412 .129412 rg (') Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (next) Tj 0 0 0 rg (\() Tj 0 0 0 rg (counter) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func_wrapper) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (_result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (super) Tj 0 0 0 rg (\() Tj 0 0 0 rg (Future) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__init__) Tj 0 0 0 rg (\() Tj 0 0 0 rg (target) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (func_wrapper) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (name) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (name) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (result) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (join) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (_result) Tj T* ET
Q
Q
Q
Q
Q
+
+endstream
+endobj
+101 0 obj
+<< /Length 16187 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 323.8236 cm
+1 0 0 1 62.69291 741.0236 cm
q
-BT 1 0 0 1 0 14 Tm .865984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorated function returns the current execution thread, which can be stored and checked later, for) Tj T* 0 Tw (instance to verify that the thread ) Tj /F3 10 Tf 0 0 0 rg (.isAlive\(\)) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET
+BT 1 0 0 1 0 14 Tm .143984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorated function returns a ) Tj /F3 10 Tf 0 0 0 rg (Future ) Tj /F1 10 Tf 0 0 0 rg (object, which has a ) Tj /F3 10 Tf 0 0 0 rg (.result\(\) ) Tj /F1 10 Tf 0 0 0 rg (method which blocks until the) Tj T* 0 Tw (underlying thread finishes and returns the final result.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 281.8236 cm
+1 0 0 1 62.69291 699.0236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .691654 Tw (Here is an example of usage. Suppose one wants to write some data to an external resource which can) Tj T* 0 Tw .21683 Tw (be accessed by a single user at once \(for instance a printer\). Then the access to the writing function must) Tj T* 0 Tw (be locked. Here is a minimalistic example:) Tj T* ET
+BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .128409 Tw (Suppose one wants to write some data to an external resource which can be accessed by a single user at) Tj T* 0 Tw .076654 Tw (once \(for instance a printer\). Then the access to the writing function must be locked. Here is a minimalistic) Tj T* 0 Tw (example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 128.6236 cm
+1 0 0 1 62.69291 545.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -4056,17 +3827,9 @@ n 72 120 54 12 re f* .960784 .960784 .862745 rg
n 126 120 6 12 re f*
.960784 .960784 .862745 rg
-n 132 120 30 12 re f*
-.960784 .960784 .862745 rg
-n 162 120 6 12 re f*
-.960784 .960784 .862745 rg
-n 168 120 54 12 re f*
-.960784 .960784 .862745 rg
-n 222 120 6 12 re f*
+n 132 120 36 12 re f*
.960784 .960784 .862745 rg
-n 228 120 36 12 re f*
-.960784 .960784 .862745 rg
-n 264 120 12 12 re f*
+n 168 120 6 12 re f*
.960784 .960784 .862745 rg
n 0 96 6 12 re f*
.960784 .960784 .862745 rg
@@ -4151,27 +3914,20 @@ n 192 12 6 12 re f* n 0 0 18 12 re f*
.960784 .960784 .862745 rg
n 48 0 264 12 re f*
-BT 1 0 0 1 0 122 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (async) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (Async) Tj 0 0 0 rg (\() Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ([]) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# for simplicity the written data are stored into a list.) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@async) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (write) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# append data to the datalist by locking) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (with) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Lock) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# emulate some long running operation) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (append) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# other operations not requiring a lock here) Tj T* ET
+BT 1 0 0 1 0 122 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (async) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (Future) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ([]) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# for simplicity the written data are stored into a list.) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@async) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (write) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# append data to the datalist by locking) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (with) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Lock) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# emulate some long running operation) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (append) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# other operations not requiring a lock here) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 96.62362 cm
+1 0 0 1 62.69291 513.8236 cm
q
BT 1 0 0 1 0 14 Tm .905868 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each call to ) Tj /F3 10 Tf 0 0 0 rg (write ) Tj /F1 10 Tf 0 0 0 rg (will create a new writer thread, but there will be no synchronization problems since) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (write ) Tj /F1 10 Tf 0 0 0 rg (is locked.) Tj T* ET
Q
Q
-
-endstream
-endobj
-103 0 obj
-<< /Length 14531 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 607.8236 cm
+1 0 0 1 62.69291 348.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -4322,26 +4078,26 @@ n 48 0 6 12 re f* n 60 0 42 12 re f*
.960784 .960784 .862745 rg
n 102 0 6 12 re f*
-BT 1 0 0 1 0 134 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data1") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (.) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait a bit, so we are sure data2 is written after data1) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data2") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait for the writers to complete) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (datalist) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('data1') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('data2') Tj 0 0 0 rg (]) Tj T* ET
+BT 1 0 0 1 0 134 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data1") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Future) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (.) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait a bit, so we are sure data2 is written after data1) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data2") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Future) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait for the writers to complete) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (datalist) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('data1') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('data2') Tj 0 0 0 rg (]) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 574.8236 cm
+1 0 0 1 62.69291 315.6236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (contextmanager) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 544.8236 cm
+1 0 0 1 62.69291 285.6236 cm
q
BT 1 0 0 1 0 14 Tm 2.685984 Tw 12 TL /F1 10 Tf 0 0 0 rg (For a long time Python had in its standard library a ) Tj /F3 10 Tf 0 0 0 rg (contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator, able to convert) Tj T* 0 Tw (generator functions into ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (factories. For instance if you write) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 451.6236 cm
+1 0 0 1 62.69291 192.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -4423,13 +4179,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 419.6236 cm
+1 0 0 1 62.69291 160.4236 cm
q
BT 1 0 0 1 0 14 Tm .150888 Tw 12 TL /F1 10 Tf 0 0 0 rg (then ) Tj /F3 10 Tf 0 0 0 rg (before_after ) Tj /F1 10 Tf 0 0 0 rg (is a factory function returning ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects which can be) Tj T* 0 Tw (used with the ) Tj /F3 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (statement:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 338.4236 cm
+1 0 0 1 62.69291 79.22362 cm
q
q
1 0 0 1 0 0 cm
@@ -4484,14 +4240,21 @@ Q Q
Q
Q
+
+endstream
+endobj
+102 0 obj
+<< /Length 13394 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 294.4236 cm
+1 0 0 1 62.69291 729.0236 cm
q
BT 1 0 0 1 0 26 Tm .462488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Basically, it is as if the content of the ) Tj /F3 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (block was executed in the place of the ) Tj /F3 10 Tf 0 0 0 rg (yield ) Tj /F1 10 Tf 0 0 0 rg (expression in) Tj T* 0 Tw 2.691797 Tw (the generator function. In Python 3.2 ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects were enhanced with a) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method, so that they can be used as decorators as in this example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 177.2236 cm
+1 0 0 1 62.69291 611.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -4555,44 +4318,31 @@ Q Q
Q
q
-1 0 0 1 62.69291 85.22362 cm
+1 0 0 1 62.69291 483.8236 cm
q
-BT 1 0 0 1 0 74 Tm .20561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf 0 0 0 rg (ba ) Tj /F1 10 Tf 0 0 0 rg (decorator is basically inserting a ) Tj /F3 10 Tf 0 0 0 rg (with) Tj ( ) Tj (ba: ) Tj /F1 10 Tf 0 0 0 rg (block inside the function. However there two issues: ) Tj T* 0 Tw 1.402126 Tw (the first is that ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects are callable only in Python 3.2, so the previous ) Tj T* 0 Tw .356905 Tw (example will break in older versions of Python; the second is that ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects ) Tj T* 0 Tw .57561 Tw (do not preserve the signature of the decorated functions: the decorated ) Tj /F3 10 Tf 0 0 0 rg (hello ) Tj /F1 10 Tf 0 0 0 rg (function here will have a ) Tj T* 0 Tw 3.990814 Tw (generic signature ) Tj /F3 10 Tf 0 0 0 rg (hello\(*args,) Tj ( ) Tj (**kwargs\) ) Tj /F1 10 Tf 0 0 0 rg (but will break when called with more than zero ) Tj T* 0 Tw 7.708314 Tw (arguments. For such reasons the decorator module, starting with release 3.4, offers a ) Tj T* 0 Tw 1.027251 Tw /F3 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator that solves both problems and works in all supported Python) Tj T* 0 Tw ET
-Q
-Q
-
-endstream
-endobj
-104 0 obj
-<< /Length 13593 >>
-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 26 Tm 2.85816 Tw 12 TL /F1 10 Tf 0 0 0 rg (versions. The usage is the same and factories decorated with ) Tj /F3 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (will) Tj T* 0 Tw .17122 Tw (returns instances of ) Tj /F3 10 Tf 0 0 0 rg (ContextManager) Tj /F1 10 Tf 0 0 0 rg (, a subclass of ) Tj /F3 10 Tf 0 0 0 rg (contextlib.GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (with) Tj T* 0 Tw (a ) Tj /F3 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method acting as a signature-preserving decorator.) Tj T* ET
+BT 1 0 0 1 0 110 Tm .20561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F3 10 Tf 0 0 0 rg (ba ) Tj /F1 10 Tf 0 0 0 rg (decorator is basically inserting a ) Tj /F3 10 Tf 0 0 0 rg (with) Tj ( ) Tj (ba: ) Tj /F1 10 Tf 0 0 0 rg (block inside the function. However there two issues:) Tj T* 0 Tw 1.402126 Tw (the first is that ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects are callable only in Python 3.2, so the previous) Tj T* 0 Tw .356905 Tw (example will break in older versions of Python; the second is that ) Tj /F3 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects) Tj T* 0 Tw .57561 Tw (do not preserve the signature of the decorated functions: the decorated ) Tj /F3 10 Tf 0 0 0 rg (hello ) Tj /F1 10 Tf 0 0 0 rg (function here will have a) Tj T* 0 Tw 3.990814 Tw (generic signature ) Tj /F3 10 Tf 0 0 0 rg (hello\(*args,) Tj ( ) Tj (**kwargs\) ) Tj /F1 10 Tf 0 0 0 rg (but will break when called with more than zero) Tj T* 0 Tw 7.708314 Tw (arguments. For such reasons the decorator module, starting with release 3.4, offers a) Tj T* 0 Tw 1.027251 Tw /F3 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator that solves both problems and works in all supported Python) Tj T* 0 Tw 2.85816 Tw (versions. The usage is the same and factories decorated with ) Tj /F3 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (will) Tj T* 0 Tw .17122 Tw (returns instances of ) Tj /F3 10 Tf 0 0 0 rg (ContextManager) Tj /F1 10 Tf 0 0 0 rg (, a subclass of ) Tj /F3 10 Tf 0 0 0 rg (contextlib.GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (with) Tj T* 0 Tw (a ) Tj /F3 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method acting as a signature-preserving decorator.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 696.0236 cm
+1 0 0 1 62.69291 450.8236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (The ) Tj /F3 17.5 Tf 0 0 0 rg (FunctionMaker ) Tj /F2 17.5 Tf 0 0 0 rg (class) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 630.0236 cm
+1 0 0 1 62.69291 384.8236 cm
q
BT 1 0 0 1 0 50 Tm 2.241412 Tw 12 TL /F1 10 Tf 0 0 0 rg (You may wonder about how the functionality of the ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module is implemented. The basic) Tj T* 0 Tw 1.545868 Tw (building block is a ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (class which is able to generate on the fly functions with a given) Tj T* 0 Tw .047485 Tw (name and signature from a function template passed as a string. Generally speaking, you should not need) Tj T* 0 Tw 1.164983 Tw (to resort to ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (when writing ordinary decorators, but it is handy in some circumstances.) Tj T* 0 Tw (You will see an example shortly, in the implementation of a cool decorator utility \() Tj /F3 10 Tf 0 0 0 rg (decorator_apply) Tj /F1 10 Tf 0 0 0 rg (\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 588.0236 cm
+1 0 0 1 62.69291 342.8236 cm
q
BT 1 0 0 1 0 26 Tm .414597 Tw 12 TL /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (provides a ) Tj /F3 10 Tf 0 0 0 rg (.create ) Tj /F1 10 Tf 0 0 0 rg (classmethod which takes as input the name, signature, and body) Tj T* 0 Tw .632927 Tw (of the function we want to generate as well as the execution environment were the function is generated) Tj T* 0 Tw (by ) Tj /F3 10 Tf 0 0 0 rg (exec) Tj /F1 10 Tf 0 0 0 rg (. Here is an example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 494.8236 cm
+1 0 0 1 62.69291 249.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -4720,25 +4470,25 @@ Q Q
Q
q
-1 0 0 1 62.69291 462.8236 cm
+1 0 0 1 62.69291 217.6236 cm
q
BT 1 0 0 1 0 14 Tm .226654 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is important to notice that the function body is interpolated before being executed, so be careful with the) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (% ) Tj /F1 10 Tf 0 0 0 rg (sign!) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 420.8236 cm
+1 0 0 1 62.69291 175.6236 cm
q
BT 1 0 0 1 0 26 Tm 1.995433 Tw 12 TL /F3 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (also accepts keyword arguments and such arguments are attached to the) Tj T* 0 Tw 1.64686 Tw (resulting function. This is useful if you want to set some function attributes, for instance the docstring) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (__doc__) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 378.8236 cm
+1 0 0 1 62.69291 133.6236 cm
q
BT 1 0 0 1 0 26 Tm .605318 Tw 12 TL /F1 10 Tf 0 0 0 rg (For debugging/introspection purposes it may be useful to see the source code of the generated function;) Tj T* 0 Tw 2.246235 Tw (to do that, just pass the flag ) Tj /F3 10 Tf 0 0 0 rg (addsource=True ) Tj /F1 10 Tf 0 0 0 rg (and a ) Tj /F3 10 Tf 0 0 0 rg (__source__ ) Tj /F1 10 Tf 0 0 0 rg (attribute will be added to the) Tj T* 0 Tw (generated function:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 285.6236 cm
+1 0 0 1 62.69291 88.42362 cm
q
q
1 0 0 1 0 0 cm
@@ -4748,57 +4498,84 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 84 re B*
+n -6 -6 468.6898 36 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 60 6 12 re f*
+n 0 12 6 12 re f*
.960784 .960784 .862745 rg
-n 6 60 6 12 re f*
+n 6 12 6 12 re f*
.960784 .960784 .862745 rg
-n 12 60 6 12 re f*
+n 12 12 6 12 re f*
.960784 .960784 .862745 rg
-n 24 60 12 12 re f*
+n 24 12 12 12 re f*
.960784 .960784 .862745 rg
-n 42 60 6 12 re f*
+n 42 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 54 12 78 12 re f*
.960784 .960784 .862745 rg
-n 54 60 78 12 re f*
+n 132 12 6 12 re f*
.960784 .960784 .862745 rg
-n 132 60 6 12 re f*
+n 138 12 36 12 re f*
.960784 .960784 .862745 rg
-n 138 60 36 12 re f*
+n 174 12 6 12 re f*
.960784 .960784 .862745 rg
-n 174 60 6 12 re f*
+n 0 0 18 12 re f*
.960784 .960784 .862745 rg
-n 0 48 18 12 re f*
+n 48 0 60 12 re f*
.960784 .960784 .862745 rg
-n 48 48 60 12 re f*
+n 108 0 6 12 re f*
.960784 .960784 .862745 rg
-n 108 48 6 12 re f*
+n 120 0 54 12 re f*
.960784 .960784 .862745 rg
-n 120 48 54 12 re f*
+n 174 0 6 12 re f*
.960784 .960784 .862745 rg
-n 174 48 6 12 re f*
+n 186 0 24 12 re f*
.960784 .960784 .862745 rg
-n 186 48 24 12 re f*
+n 210 0 6 12 re f*
.960784 .960784 .862745 rg
-n 210 48 6 12 re f*
+n 216 0 6 12 re f*
.960784 .960784 .862745 rg
-n 216 48 6 12 re f*
+n 222 0 6 12 re f*
.960784 .960784 .862745 rg
-n 222 48 6 12 re f*
+n 228 0 6 12 re f*
.960784 .960784 .862745 rg
-n 228 48 6 12 re f*
+n 234 0 12 12 re f*
.960784 .960784 .862745 rg
-n 234 48 12 12 re f*
+n 252 0 54 12 re f*
.960784 .960784 .862745 rg
-n 252 48 54 12 re f*
+n 306 0 6 12 re f*
.960784 .960784 .862745 rg
-n 306 48 6 12 re f*
+n 312 0 24 12 re f*
.960784 .960784 .862745 rg
-n 312 48 24 12 re f*
+n 336 0 6 12 re f*
+BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj 0 0 0 rg (\() Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (addsource) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ET
+Q
+Q
+Q
+Q
+Q
+
+endstream
+endobj
+103 0 obj
+<< /Length 15540 >>
+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
+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 336 48 6 12 re f*
+n -6 -6 468.6898 60 re B*
+Q
+q
.960784 .960784 .862745 rg
n 0 36 6 12 re f*
.960784 .960784 .862745 rg
@@ -4849,39 +4626,32 @@ n 0 0 6 12 re f* n 6 0 54 12 re f*
.960784 .960784 .862745 rg
n 60 0 6 12 re f*
-BT 1 0 0 1 0 62 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj 0 0 0 rg (\() Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (addsource) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (f1) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__source__) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET
+BT 1 0 0 1 0 38 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (f1) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__source__) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 145.6236 cm
+1 0 0 1 62.69291 563.8236 cm
q
BT 1 0 0 1 0 122 Tm .870651 Tw 12 TL /F3 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (can take as first argument a string, as in the examples before, or a function.) Tj T* 0 Tw .224985 Tw (This is the most common usage, since typically you want to decorate a pre-existing function. A framework) Tj T* 0 Tw 1.606136 Tw (author may want to use directly ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (instead of ) Tj /F3 10 Tf 0 0 0 rg (decorator) Tj /F1 10 Tf 0 0 0 rg (, since it gives you) Tj T* 0 Tw 1.36686 Tw (direct access to the body of the generated function. For instance, suppose you want to instrument the) Tj T* 0 Tw .372209 Tw /F3 10 Tf 0 0 0 rg (__init__ ) Tj /F1 10 Tf 0 0 0 rg (methods of a set of classes, by preserving their signature \(such use case is not made up; this) Tj T* 0 Tw .673828 Tw (is done in SQAlchemy and in other frameworks\). When the first argument of ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker.create) Tj T* 0 Tw 3.405814 Tw /F1 10 Tf 0 0 0 rg (is a function, a ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (object is instantiated internally, with attributes ) Tj /F3 10 Tf 0 0 0 rg (args) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F3 10 Tf 0 0 0 rg (varargs) Tj /F1 10 Tf 0 0 0 rg (,) Tj T* 0 Tw 5.509982 Tw /F3 10 Tf 0 0 0 rg (keywords ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F3 10 Tf 0 0 0 rg (defaults ) Tj /F1 10 Tf 0 0 0 rg (which are the the return values of the standard library function) Tj T* 0 Tw .561318 Tw /F3 10 Tf 0 0 0 rg (inspect.getargspec) Tj /F1 10 Tf 0 0 0 rg (. For each argument in the ) Tj /F3 10 Tf 0 0 0 rg (args ) Tj /F1 10 Tf 0 0 0 rg (\(which is a list of strings containing the names) Tj T* 0 Tw 1.599985 Tw (of the mandatory arguments\) an attribute ) Tj /F3 10 Tf 0 0 0 rg (arg0) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F3 10 Tf 0 0 0 rg (arg1) Tj /F1 10 Tf 0 0 0 rg (, ..., ) Tj /F3 10 Tf 0 0 0 rg (argN ) Tj /F1 10 Tf 0 0 0 rg (is also generated. Finally, there is a) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (signature ) Tj /F1 10 Tf 0 0 0 rg (attribute, a string with the signature of the original function.) Tj T* ET
Q
Q
-
-endstream
-endobj
-105 0 obj
-<< /Length 15172 >>
-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 530.8236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Getting the source code) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 666.0236 cm
+1 0 0 1 62.69291 452.8236 cm
q
BT 1 0 0 1 0 62 Tm 5.045529 Tw 12 TL /F1 10 Tf 0 0 0 rg (Internally ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (uses ) Tj /F3 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (to generate the decorated function. Therefore) Tj T* 0 Tw 2.542126 Tw /F3 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (will not work for decorated functions. That means that the usual '??' trick in) Tj T* 0 Tw 26.45775 Tw (IPython will give you the \(right on the spot\) message) Tj T* 0 Tw .261647 Tw /F3 10 Tf 0 0 0 rg (Dynamically) Tj ( ) Tj (generated) Tj ( ) Tj (function.) Tj ( ) Tj (No) Tj ( ) Tj (source) Tj ( ) Tj (code available) Tj /F1 10 Tf 0 0 0 rg (. In the past I have considered) Tj T* 0 Tw .945366 Tw (this acceptable, since ) Tj /F3 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (does not really work even with regular decorators. In that) Tj T* 0 Tw (case ) Tj /F3 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (gives you the wrapper source code which is probably not what you want:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 596.8236 cm
+1 0 0 1 62.69291 383.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -4951,7 +4721,7 @@ Q Q
Q
q
-1 0 0 1 62.69291 479.6236 cm
+1 0 0 1 62.69291 266.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -5055,13 +4825,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 423.6236 cm
+1 0 0 1 62.69291 210.4236 cm
q
BT 1 0 0 1 0 38 Tm 1.471235 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(see bug report ) Tj 0 0 .501961 rg (1764286 ) Tj 0 0 0 rg (for an explanation of what is happening\). Unfortunately the bug is still there,) Tj T* 0 Tw 1.541235 Tw (even in Python 2.7 and 3.1. There is however a workaround. The decorator module adds an attribute) Tj T* 0 Tw .103984 Tw /F3 10 Tf 0 0 0 rg (.__wrapped__ ) Tj /F1 10 Tf 0 0 0 rg (to the decorated function, containing a reference to the original function. The easy way to) Tj T* 0 Tw (get the source code is to call ) Tj /F3 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (on the undecorated function:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 306.4236 cm
+1 0 0 1 62.69291 93.22362 cm
q
q
1 0 0 1 0 0 cm
@@ -5170,20 +4940,27 @@ Q Q
Q
Q
+
+endstream
+endobj
+104 0 obj
+<< /Length 15036 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 273.4236 cm
+1 0 0 1 62.69291 744.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Dealing with third party decorators) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 219.4236 cm
+1 0 0 1 62.69291 690.0236 cm
q
BT 1 0 0 1 0 38 Tm .321654 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes you find on the net some cool decorator that you would like to include in your code. However,) Tj T* 0 Tw .50061 Tw (more often than not the cool decorator is not signature-preserving. Therefore you may want an easy way) Tj T* 0 Tw 1.814597 Tw (to upgrade third party decorators to signature-preserving decorators without having to rewrite them in) Tj T* 0 Tw (terms of ) Tj /F3 10 Tf 0 0 0 rg (decorator) Tj /F1 10 Tf 0 0 0 rg (. You can use a ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (to implement that functionality as follows:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 102.2236 cm
+1 0 0 1 62.69291 572.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -5270,33 +5047,26 @@ Q Q
Q
Q
-
-endstream
-endobj
-106 0 obj
-<< /Length 16103 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 741.0236 cm
+1 0 0 1 62.69291 540.8236 cm
q
BT 1 0 0 1 0 14 Tm .698314 Tw 12 TL /F3 10 Tf 0 0 0 rg (decorator_apply ) Tj /F1 10 Tf 0 0 0 rg (sets the attribute ) Tj /F3 10 Tf 0 0 0 rg (.__wrapped__ ) Tj /F1 10 Tf 0 0 0 rg (of the generated function to the original function,) Tj T* 0 Tw (so that you can get the right source code.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 699.0236 cm
+1 0 0 1 62.69291 498.8236 cm
q
BT 1 0 0 1 0 26 Tm .13104 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that I am not providing this functionality in the ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module directly since I think it is best to) Tj T* 0 Tw 2.070751 Tw (rewrite the decorator rather than adding an additional level of indirection. However, practicality beats) Tj T* 0 Tw (purity, so you can add ) Tj /F3 10 Tf 0 0 0 rg (decorator_apply ) Tj /F1 10 Tf 0 0 0 rg (to your toolbox and use it if you need to.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 645.0236 cm
+1 0 0 1 62.69291 444.8236 cm
q
BT 1 0 0 1 0 38 Tm 1.74881 Tw 12 TL /F1 10 Tf 0 0 0 rg (In order to give an example of usage of ) Tj /F3 10 Tf 0 0 0 rg (decorator_apply) Tj /F1 10 Tf 0 0 0 rg (, I will show a pretty slick decorator that) Tj T* 0 Tw 1.276651 Tw (converts a tail-recursive function in an iterative function. I have shamelessly stolen the basic idea from) Tj T* 0 Tw 43.62829 Tw (Kay Schluehr's recipe in the Python Cookbook,) Tj T* 0 Tw 0 0 .501961 rg (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj 0 0 0 rg (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 275.8236 cm
+1 0 0 1 62.69291 99.62362 cm
q
q
1 0 0 1 0 0 cm
@@ -5306,225 +5076,252 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 360 re B*
+n -6 -6 468.6898 336 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 336 30 12 re f*
+n 0 312 30 12 re f*
.960784 .960784 .862745 rg
-n 36 336 78 12 re f*
+n 36 312 78 12 re f*
.960784 .960784 .862745 rg
-n 114 336 6 12 re f*
+n 114 312 6 12 re f*
.960784 .960784 .862745 rg
-n 120 336 36 12 re f*
+n 120 312 36 12 re f*
.960784 .960784 .862745 rg
-n 156 336 12 12 re f*
+n 156 312 12 12 re f*
.960784 .960784 .862745 rg
-n 24 324 18 12 re f*
+n 24 300 18 12 re f*
.960784 .960784 .862745 rg
-n 0 312 354 12 re f*
+n 0 288 354 12 re f*
.960784 .960784 .862745 rg
-n 0 300 396 12 re f*
+n 0 276 396 12 re f*
.960784 .960784 .862745 rg
-n 0 288 276 12 re f*
+n 0 264 276 12 re f*
.960784 .960784 .862745 rg
-n 0 276 42 12 re f*
+n 0 252 42 12 re f*
.960784 .960784 .862745 rg
-n 24 252 18 12 re f*
+n 24 228 18 12 re f*
.960784 .960784 .862745 rg
-n 48 252 48 12 re f*
+n 48 228 48 12 re f*
.960784 .960784 .862745 rg
-n 96 252 6 12 re f*
+n 96 228 6 12 re f*
.960784 .960784 .862745 rg
-n 102 252 24 12 re f*
+n 102 228 24 12 re f*
.960784 .960784 .862745 rg
-n 126 252 6 12 re f*
+n 126 228 6 12 re f*
.960784 .960784 .862745 rg
-n 138 252 24 12 re f*
+n 138 228 24 12 re f*
.960784 .960784 .862745 rg
-n 162 252 12 12 re f*
+n 162 228 12 12 re f*
.960784 .960784 .862745 rg
-n 48 240 24 12 re f*
+n 48 216 24 12 re f*
.960784 .960784 .862745 rg
-n 72 240 6 12 re f*
+n 72 216 6 12 re f*
.960784 .960784 .862745 rg
-n 78 240 24 12 re f*
+n 78 216 24 12 re f*
.960784 .960784 .862745 rg
-n 108 240 6 12 re f*
+n 108 216 6 12 re f*
.960784 .960784 .862745 rg
-n 120 240 24 12 re f*
+n 120 216 24 12 re f*
.960784 .960784 .862745 rg
-n 48 228 24 12 re f*
+n 48 204 24 12 re f*
.960784 .960784 .862745 rg
-n 72 228 6 12 re f*
+n 72 204 6 12 re f*
.960784 .960784 .862745 rg
-n 78 228 54 12 re f*
+n 78 204 54 12 re f*
.960784 .960784 .862745 rg
-n 138 228 6 12 re f*
+n 138 204 6 12 re f*
.960784 .960784 .862745 rg
-n 150 228 24 12 re f*
+n 150 204 24 12 re f*
.960784 .960784 .862745 rg
-n 48 216 24 12 re f*
+n 48 192 24 12 re f*
.960784 .960784 .862745 rg
-n 72 216 6 12 re f*
+n 72 192 6 12 re f*
.960784 .960784 .862745 rg
-n 78 216 48 12 re f*
+n 78 192 48 12 re f*
.960784 .960784 .862745 rg
-n 132 216 6 12 re f*
+n 132 192 6 12 re f*
.960784 .960784 .862745 rg
-n 144 216 36 12 re f*
+n 144 192 36 12 re f*
.960784 .960784 .862745 rg
-n 180 216 12 12 re f*
+n 180 192 12 12 re f*
.960784 .960784 .862745 rg
-n 204 216 60 12 re f*
+n 204 192 60 12 re f*
.960784 .960784 .862745 rg
-n 24 192 18 12 re f*
+n 24 168 18 12 re f*
.960784 .960784 .862745 rg
-n 48 192 48 12 re f*
+n 48 168 48 12 re f*
.960784 .960784 .862745 rg
-n 96 192 6 12 re f*
+n 96 168 6 12 re f*
.960784 .960784 .862745 rg
-n 102 192 24 12 re f*
+n 102 168 24 12 re f*
.960784 .960784 .862745 rg
-n 126 192 6 12 re f*
+n 126 168 6 12 re f*
.960784 .960784 .862745 rg
-n 138 192 6 12 re f*
+n 138 168 6 12 re f*
.960784 .960784 .862745 rg
-n 144 192 24 12 re f*
+n 144 168 24 12 re f*
.960784 .960784 .862745 rg
-n 168 192 6 12 re f*
+n 168 168 6 12 re f*
.960784 .960784 .862745 rg
-n 180 192 12 12 re f*
+n 180 168 12 12 re f*
.960784 .960784 .862745 rg
-n 192 192 18 12 re f*
+n 192 168 18 12 re f*
.960784 .960784 .862745 rg
-n 210 192 12 12 re f*
+n 210 168 12 12 re f*
.960784 .960784 .862745 rg
-n 48 180 48 12 re f*
+n 48 156 48 12 re f*
.960784 .960784 .862745 rg
-n 102 180 6 12 re f*
+n 102 156 6 12 re f*
.960784 .960784 .862745 rg
-n 114 180 24 12 re f*
+n 114 156 24 12 re f*
.960784 .960784 .862745 rg
-n 138 180 6 12 re f*
+n 138 156 6 12 re f*
.960784 .960784 .862745 rg
-n 144 180 48 12 re f*
+n 144 156 48 12 re f*
.960784 .960784 .862745 rg
-n 48 168 12 12 re f*
+n 48 144 12 12 re f*
.960784 .960784 .862745 rg
-n 66 168 24 12 re f*
+n 66 144 24 12 re f*
.960784 .960784 .862745 rg
-n 90 168 6 12 re f*
+n 90 144 6 12 re f*
.960784 .960784 .862745 rg
-n 96 168 54 12 re f*
+n 96 144 54 12 re f*
.960784 .960784 .862745 rg
-n 150 168 6 12 re f*
+n 150 144 6 12 re f*
.960784 .960784 .862745 rg
-n 72 156 24 12 re f*
+n 72 132 24 12 re f*
.960784 .960784 .862745 rg
-n 102 156 6 12 re f*
+n 102 132 6 12 re f*
.960784 .960784 .862745 rg
-n 114 156 24 12 re f*
+n 114 132 24 12 re f*
.960784 .960784 .862745 rg
-n 138 156 6 12 re f*
+n 138 132 6 12 re f*
.960784 .960784 .862745 rg
-n 144 156 24 12 re f*
+n 144 132 24 12 re f*
.960784 .960784 .862745 rg
-n 72 144 24 12 re f*
+n 72 120 24 12 re f*
.960784 .960784 .862745 rg
-n 96 144 6 12 re f*
+n 96 120 6 12 re f*
.960784 .960784 .862745 rg
-n 102 144 54 12 re f*
+n 102 120 54 12 re f*
.960784 .960784 .862745 rg
-n 162 144 6 12 re f*
+n 162 120 6 12 re f*
.960784 .960784 .862745 rg
-n 174 144 30 12 re f*
+n 174 120 30 12 re f*
.960784 .960784 .862745 rg
-n 72 132 18 12 re f*
+n 72 108 18 12 re f*
.960784 .960784 .862745 rg
-n 90 132 6 12 re f*
+n 90 108 6 12 re f*
.960784 .960784 .862745 rg
-n 96 120 30 12 re f*
+n 96 96 30 12 re f*
.960784 .960784 .862745 rg
-n 132 120 24 12 re f*
+n 132 96 24 12 re f*
.960784 .960784 .862745 rg
-n 156 120 6 12 re f*
+n 156 96 6 12 re f*
.960784 .960784 .862745 rg
-n 120 108 36 12 re f*
+n 120 84 36 12 re f*
.960784 .960784 .862745 rg
-n 162 108 6 12 re f*
+n 162 84 6 12 re f*
.960784 .960784 .862745 rg
-n 174 108 24 12 re f*
+n 174 84 24 12 re f*
.960784 .960784 .862745 rg
-n 198 108 6 12 re f*
+n 198 84 6 12 re f*
.960784 .960784 .862745 rg
-n 204 108 6 12 re f*
+n 204 84 6 12 re f*
.960784 .960784 .862745 rg
-n 210 108 24 12 re f*
+n 210 84 24 12 re f*
.960784 .960784 .862745 rg
-n 234 108 6 12 re f*
+n 234 84 6 12 re f*
.960784 .960784 .862745 rg
-n 246 108 12 12 re f*
+n 246 84 12 12 re f*
.960784 .960784 .862745 rg
-n 258 108 18 12 re f*
+n 258 84 18 12 re f*
.960784 .960784 .862745 rg
-n 276 108 6 12 re f*
+n 276 84 6 12 re f*
.960784 .960784 .862745 rg
-n 120 96 12 12 re f*
+n 120 72 12 12 re f*
.960784 .960784 .862745 rg
-n 138 96 36 12 re f*
+n 138 72 36 12 re f*
.960784 .960784 .862745 rg
-n 180 96 12 12 re f*
+n 180 72 12 12 re f*
.960784 .960784 .862745 rg
-n 198 96 48 12 re f*
+n 198 72 48 12 re f*
.960784 .960784 .862745 rg
-n 246 96 6 12 re f*
+n 246 72 6 12 re f*
.960784 .960784 .862745 rg
-n 264 96 108 12 re f*
+n 264 72 108 12 re f*
.960784 .960784 .862745 rg
-n 144 84 24 12 re f*
+n 144 60 24 12 re f*
.960784 .960784 .862745 rg
-n 168 84 6 12 re f*
+n 168 60 6 12 re f*
.960784 .960784 .862745 rg
-n 180 84 18 12 re f*
+n 180 60 18 12 re f*
.960784 .960784 .862745 rg
-n 204 84 6 12 re f*
+n 204 60 6 12 re f*
.960784 .960784 .862745 rg
-n 216 84 24 12 re f*
+n 216 60 24 12 re f*
.960784 .960784 .862745 rg
-n 240 84 6 12 re f*
+n 240 60 6 12 re f*
.960784 .960784 .862745 rg
-n 246 84 42 12 re f*
+n 246 60 42 12 re f*
.960784 .960784 .862745 rg
-n 120 72 24 12 re f*
+n 120 48 24 12 re f*
.960784 .960784 .862745 rg
-n 144 72 6 12 re f*
+n 144 48 6 12 re f*
.960784 .960784 .862745 rg
-n 162 72 66 12 re f*
+n 162 48 66 12 re f*
.960784 .960784 .862745 rg
-n 144 60 36 12 re f*
+n 144 36 36 12 re f*
.960784 .960784 .862745 rg
-n 186 60 36 12 re f*
+n 186 36 36 12 re f*
.960784 .960784 .862745 rg
-n 72 48 42 12 re f*
+n 72 24 42 12 re f*
.960784 .960784 .862745 rg
-n 114 48 6 12 re f*
+n 114 24 6 12 re f*
.960784 .960784 .862745 rg
-n 96 36 24 12 re f*
+n 96 12 24 12 re f*
.960784 .960784 .862745 rg
-n 120 36 6 12 re f*
+n 120 12 6 12 re f*
.960784 .960784 .862745 rg
-n 126 36 54 12 re f*
+n 126 12 54 12 re f*
.960784 .960784 .862745 rg
-n 186 36 6 12 re f*
+n 186 12 6 12 re f*
.960784 .960784 .862745 rg
-n 198 36 24 12 re f*
+n 198 12 24 12 re f*
.960784 .960784 .862745 rg
-n 48 24 24 12 re f*
+n 48 0 24 12 re f*
.960784 .960784 .862745 rg
-n 72 24 6 12 re f*
+n 72 0 6 12 re f*
.960784 .960784 .862745 rg
-n 90 24 234 12 re f*
+n 90 0 234 12 re f*
+BT 1 0 0 1 0 314 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (class) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf 0 0 1 rg (TailRecursive) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( tail_recursive decorator based on Kay Schluehr's recipe) Tj T* ( http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj T* ( with improvements by me and George Sakkis.) Tj T* ( """) Tj /F3 10 Tf 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# sentinel) Tj /F3 10 Tf 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (if) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (False) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (try) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (while) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (if) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (is) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# update arguments) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (else) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# last call) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (finally) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (else) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# return the arguments of the tail call) Tj /F3 10 Tf 0 0 0 rg T* ET
+Q
+Q
+Q
+Q
+Q
+
+endstream
+endobj
+105 0 obj
+<< /Length 9951 >>
+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
.960784 .960784 .862745 rg
n 72 12 24 12 re f*
.960784 .960784 .862745 rg
@@ -5543,21 +5340,21 @@ n 198 12 18 12 re f* n 72 0 36 12 re f*
.960784 .960784 .862745 rg
n 114 0 48 12 re f*
-BT 1 0 0 1 0 338 Tm 12 TL /F5 10 Tf 0 .501961 0 rg (class) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf 0 0 1 rg (TailRecursive) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( tail_recursive decorator based on Kay Schluehr's recipe) Tj T* ( http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj T* ( with improvements by me and George Sakkis.) Tj T* ( """) Tj /F3 10 Tf 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# sentinel) Tj /F3 10 Tf 0 0 0 rg T* T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (if) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (False) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (try) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (while) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (if) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (is) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# update arguments) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (else) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# last call) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (finally) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (else) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# return the arguments of the tail call) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj T* ET
+BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 255.8236 cm
+1 0 0 1 62.69291 707.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here the decorator is implemented as a class returning callable objects.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 210.6236 cm
+1 0 0 1 62.69291 662.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -5601,14 +5398,14 @@ Q Q
Q
q
-1 0 0 1 62.69291 190.6236 cm
+1 0 0 1 62.69291 642.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is how you apply the upgraded decorator to the good old factorial:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 97.42362 cm
+1 0 0 1 62.69291 549.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -5685,15 +5482,8 @@ Q Q
Q
Q
-
-endstream
-endobj
-107 0 obj
-<< /Length 6232 >>
-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
+1 0 0 1 62.69291 504.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -5733,13 +5523,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 671.8236 cm
+1 0 0 1 62.69291 448.2236 cm
q
BT 1 0 0 1 0 38 Tm .188935 Tw 12 TL /F1 10 Tf 0 0 0 rg (This decorator is pretty impressive, and should give you some food for your mind ;\) Notice that there is no) Tj T* 0 Tw 1.339983 Tw (recursion limit now, and you can easily compute ) Tj /F3 10 Tf 0 0 0 rg (factorial\(1001\) ) Tj /F1 10 Tf 0 0 0 rg (or larger without filling the stack) Tj T* 0 Tw .909431 Tw (frame. Notice also that the decorator will not work on functions which are not tail recursive, such as the) Tj T* 0 Tw (following) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 602.6236 cm
+1 0 0 1 62.69291 379.0236 cm
q
q
1 0 0 1 0 0 cm
@@ -5803,27 +5593,27 @@ Q Q
Q
q
-1 0 0 1 62.69291 570.6236 cm
+1 0 0 1 62.69291 347.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .541098 Tw (\(reminder: a function is tail recursive if it either returns a value without making a recursive call, or returns) Tj T* 0 Tw (directly the result of a recursive call\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 537.6236 cm
+1 0 0 1 62.69291 314.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Caveats and limitations) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 507.6236 cm
+1 0 0 1 62.69291 284.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .474987 Tw (The first thing you should be aware of, it the fact that decorators have a performance penalty. The worse) Tj T* 0 Tw (case is shown by the following example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 282.4236 cm
+1 0 0 1 62.69291 82.82362 cm
q
q
1 0 0 1 0 0 cm
@@ -5833,24 +5623,52 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 216 re B*
+n -6 -6 468.6898 192 re B*
Q
q
0 0 0 rg
-BT 1 0 0 1 0 194 Tm /F3 10 Tf 12 TL ($ cat performance.sh) Tj T* (python3 -m timeit -s ") Tj T* (from decorator import decorator) Tj T* T* (@decorator) Tj T* (def do_nothing\(func, *args, **kw\):) Tj T* ( return func\(*args, **kw\)) Tj T* T* (@do_nothing) Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* T* (python3 -m timeit -s ") Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* ET
+BT 1 0 0 1 0 170 Tm /F3 10 Tf 12 TL ($ cat performance.sh) Tj T* (python3 -m timeit -s ") Tj T* (from decorator import decorator) Tj T* T* (@decorator) Tj T* (def do_nothing\(func, *args, **kw\):) Tj T* ( return func\(*args, **kw\)) Tj T* T* (@do_nothing) Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* T* (python3 -m timeit -s ") Tj T* (def f\(\):) Tj T* ET
Q
Q
Q
Q
Q
+
+endstream
+endobj
+106 0 obj
+<< /Length 12555 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 262.4236 cm
+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 14 Tm /F3 10 Tf 12 TL ( pass) Tj T* (" "f\(\)") Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 707.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (On my laptop, using the ) Tj /F3 10 Tf 0 0 0 rg (do_nothing ) Tj /F1 10 Tf 0 0 0 rg (decorator instead of the plain function is five times slower:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 205.2236 cm
+1 0 0 1 62.69291 650.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -5871,27 +5689,20 @@ Q Q
Q
q
-1 0 0 1 62.69291 161.2236 cm
+1 0 0 1 62.69291 606.6236 cm
q
BT 1 0 0 1 0 26 Tm 1.25832 Tw 12 TL /F1 10 Tf 0 0 0 rg (It should be noted that a real life function would probably do something more useful than ) Tj /F3 10 Tf 0 0 0 rg (f ) Tj /F1 10 Tf 0 0 0 rg (here, and) Tj T* 0 Tw .91811 Tw (therefore in real life the performance penalty could be completely negligible. As always, the only way to) Tj T* 0 Tw (know if there is a penalty in your specific use case is to measure it.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 131.2236 cm
+1 0 0 1 62.69291 576.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .867984 Tw (You should be aware that decorators will make your tracebacks longer and more difficult to understand.) Tj T* 0 Tw (Consider this example:) Tj T* ET
Q
Q
-
-endstream
-endobj
-108 0 obj
-<< /Length 17066 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 715.8236 cm
+1 0 0 1 62.69291 519.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -5935,13 +5746,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 683.8236 cm
+1 0 0 1 62.69291 487.4236 cm
q
BT 1 0 0 1 0 14 Tm .583318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Calling ) Tj /F3 10 Tf 0 0 0 rg (f\(\) ) Tj /F1 10 Tf 0 0 0 rg (will give you a ) Tj /F3 10 Tf 0 0 0 rg (ZeroDivisionError) Tj /F1 10 Tf 0 0 0 rg (, but since the function is decorated the traceback will) Tj T* 0 Tw (be longer:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 554.6236 cm
+1 0 0 1 62.69291 358.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -6089,31 +5900,31 @@ Q Q
Q
q
-1 0 0 1 62.69291 486.6236 cm
+1 0 0 1 62.69291 290.2236 cm
q
BT 1 0 0 1 0 50 Tm 1.05528 Tw 12 TL /F1 10 Tf 0 0 0 rg (You see here the inner call to the decorator ) Tj /F3 10 Tf 0 0 0 rg (trace) Tj /F1 10 Tf 0 0 0 rg (, which calls ) Tj /F3 10 Tf 0 0 0 rg (f\(*args,) Tj ( ) Tj (**kw\)) Tj /F1 10 Tf 0 0 0 rg (, and a reference to) Tj T* 0 Tw .076457 Tw /F3 10 Tf 0 0 0 rg (File) Tj ( ) Tj (") Tj (<) Tj (string) Tj (>) Tj (",) Tj ( ) Tj (line) Tj ( ) Tj (2,) Tj ( ) Tj (in) Tj ( ) Tj (f) Tj /F1 10 Tf 0 0 0 rg (. This latter reference is due to the fact that internally the decorator) Tj T* 0 Tw 2.053318 Tw (module uses ) Tj /F3 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (to generate the decorated function. Notice that ) Tj /F3 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (is ) Tj /F4 10 Tf (not ) Tj /F1 10 Tf (responsibile for the) Tj T* 0 Tw 1.507485 Tw (performance penalty, since is the called ) Tj /F4 10 Tf (only once ) Tj /F1 10 Tf (at function decoration time, and not every time the) Tj T* 0 Tw (decorated function is called.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 408.6236 cm
+1 0 0 1 62.69291 212.2236 cm
q
BT 1 0 0 1 0 62 Tm .932209 Tw 12 TL /F1 10 Tf 0 0 0 rg (At present, there is no clean way to avoid ) Tj /F3 10 Tf 0 0 0 rg (exec) Tj /F1 10 Tf 0 0 0 rg (. A clean solution would require to change the CPython) Tj T* 0 Tw .777485 Tw (implementation of functions and add an hook to make it possible to change their signature directly. That) Tj T* 0 Tw .74186 Tw (could happen in future versions of Python \(see PEP ) Tj 0 0 .501961 rg (362) Tj 0 0 0 rg (\) and then the decorator module would become) Tj T* 0 Tw 2.385318 Tw (obsolete. However, at present, even in Python 3.5 it is impossible to change the function signature) Tj T* 0 Tw 1.372485 Tw (directly, therefore the ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module is still useful. Actually, this is the main reasons why I keep) Tj T* 0 Tw (maintaining the module and releasing new versions.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 366.6236 cm
+1 0 0 1 62.69291 170.2236 cm
q
BT 1 0 0 1 0 26 Tm 1.043828 Tw 12 TL /F1 10 Tf 0 0 0 rg (In the present implementation, decorators generated by ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (can only be used on user-defined) Tj T* 0 Tw .152485 Tw (Python functions or methods, not on generic callable objects, nor on built-in functions, due to limitations of) Tj T* 0 Tw (the ) Tj /F3 10 Tf 0 0 0 rg (inspect ) Tj /F1 10 Tf 0 0 0 rg (module in the standard library.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 336.6236 cm
+1 0 0 1 62.69291 140.2236 cm
q
BT 1 0 0 1 0 14 Tm .785777 Tw 12 TL /F1 10 Tf 0 0 0 rg (There is a restriction on the names of the arguments: for instance, if try to call an argument ) Tj /F3 10 Tf 0 0 0 rg (_call_ ) Tj /F1 10 Tf 0 0 0 rg (or) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (_func_ ) Tj /F1 10 Tf 0 0 0 rg (you will get a ) Tj /F3 10 Tf 0 0 0 rg (NameError) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 219.4236 cm
+1 0 0 1 62.69291 83.02362 cm
q
q
1 0 0 1 0 0 cm
@@ -6123,39 +5934,66 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 108 re B*
+n -6 -6 468.6898 48 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 84 6 12 re f*
+n 0 24 6 12 re f*
.960784 .960784 .862745 rg
-n 6 84 6 12 re f*
+n 6 24 6 12 re f*
.960784 .960784 .862745 rg
-n 12 84 6 12 re f*
+n 12 24 6 12 re f*
.960784 .960784 .862745 rg
-n 24 84 36 12 re f*
+n 24 24 36 12 re f*
.960784 .960784 .862745 rg
-n 0 72 18 12 re f*
+n 0 12 18 12 re f*
.960784 .960784 .862745 rg
-n 24 72 18 12 re f*
+n 24 12 18 12 re f*
.960784 .960784 .862745 rg
-n 48 72 6 12 re f*
+n 48 12 6 12 re f*
.960784 .960784 .862745 rg
-n 54 72 6 12 re f*
+n 54 12 6 12 re f*
.960784 .960784 .862745 rg
-n 60 72 36 12 re f*
+n 60 12 36 12 re f*
.960784 .960784 .862745 rg
-n 96 72 12 12 re f*
+n 96 12 12 12 re f*
.960784 .960784 .862745 rg
-n 114 72 30 12 re f*
+n 114 12 30 12 re f*
.960784 .960784 .862745 rg
-n 144 72 6 12 re f*
+n 144 12 6 12 re f*
.960784 .960784 .862745 rg
-n 150 72 6 12 re f*
+n 150 12 6 12 re f*
.960784 .960784 .862745 rg
-n 156 72 6 12 re f*
+n 156 12 6 12 re f*
.960784 .960784 .862745 rg
-n 0 60 18 12 re f*
+n 0 0 18 12 re f*
+BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* ET
+Q
+Q
+Q
+Q
+Q
+
+endstream
+endobj
+107 0 obj
+<< /Length 12503 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 691.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 72 re B*
+Q
+q
.960784 .960784 .862745 rg
n 0 48 54 12 re f*
.960784 .960784 .862745 rg
@@ -6208,20 +6046,20 @@ n 144 0 6 12 re f* n 156 0 36 12 re f*
.960784 .960784 .862745 rg
n 192 0 6 12 re f*
-BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (print) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* 0 0 0 rg (Traceback) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (most) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (recent) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (call) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (last) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F5 10 Tf .823529 .254902 .227451 rg (NameError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (is) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (overridden) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg T* /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (_call_) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\)) Tj T* ET
+BT 1 0 0 1 0 50 Tm 12 TL /F3 10 Tf 0 0 0 rg (Traceback) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (most) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (recent) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (call) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (last) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F5 10 Tf .823529 .254902 .227451 rg (NameError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (is) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (overridden) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg T* /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (_call_) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 199.4236 cm
+1 0 0 1 62.69291 671.8236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Finally, the implementation is such that ) Tj /F4 10 Tf (the decorated function shares the original function dictionary) Tj /F1 10 Tf (:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 82.22362 cm
+1 0 0 1 62.69291 518.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -6231,122 +6069,95 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 108 re B*
+n -6 -6 468.6898 144 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 84 6 12 re f*
-.960784 .960784 .862745 rg
-n 6 84 6 12 re f*
+n 0 120 6 12 re f*
.960784 .960784 .862745 rg
-n 12 84 6 12 re f*
+n 6 120 6 12 re f*
.960784 .960784 .862745 rg
-n 24 84 18 12 re f*
+n 12 120 6 12 re f*
.960784 .960784 .862745 rg
-n 48 84 6 12 re f*
+n 24 120 18 12 re f*
.960784 .960784 .862745 rg
-n 54 84 18 12 re f*
+n 48 120 6 12 re f*
.960784 .960784 .862745 rg
-n 78 84 24 12 re f*
+n 54 120 18 12 re f*
.960784 .960784 .862745 rg
-n 108 84 138 12 re f*
+n 78 120 24 12 re f*
.960784 .960784 .862745 rg
-n 0 72 6 12 re f*
+n 108 120 138 12 re f*
.960784 .960784 .862745 rg
-n 6 72 6 12 re f*
+n 0 108 6 12 re f*
.960784 .960784 .862745 rg
-n 12 72 6 12 re f*
+n 6 108 6 12 re f*
.960784 .960784 .862745 rg
-n 24 72 6 12 re f*
+n 12 108 6 12 re f*
.960784 .960784 .862745 rg
-n 30 72 6 12 re f*
+n 24 108 6 12 re f*
.960784 .960784 .862745 rg
-n 36 72 30 12 re f*
+n 30 108 6 12 re f*
.960784 .960784 .862745 rg
-n 72 72 6 12 re f*
+n 36 108 30 12 re f*
.960784 .960784 .862745 rg
-n 84 72 66 12 re f*
+n 72 108 6 12 re f*
.960784 .960784 .862745 rg
-n 156 72 132 12 re f*
+n 84 108 66 12 re f*
.960784 .960784 .862745 rg
-n 0 60 6 12 re f*
+n 156 108 132 12 re f*
.960784 .960784 .862745 rg
-n 6 60 6 12 re f*
+n 0 96 6 12 re f*
.960784 .960784 .862745 rg
-n 12 60 6 12 re f*
+n 6 96 6 12 re f*
.960784 .960784 .862745 rg
-n 24 60 6 12 re f*
+n 12 96 6 12 re f*
.960784 .960784 .862745 rg
-n 30 60 6 12 re f*
+n 24 96 6 12 re f*
.960784 .960784 .862745 rg
-n 36 60 30 12 re f*
+n 30 96 6 12 re f*
.960784 .960784 .862745 rg
-n 72 60 6 12 re f*
+n 36 96 30 12 re f*
.960784 .960784 .862745 rg
-n 84 60 96 12 re f*
+n 72 96 6 12 re f*
.960784 .960784 .862745 rg
-n 186 60 162 12 re f*
+n 84 96 96 12 re f*
.960784 .960784 .862745 rg
-n 0 36 6 12 re f*
+n 186 96 162 12 re f*
.960784 .960784 .862745 rg
-n 6 36 6 12 re f*
+n 0 72 6 12 re f*
.960784 .960784 .862745 rg
-n 12 36 6 12 re f*
+n 6 72 6 12 re f*
.960784 .960784 .862745 rg
-n 24 36 48 12 re f*
+n 12 72 6 12 re f*
.960784 .960784 .862745 rg
-n 78 36 6 12 re f*
+n 24 72 48 12 re f*
.960784 .960784 .862745 rg
-n 90 36 30 12 re f*
+n 78 72 6 12 re f*
.960784 .960784 .862745 rg
-n 120 36 6 12 re f*
+n 90 72 30 12 re f*
.960784 .960784 .862745 rg
-n 126 36 6 12 re f*
+n 120 72 6 12 re f*
.960784 .960784 .862745 rg
-n 132 36 6 12 re f*
+n 126 72 6 12 re f*
.960784 .960784 .862745 rg
-n 144 36 144 12 re f*
+n 132 72 6 12 re f*
.960784 .960784 .862745 rg
-n 0 12 6 12 re f*
+n 144 72 144 12 re f*
.960784 .960784 .862745 rg
-n 6 12 6 12 re f*
+n 0 48 6 12 re f*
.960784 .960784 .862745 rg
-n 12 12 6 12 re f*
+n 6 48 6 12 re f*
.960784 .960784 .862745 rg
-n 24 12 48 12 re f*
+n 12 48 6 12 re f*
.960784 .960784 .862745 rg
-n 72 12 6 12 re f*
+n 24 48 48 12 re f*
.960784 .960784 .862745 rg
-n 78 12 30 12 re f*
+n 72 48 6 12 re f*
.960784 .960784 .862745 rg
-n 0 0 66 12 re f*
-BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (pass) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original function) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting an attribute) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something else") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting another attribute) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the decorated function) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj 0 0 0 rg T* .729412 .129412 .129412 rg ('something') Tj 0 0 0 rg T* ET
-Q
-Q
-Q
-Q
-Q
-
-endstream
-endobj
-109 0 obj
-<< /Length 7932 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 715.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
+n 78 48 30 12 re f*
.960784 .960784 .862745 rg
-n -6 -6 468.6898 48 re B*
-Q
-q
+n 0 36 66 12 re f*
.960784 .960784 .862745 rg
n 0 24 6 12 re f*
.960784 .960784 .862745 rg
@@ -6381,113 +6192,119 @@ n 36 12 30 12 re f* n 72 12 234 12 re f*
.960784 .960784 .862745 rg
n 0 0 96 12 re f*
-BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something different") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting attr) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original attribute did not change) Tj /F3 10 Tf 0 0 0 rg T* .729412 .129412 .129412 rg ('something else') Tj T* ET
+BT 1 0 0 1 0 122 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (pass) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original function) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting an attribute) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something else") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting another attribute) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the decorated function) Tj /F3 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj 0 0 0 rg T* .729412 .129412 .129412 rg ('something') Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("something different") Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# setting attr) Tj /F3 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original attribute did not change) Tj /F3 10 Tf 0 0 0 rg T* .729412 .129412 .129412 rg ('something else') Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 683.8236 cm
+1 0 0 1 62.69291 486.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 2.319986 Tw (If you don't like this behavior you can always save a copy of the original function dictionary before) Tj T* 0 Tw (decorating it.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 650.8236 cm
+1 0 0 1 62.69291 453.6236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Compatibility notes) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 608.8236 cm
+1 0 0 1 62.69291 411.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.344988 Tw (This version supports all Python releases from 2.6 to 3.5 with a single code base. In order to do so, I) Tj T* 0 Tw .332093 Tw (decided to drop the support for ancient versions of Python \(Python 2.5 is nearly ten year old\). If you need) Tj T* 0 Tw (to support ancient versions of Python, stick with the decorator module 3.4.2.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 575.8236 cm
+1 0 0 1 62.69291 378.6236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Historical notes) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 557.8236 cm
+1 0 0 1 62.69291 360.6236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The decorator module is over ten years old. Here a few notes on its evolution, for whoever is interested.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 503.8236 cm
+1 0 0 1 62.69291 306.6236 cm
q
BT 1 0 0 1 0 38 Tm .537488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 4 drops support for Python 2.4 and 2.5 and makes it possible to use a single code base both for) Tj T* 0 Tw 2.264987 Tw (Python 2 and Python 3. This is a ) Tj /F4 10 Tf (huge ) Tj /F1 10 Tf (bonus, since I could remove over 2,000 lines of duplicated) Tj T* 0 Tw 1.959269 Tw (documentation. Having to maintain separate docs for Python 2 and Python 3 effectively stopped any) Tj T* 0 Tw (development on the module for several years.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 437.8236 cm
+1 0 0 1 62.69291 240.6236 cm
q
BT 1 0 0 1 0 50 Tm 1.864987 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 3.4 fixes some bugs in the support of recent versions of Python 3. Version 3.3 was the first) Tj T* 0 Tw .770697 Tw (version of the ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module to fully support Python 3, including ) Tj 0 0 .501961 rg (function annotations) Tj 0 0 0 rg (. Version 3.2) Tj T* 0 Tw .452093 Tw (was the first version to support Python 3 via the ) Tj /F3 10 Tf 0 0 0 rg (2to3 ) Tj /F1 10 Tf 0 0 0 rg (conversion tool. The hard work \(for me\) has been) Tj T* 0 Tw 2.514983 Tw (converting the documentation and the doctests. This has been possible only after that ) Tj 0 0 .501961 rg (docutils ) Tj 0 0 0 rg (and) Tj T* 0 Tw 0 0 .501961 rg (pygments ) Tj 0 0 0 rg (have been ported to Python 3.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 359.8236 cm
+1 0 0 1 62.69291 162.6236 cm
q
BT 1 0 0 1 0 62 Tm .793984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 3 of the ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module do not contain any backward incompatible change, apart from the) Tj T* 0 Tw 3.63498 Tw (removal of the functions ) Tj /F3 10 Tf 0 0 0 rg (get_info ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F3 10 Tf 0 0 0 rg (new_wrapper) Tj /F1 10 Tf 0 0 0 rg (, which have been deprecated for years.) Tj T* 0 Tw .293672 Tw /F3 10 Tf 0 0 0 rg (get_info ) Tj /F1 10 Tf 0 0 0 rg (has been removed since it was little used and since it had to be changed anyway to work with) Tj T* 0 Tw 2.298555 Tw (Python 3.0; ) Tj /F3 10 Tf 0 0 0 rg (new_wrapper ) Tj /F1 10 Tf 0 0 0 rg (has been removed since it was useless: its major use case \(converting) Tj T* 0 Tw 7.136976 Tw (signature changing decorators to signature preserving decorators\) has been subsumed by) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (decorator_apply) Tj /F1 10 Tf 0 0 0 rg (, whereas the other use case can be managed with the ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 317.8236 cm
+1 0 0 1 62.69291 120.6236 cm
q
BT 1 0 0 1 0 26 Tm 1.329213 Tw 12 TL /F1 10 Tf 0 0 0 rg (There are a few changes in the documentation: I removed the ) Tj /F3 10 Tf 0 0 0 rg (decorator_factory ) Tj /F1 10 Tf 0 0 0 rg (example, which) Tj T* 0 Tw 2.562927 Tw (was confusing some of my users, and I removed the part about exotic signatures in the Python 3) Tj T* 0 Tw (documentation, since Python 3 does not support them.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 251.8236 cm
+1 0 0 1 62.69291 78.62362 cm
+q
+BT 1 0 0 1 0 26 Tm .942651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (cannot be used as a class decorator and the ) Tj 0 0 .501961 rg (functionality introduced in version 2.3 ) Tj T* 0 Tw .241163 Tw 0 0 0 rg (has been removed. That means that in order to define decorator factories with classes you need to define ) Tj T* 0 Tw 1.122126 Tw (the ) Tj /F3 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method explicitly \(no magic anymore\). All these changes should not cause any trouble,) Tj T* 0 Tw ET
+Q
+Q
+
+endstream
+endobj
+108 0 obj
+<< /Length 3738 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 741.0236 cm
q
-BT 1 0 0 1 0 50 Tm .942651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally ) Tj /F3 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (cannot be used as a class decorator and the ) Tj 0 0 .501961 rg (functionality introduced in version 2.3) Tj T* 0 Tw .241163 Tw 0 0 0 rg (has been removed. That means that in order to define decorator factories with classes you need to define) Tj T* 0 Tw 1.122126 Tw (the ) Tj /F3 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method explicitly \(no magic anymore\). All these changes should not cause any trouble,) Tj T* 0 Tw .601163 Tw (since they were all rarely used features. Should you have any trouble, you can always downgrade to the) Tj T* 0 Tw (2.3 version.) Tj T* ET
+BT 1 0 0 1 0 14 Tm .601163 Tw 12 TL /F1 10 Tf 0 0 0 rg (since they were all rarely used features. Should you have any trouble, you can always downgrade to the) Tj T* 0 Tw (2.3 version.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 185.8236 cm
+1 0 0 1 62.69291 675.0236 cm
q
BT 1 0 0 1 0 50 Tm .196098 Tw 12 TL /F1 10 Tf 0 0 0 rg (The examples shown here have been tested with Python 2.6. Python 2.4 is also supported - of course the) Tj T* 0 Tw 1.649398 Tw (examples requiring the ) Tj /F3 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (statement will not work there. Python 2.5 works fine, but if you run the) Tj T* 0 Tw 1.41784 Tw (examples in the interactive interpreter you will notice a few differences since ) Tj /F3 10 Tf 0 0 0 rg (getargspec ) Tj /F1 10 Tf 0 0 0 rg (returns an) Tj T* 0 Tw .909982 Tw /F3 10 Tf 0 0 0 rg (ArgSpec ) Tj /F1 10 Tf 0 0 0 rg (namedtuple instead of a regular tuple. That means that running the file ) Tj /F3 10 Tf 0 0 0 rg (documentation.py) Tj T* 0 Tw /F1 10 Tf 0 0 0 rg (under Python 2.5 will print a few errors, but they are not serious.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 152.8236 cm
+1 0 0 1 62.69291 642.0236 cm
q
BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (LICENSE) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 134.8236 cm
+1 0 0 1 62.69291 624.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Copyright \(c\) 2005-2015, Michele Simionato All rights reserved.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 104.8236 cm
+1 0 0 1 62.69291 594.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.328555 Tw (Redistribution and use in source and binary forms, with or without modification, are permitted provided) Tj T* 0 Tw (that the following conditions are met:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 98.82362 cm
+1 0 0 1 62.69291 588.0236 cm
Q
-
-endstream
-endobj
-110 0 obj
-<< /Length 2070 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 717.0236 cm
+1 0 0 1 62.69291 540.0236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -6502,17 +6319,17 @@ q Q
Q
q
-1 0 0 1 62.69291 717.0236 cm
+1 0 0 1 62.69291 540.0236 cm
Q
q
-1 0 0 1 62.69291 591.0236 cm
+1 0 0 1 62.69291 414.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 110 Tm /F1 10 Tf 12 TL .17998 Tw (THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND) Tj T* 0 Tw 2.911797 Tw (ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED) Tj T* 0 Tw 5.165529 Tw (WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE) Tj T* 0 Tw 1.395433 Tw (DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE) Tj T* 0 Tw 5.53122 Tw (FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL) Tj T* 0 Tw 2.705976 Tw (DAMAGES \(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR) Tj T* 0 Tw 3.868976 Tw (SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION\) HOWEVER) Tj T* 0 Tw 1.326647 Tw (CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR) Tj T* 0 Tw 1.525366 Tw (TORT \(INCLUDING NEGLIGENCE OR OTHERWISE\) ARISING IN ANY WAY OUT OF THE USE OF) Tj T* 0 Tw (THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 561.0236 cm
+1 0 0 1 62.69291 384.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .407132 Tw (If you use this software and you are happy with it, consider sending me a note, just to gratify my ego. On) Tj T* 0 Tw (the other hand, if you use this software and you are unhappy with it, send me a patch!) Tj T* ET
@@ -6521,62 +6338,58 @@ Q endstream
endobj
-111 0 obj
-<< /Nums [ 0 112 0 R 1 113 0 R 2 114 0 R 3 115 0 R 4 116 0 R
- 5 117 0 R 6 118 0 R 7 119 0 R 8 120 0 R 9 121 0 R
- 10 122 0 R 11 123 0 R 12 124 0 R 13 125 0 R 14 126 0 R
- 15 127 0 R ] >>
+109 0 obj
+<< /Nums [ 0 110 0 R 1 111 0 R 2 112 0 R 3 113 0 R 4 114 0 R
+ 5 115 0 R 6 116 0 R 7 117 0 R 8 118 0 R 9 119 0 R
+ 10 120 0 R 11 121 0 R 12 122 0 R 13 123 0 R 14 124 0 R ] >>
endobj
-112 0 obj
+110 0 obj
<< /S /D /St 1 >>
endobj
-113 0 obj
+111 0 obj
<< /S /D /St 2 >>
endobj
-114 0 obj
+112 0 obj
<< /S /D /St 3 >>
endobj
-115 0 obj
+113 0 obj
<< /S /D /St 4 >>
endobj
-116 0 obj
+114 0 obj
<< /S /D /St 5 >>
endobj
-117 0 obj
+115 0 obj
<< /S /D /St 6 >>
endobj
-118 0 obj
+116 0 obj
<< /S /D /St 7 >>
endobj
-119 0 obj
+117 0 obj
<< /S /D /St 8 >>
endobj
-120 0 obj
+118 0 obj
<< /S /D /St 9 >>
endobj
-121 0 obj
+119 0 obj
<< /S /D /St 10 >>
endobj
-122 0 obj
+120 0 obj
<< /S /D /St 11 >>
endobj
-123 0 obj
+121 0 obj
<< /S /D /St 12 >>
endobj
-124 0 obj
+122 0 obj
<< /S /D /St 13 >>
endobj
-125 0 obj
+123 0 obj
<< /S /D /St 14 >>
endobj
-126 0 obj
+124 0 obj
<< /S /D /St 15 >>
endobj
-127 0 obj
-<< /S /D /St 16 >>
-endobj
xref
-0 128
+0 125
0000000000 65535 f
0000000075 00000 n
0000000162 00000 n
@@ -6634,82 +6447,79 @@ xref 0000009362 00000 n
0000009558 00000 n
0000009787 00000 n
-0000009998 00000 n
-0000010209 00000 n
-0000010420 00000 n
-0000010631 00000 n
-0000010842 00000 n
-0000011033 00000 n
-0000011263 00000 n
-0000011481 00000 n
-0000011711 00000 n
-0000011922 00000 n
-0000012117 00000 n
-0000012347 00000 n
-0000012543 00000 n
-0000012731 00000 n
-0000012907 00000 n
-0000013164 00000 n
-0000013415 00000 n
-0000013626 00000 n
-0000013736 00000 n
-0000013984 00000 n
-0000014062 00000 n
-0000014179 00000 n
-0000014308 00000 n
-0000014450 00000 n
-0000014580 00000 n
-0000014715 00000 n
-0000014853 00000 n
-0000014990 00000 n
-0000015116 00000 n
-0000015239 00000 n
-0000015371 00000 n
-0000015512 00000 n
-0000015653 00000 n
-0000015806 00000 n
-0000015947 00000 n
-0000016084 00000 n
-0000016218 00000 n
-0000016330 00000 n
-0000016504 00000 n
-0000025795 00000 n
-0000037766 00000 n
-0000054574 00000 n
-0000072304 00000 n
-0000091995 00000 n
-0000110490 00000 n
-0000124444 00000 n
-0000143559 00000 n
-0000158149 00000 n
-0000171801 00000 n
-0000187032 00000 n
-0000203194 00000 n
-0000209484 00000 n
-0000226609 00000 n
-0000234599 00000 n
-0000236727 00000 n
-0000236941 00000 n
-0000236979 00000 n
-0000237017 00000 n
-0000237055 00000 n
-0000237093 00000 n
-0000237131 00000 n
-0000237169 00000 n
-0000237207 00000 n
-0000237245 00000 n
-0000237283 00000 n
-0000237322 00000 n
-0000237361 00000 n
-0000237400 00000 n
-0000237439 00000 n
-0000237478 00000 n
-0000237517 00000 n
+0000009997 00000 n
+0000010208 00000 n
+0000010419 00000 n
+0000010630 00000 n
+0000010821 00000 n
+0000011051 00000 n
+0000011269 00000 n
+0000011499 00000 n
+0000011710 00000 n
+0000011905 00000 n
+0000012135 00000 n
+0000012331 00000 n
+0000012519 00000 n
+0000012695 00000 n
+0000012954 00000 n
+0000013205 00000 n
+0000013416 00000 n
+0000013526 00000 n
+0000013774 00000 n
+0000013852 00000 n
+0000013969 00000 n
+0000014098 00000 n
+0000014240 00000 n
+0000014370 00000 n
+0000014505 00000 n
+0000014643 00000 n
+0000014780 00000 n
+0000014906 00000 n
+0000015029 00000 n
+0000015161 00000 n
+0000015302 00000 n
+0000015443 00000 n
+0000015596 00000 n
+0000015737 00000 n
+0000015874 00000 n
+0000016008 00000 n
+0000016120 00000 n
+0000016287 00000 n
+0000025577 00000 n
+0000037548 00000 n
+0000054356 00000 n
+0000072086 00000 n
+0000091777 00000 n
+0000110271 00000 n
+0000129567 00000 n
+0000145813 00000 n
+0000159266 00000 n
+0000174865 00000 n
+0000189960 00000 n
+0000199969 00000 n
+0000212583 00000 n
+0000225145 00000 n
+0000228941 00000 n
+0000229140 00000 n
+0000229178 00000 n
+0000229216 00000 n
+0000229254 00000 n
+0000229292 00000 n
+0000229330 00000 n
+0000229368 00000 n
+0000229406 00000 n
+0000229444 00000 n
+0000229482 00000 n
+0000229521 00000 n
+0000229560 00000 n
+0000229599 00000 n
+0000229638 00000 n
+0000229677 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
- [(B\211}\276Z\317\374\2539\325\)\224_\370yr) (B\211}\276Z\317\374\2539\325\)\224_\370yr)]
- /Info 75 0 R /Root 74 0 R /Size 128 >>
+ [(\221J>\270\341\037/O\300 Er4\315\245\220) (\221J>\270\341\037/O\300 Er4\315\245\220)]
+ /Info 74 0 R /Root 73 0 R /Size 125 >>
startxref
-237556
+229716
%%EOF
|