diff options
| author | Michele Simionato <michele.simionato@gmail.com> | 2015-07-22 08:50:57 +0200 |
|---|---|---|
| committer | Michele Simionato <michele.simionato@gmail.com> | 2015-07-22 08:50:57 +0200 |
| commit | bfe11019156796384516d6038f7a66a87cca7e35 (patch) | |
| tree | 25898218cf34900d74fa3b480880739d785296b7 /documentation.pdf | |
| parent | 4b28eea14c0ab65e447cf2955c26bc9a8e5fd11b (diff) | |
| download | python-decorator-git-bfe11019156796384516d6038f7a66a87cca7e35.tar.gz | |
More docs and tests for the case of virtual ancestors
Diffstat (limited to 'documentation.pdf')
| -rw-r--r-- | documentation.pdf | 813 |
1 files changed, 512 insertions, 301 deletions
diff --git a/documentation.pdf b/documentation.pdf index 802956a..06ec760 100644 --- a/documentation.pdf +++ b/documentation.pdf @@ -127,36 +127,36 @@ endobj << /Border [ 0 0 0 ] /Contents () /Dest [ 69 0 R /XYZ 62.69291 558.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 [ 71 0 R /XYZ 62.69291 607.8236 0 ] /Rect [ 62.69291 272.0236 236.6529 284.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 607.8236 0 ] /Rect [ 62.69291 272.0236 251.0829 284.0236 ] /Subtype /Link /Type /Annot >>
endobj
44 0 obj
<< /Border [ 0 0 0 ] /Contents () /Dest [ 71 0 R /XYZ 62.69291 607.8236 0 ] /Rect [ 521.4627 272.7736 532.5827 284.7736 ] /Subtype /Link /Type /Annot >>
endobj
45 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 499.4236 0 ] /Rect [ 62.69291 254.0236 174.3929 266.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 147.0236 0 ] /Rect [ 62.69291 254.0236 174.3929 266.0236 ] /Subtype /Link /Type /Annot >>
endobj
46 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 499.4236 0 ] /Rect [ 521.4627 254.7736 532.5827 266.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 147.0236 0 ] /Rect [ 521.4627 254.7736 532.5827 266.7736 ] /Subtype /Link /Type /Annot >>
endobj
47 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 75 0 R /XYZ 62.69291 655.8236 0 ] /Rect [ 62.69291 236.0236 106.0329 248.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 75 0 R /XYZ 62.69291 330.6236 0 ] /Rect [ 62.69291 236.0236 106.0329 248.0236 ] /Subtype /Link /Type /Annot >>
endobj
48 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 75 0 R /XYZ 62.69291 655.8236 0 ] /Rect [ 521.4627 236.7736 532.5827 248.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 75 0 R /XYZ 62.69291 330.6236 0 ] /Rect [ 521.4627 236.7736 532.5827 248.7736 ] /Subtype /Link /Type /Annot >>
endobj
49 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
- 45 0 R 46 0 R 47 0 R 48 0 R ] /Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ 45 0 R 46 0 R 47 0 R 48 0 R ] /Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
50 0 obj
<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >>
endobj
51 0 obj
-<< /Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 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 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
52 0 obj
@@ -172,154 +172,158 @@ 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 243.8236 267.91 255.8236 ] /Subtype /Link /Type /Annot >>
endobj
56 0 obj
-<< /Annots [ 52 0 R 55 0 R ] /Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 52 0 R 55 0 R ] /Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
57 0 obj
-<< /Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
58 0 obj
-<< /Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
59 0 obj
<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-3107/) >> /Border [ 0 0 0 ] /Rect [ 231.6368 592.8236 323.0741 604.8236 ] /Subtype /Link /Type /Annot >>
endobj
60 0 obj
-<< /Annots [ 59 0 R ] /Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 59 0 R ] /Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
61 0 obj
-<< /Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
62 0 obj
-<< /Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
63 0 obj
-<< /Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
64 0 obj
-<< /Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
65 0 obj
<< /A << /S /URI /Type /Action /URI (http://bugs.python.org/issue1764286) >> /Border [ 0 0 0 ] /Rect [ 133.3162 450.4236 172.2473 462.4236 ] /Subtype /Link /Type /Annot >>
endobj
66 0 obj
-<< /Annots [ 65 0 R ] /Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 65 0 R ] /Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
67 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 >>
endobj
68 0 obj
-<< /Annots [ 67 0 R ] /Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+<< /Annots [ 67 0 R ] /Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
/Trans << >> /Type /Page >>
endobj
69 0 obj
-<< /Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 112 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
70 0 obj
-<< /Contents 112 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 113 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
71 0 obj
-<< /Contents 113 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 114 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
72 0 obj
-<< /Contents 114 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+<< /Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
73 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 412.6236 317.8397 424.6236 ] /Subtype /Link /Type /Annot >>
+<< /Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
74 0 obj
-<< /Annots [ 73 0 R ] /Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 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 753.0236 317.8397 765.0236 ] /Subtype /Link /Type /Annot >>
endobj
75 0 obj
-<< /Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 98 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
- /Type /Page >>
+<< /Annots [ 74 0 R ] /Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
76 0 obj
-<< /Outlines 78 0 R /PageLabels 117 0 R /PageMode /UseNone /Pages 98 0 R /Type /Catalog >>
+<< /Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 99 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
77 0 obj
-<< /Author (Michele Simionato) /CreationDate (D:20150722073225-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
- /Title (The decorator module) >>
+<< /Outlines 79 0 R /PageLabels 119 0 R /PageMode /UseNone /Pages 99 0 R /Type /Catalog >>
endobj
78 0 obj
-<< /Count 19 /First 79 0 R /Last 97 0 R /Type /Outlines >>
+<< /Author (Michele Simionato) /CreationDate (D:20150722085001-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
+ /Title (The decorator module) >>
endobj
79 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 765.0236 0 ] /Next 80 0 R /Parent 78 0 R /Title (Introduction) >>
+<< /Count 19 /First 80 0 R /Last 98 0 R /Type /Outlines >>
endobj
80 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 594.0236 0 ] /Next 81 0 R /Parent 78 0 R /Prev 79 0 R /Title (What's new) >>
+<< /Dest [ 51 0 R /XYZ 62.69291 765.0236 0 ] /Next 81 0 R /Parent 79 0 R /Title (Introduction) >>
endobj
81 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 381.0236 0 ] /Next 82 0 R /Parent 78 0 R /Prev 80 0 R /Title (Usefulness of decorators) >>
+<< /Dest [ 51 0 R /XYZ 62.69291 594.0236 0 ] /Next 82 0 R /Parent 79 0 R /Prev 80 0 R /Title (What's new) >>
endobj
82 0 obj
-<< /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Next 83 0 R /Parent 78 0 R /Prev 81 0 R /Title (Definitions) >>
+<< /Dest [ 51 0 R /XYZ 62.69291 381.0236 0 ] /Next 83 0 R /Parent 79 0 R /Prev 81 0 R /Title (Usefulness of decorators) >>
endobj
83 0 obj
-<< /Dest [ 56 0 R /XYZ 62.69291 528.0236 0 ] /Next 84 0 R /Parent 78 0 R /Prev 82 0 R /Title (Statement of the problem) >>
+<< /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Next 84 0 R /Parent 79 0 R /Prev 82 0 R /Title (Definitions) >>
endobj
84 0 obj
-<< /Dest [ 57 0 R /XYZ 62.69291 469.4236 0 ] /Next 85 0 R /Parent 78 0 R /Prev 83 0 R /Title (The solution) >>
+<< /Dest [ 56 0 R /XYZ 62.69291 528.0236 0 ] /Next 85 0 R /Parent 79 0 R /Prev 83 0 R /Title (Statement of the problem) >>
endobj
85 0 obj
-<< /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Next 86 0 R /Parent 78 0 R /Prev 84 0 R /Title (A trace decorator) >>
+<< /Dest [ 57 0 R /XYZ 62.69291 469.4236 0 ] /Next 86 0 R /Parent 79 0 R /Prev 84 0 R /Title (The solution) >>
endobj
86 0 obj
-<< /Dest [ 60 0 R /XYZ 62.69291 631.8236 0 ] /Next 87 0 R /Parent 78 0 R /Prev 85 0 R /Title (Function annotations) >>
+<< /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Next 87 0 R /Parent 79 0 R /Prev 85 0 R /Title (A trace decorator) >>
endobj
87 0 obj
-<< /Dest [ 61 0 R /XYZ 62.69291 765.0236 0 ] /Next 88 0 R /Parent 78 0 R /Prev 86 0 R /Title (decorator.decorator) >>
+<< /Dest [ 60 0 R /XYZ 62.69291 631.8236 0 ] /Next 88 0 R /Parent 79 0 R /Prev 86 0 R /Title (Function annotations) >>
endobj
88 0 obj
-<< /Dest [ 61 0 R /XYZ 62.69291 317.2236 0 ] /Next 89 0 R /Parent 78 0 R /Prev 87 0 R /Title (blocking) >>
+<< /Dest [ 61 0 R /XYZ 62.69291 765.0236 0 ] /Next 89 0 R /Parent 79 0 R /Prev 87 0 R /Title (decorator.decorator) >>
endobj
89 0 obj
-<< /Dest [ 62 0 R /XYZ 62.69291 434.6236 0 ] /Next 90 0 R /Parent 78 0 R /Prev 88 0 R /Title (decorator\(cls\)) >>
+<< /Dest [ 61 0 R /XYZ 62.69291 317.2236 0 ] /Next 90 0 R /Parent 79 0 R /Prev 88 0 R /Title (blocking) >>
endobj
90 0 obj
-<< /Dest [ 63 0 R /XYZ 62.69291 542.6236 0 ] /Next 91 0 R /Parent 78 0 R /Prev 89 0 R /Title (contextmanager) >>
+<< /Dest [ 62 0 R /XYZ 62.69291 434.6236 0 ] /Next 91 0 R /Parent 79 0 R /Prev 89 0 R /Title (decorator\(cls\)) >>
endobj
91 0 obj
-<< /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Next 92 0 R /Parent 78 0 R /Prev 90 0 R /Title (The FunctionMaker class) >>
+<< /Dest [ 63 0 R /XYZ 62.69291 542.6236 0 ] /Next 92 0 R /Parent 79 0 R /Prev 90 0 R /Title (contextmanager) >>
endobj
92 0 obj
-<< /Dest [ 66 0 R /XYZ 62.69291 765.0236 0 ] /Next 93 0 R /Parent 78 0 R /Prev 91 0 R /Title (Getting the source code) >>
+<< /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Next 93 0 R /Parent 79 0 R /Prev 91 0 R /Title (The FunctionMaker class) >>
endobj
93 0 obj
-<< /Dest [ 66 0 R /XYZ 62.69291 285.2236 0 ] /Next 94 0 R /Parent 78 0 R /Prev 92 0 R /Title (Dealing with third party decorators) >>
+<< /Dest [ 66 0 R /XYZ 62.69291 765.0236 0 ] /Next 94 0 R /Parent 79 0 R /Prev 92 0 R /Title (Getting the source code) >>
endobj
94 0 obj
-<< /Dest [ 69 0 R /XYZ 62.69291 558.6236 0 ] /Next 95 0 R /Parent 78 0 R /Prev 93 0 R /Title (Multiple dispatch) >>
+<< /Dest [ 66 0 R /XYZ 62.69291 285.2236 0 ] /Next 95 0 R /Parent 79 0 R /Prev 93 0 R /Title (Dealing with third party decorators) >>
endobj
95 0 obj
-<< /Dest [ 71 0 R /XYZ 62.69291 607.8236 0 ] /Next 96 0 R /Parent 78 0 R /Prev 94 0 R /Title (Generics and Abstract Base Classes) >>
+<< /Dest [ 69 0 R /XYZ 62.69291 558.6236 0 ] /Next 96 0 R /Parent 79 0 R /Prev 94 0 R /Title (Multiple dispatch) >>
endobj
96 0 obj
-<< /Dest [ 72 0 R /XYZ 62.69291 499.4236 0 ] /Next 97 0 R /Parent 78 0 R /Prev 95 0 R /Title (Caveats and limitations) >>
+<< /Dest [ 71 0 R /XYZ 62.69291 607.8236 0 ] /Next 97 0 R /Parent 79 0 R /Prev 95 0 R /Title (Generic functions and virtual ancestors) >>
endobj
97 0 obj
-<< /Dest [ 75 0 R /XYZ 62.69291 655.8236 0 ] /Parent 78 0 R /Prev 96 0 R /Title (LICENSE) >>
+<< /Dest [ 72 0 R /XYZ 62.69291 147.0236 0 ] /Next 98 0 R /Parent 79 0 R /Prev 96 0 R /Title (Caveats and limitations) >>
endobj
98 0 obj
-<< /Count 18 /Kids [ 49 0 R 51 0 R 56 0 R 57 0 R 58 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R
- 66 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 74 0 R 75 0 R ] /Type /Pages >>
+<< /Dest [ 75 0 R /XYZ 62.69291 330.6236 0 ] /Parent 79 0 R /Prev 97 0 R /Title (LICENSE) >>
endobj
99 0 obj
-<< /Length 7558 >>
+<< /Count 19 /Kids [ 49 0 R 51 0 R 56 0 R 57 0 R 58 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R
+ 66 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 75 0 R 76 0 R ] /Type /Pages >>
+endobj
+100 0 obj
+<< /Length 7563 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -711,7 +715,7 @@ Q q
1 0 0 1 0 39 cm
q
-BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Generics and Abstract Base Classes) Tj T* ET
+BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (Generic functions and virtual ancestors) Tj T* ET
Q
Q
q
@@ -756,7 +760,7 @@ Q endstream
endobj
-100 0 obj
+101 0 obj
<< /Length 7414 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -927,7 +931,7 @@ Q endstream
endobj
-101 0 obj
+102 0 obj
<< /Length 12505 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1258,7 +1262,7 @@ Q endstream
endobj
-102 0 obj
+103 0 obj
<< /Length 16560 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1738,7 +1742,7 @@ Q endstream
endobj
-103 0 obj
+104 0 obj
<< /Length 18522 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2331,7 +2335,7 @@ Q endstream
endobj
-104 0 obj
+105 0 obj
<< /Length 17627 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2842,7 +2846,7 @@ Q endstream
endobj
-105 0 obj
+106 0 obj
<< /Length 20355 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -3408,7 +3412,7 @@ Q endstream
endobj
-106 0 obj
+107 0 obj
<< /Length 18696 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -3911,7 +3915,7 @@ Q endstream
endobj
-107 0 obj
+108 0 obj
<< /Length 14651 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -4334,7 +4338,7 @@ Q endstream
endobj
-108 0 obj
+109 0 obj
<< /Length 14222 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -4635,7 +4639,7 @@ Q endstream
endobj
-109 0 obj
+110 0 obj
<< /Length 16271 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -5090,7 +5094,7 @@ Q endstream
endobj
-110 0 obj
+111 0 obj
<< /Length 16103 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -5505,7 +5509,7 @@ Q endstream
endobj
-111 0 obj
+112 0 obj
<< /Length 13654 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -5888,7 +5892,7 @@ Q endstream
endobj
-112 0 obj
+113 0 obj
<< /Length 16060 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -6399,8 +6403,8 @@ Q endstream
endobj
-113 0 obj
-<< /Length 13036 >>
+114 0 obj
+<< /Length 12873 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -6534,14 +6538,14 @@ Q q
1 0 0 1 62.69291 586.8236 cm
q
-BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Generics and Abstract Base Classes) Tj T* ET
+BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Generic functions and virtual ancestors) Tj T* ET
Q
Q
q
1 0 0 1 62.69291 556.8236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .840751 Tw (Generic functions implementations in Python are complicated by the existence of "virtual ancestors", i.e.) Tj T* 0 Tw (superclasses which are not in the class hierarchy. Consider for instance this class:) Tj T* ET
+BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.225366 Tw (Generic function implementations in Python are complicated by the existence of "virtual ancestors", i.e.) Tj T* 0 Tw (superclasses which are not in the class hierarchy. Consider for instance this class:) Tj T* ET
Q
Q
q
@@ -6565,13 +6569,9 @@ n 36 24 60 12 re f* .960784 .960784 .862745 rg
n 96 24 6 12 re f*
.960784 .960784 .862745 rg
-n 102 24 66 12 re f*
-.960784 .960784 .862745 rg
-n 168 24 6 12 re f*
-.960784 .960784 .862745 rg
-n 174 24 30 12 re f*
+n 102 24 36 12 re f*
.960784 .960784 .862745 rg
-n 204 24 12 12 re f*
+n 138 24 12 12 re f*
.960784 .960784 .862745 rg
n 24 12 18 12 re f*
.960784 .960784 .862745 rg
@@ -6586,7 +6586,7 @@ n 120 12 12 12 re f* n 48 0 36 12 re f*
.960784 .960784 .862745 rg
n 90 0 6 12 re f*
-BT 1 0 0 1 0 26 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 (WithLength) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Sized) Tj 0 0 0 rg (\):) Tj 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 (__len__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) 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 .4 .4 .4 rg (0) Tj T* ET
+BT 1 0 0 1 0 26 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 (WithLength) 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 /F5 10 Tf 0 .501961 0 rg (def) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__len__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) 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 .4 .4 .4 rg (0) Tj T* ET
Q
Q
Q
@@ -6595,7 +6595,7 @@ Q q
1 0 0 1 62.69291 467.6236 cm
q
-BT 1 0 0 1 0 14 Tm .772765 Tw 12 TL /F1 10 Tf 0 0 0 rg (This class defines a ) Tj /F3 10 Tf 0 0 0 rg (__len__ ) Tj /F1 10 Tf 0 0 0 rg (method and as such is considered to be a subclass of the abstract base) Tj T* 0 Tw (class ) Tj /F3 10 Tf 0 0 0 rg (Sized) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET
+BT 1 0 0 1 0 14 Tm .772765 Tw 12 TL /F1 10 Tf 0 0 0 rg (This class defines a ) Tj /F3 10 Tf 0 0 0 rg (__len__ ) Tj /F1 10 Tf 0 0 0 rg (method and as such is considered to be a subclass of the abstract base) Tj T* 0 Tw (class ) Tj /F3 10 Tf 0 0 0 rg (collections.Sized) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET
Q
Q
q
@@ -6645,7 +6645,7 @@ Q q
1 0 0 1 62.69291 378.4236 cm
q
-BT 1 0 0 1 0 26 Tm 2.180888 Tw 12 TL /F1 10 Tf 0 0 0 rg (However, ) Tj /F3 10 Tf 0 0 0 rg (collections.Sized ) Tj /F1 10 Tf 0 0 0 rg (is not an ancestor of ) Tj /F3 10 Tf 0 0 0 rg (WithLenght) Tj /F1 10 Tf 0 0 0 rg (. Any implementation of generic) Tj T* 0 Tw 1.570651 Tw (functions, even with single dispatch, must go through some contorsion to take into account the virtual) Tj T* 0 Tw (ancestors.) Tj T* ET
+BT 1 0 0 1 0 26 Tm 2.180888 Tw 12 TL /F1 10 Tf 0 0 0 rg (However, ) Tj /F3 10 Tf 0 0 0 rg (collections.Sized ) Tj /F1 10 Tf 0 0 0 rg (is not an ancestor of ) Tj /F3 10 Tf 0 0 0 rg (WithLength) Tj /F1 10 Tf 0 0 0 rg (. Any implementation of generic) Tj T* 0 Tw 1.570651 Tw (functions, even with single dispatch, must go through some contorsion to take into account the virtual) Tj T* 0 Tw (ancestors.) Tj T* ET
Q
Q
q
@@ -6711,7 +6711,7 @@ q 1 0 0 1 62.69291 283.2236 cm
q
0 0 0 rg
-BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (implemented on all classes with a lenght) Tj T* ET
+BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (implemented on all classes with a length) Tj T* ET
Q
Q
q
@@ -6817,18 +6817,82 @@ Q q
1 0 0 1 62.69291 86.82362 cm
q
-BT 1 0 0 1 0 38 Tm 1.208555 Tw 12 TL /F1 10 Tf 0 0 0 rg (The implementation of generic functions in the decorator module is marked as experimental because it) Tj T* 0 Tw 9.424147 Tw (may change in the future. Simplicity was preferred over consistency with the way) Tj T* 0 Tw 4.854976 Tw /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (works in the standard library. For instance, suppose we define) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (WithLength ) Tj /F1 10 Tf 0 0 0 rg (as a virtual subclass of ) Tj /F3 10 Tf 0 0 0 rg (collections.Set) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET
+BT 1 0 0 1 0 38 Tm .646651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The implementation of generic functions in the decorator module is still experimental. In this initial phase) Tj T* 0 Tw 2.659069 Tw (implicity was preferred over consistency with the way ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (works in the) Tj T* 0 Tw .571235 Tw (standard library. So there some subtle differences in special case. I will only show an example. Suppose) Tj T* 0 Tw (with are using a third party set-like class like the following:) Tj T* ET
Q
Q
endstream
endobj
-114 0 obj
-<< /Length 7359 >>
+115 0 obj
+<< /Length 14323 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 739.8236 cm
+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 30 12 re f*
+.960784 .960784 .862745 rg
+n 36 48 42 12 re f*
+.960784 .960784 .862745 rg
+n 78 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 84 48 66 12 re f*
+.960784 .960784 .862745 rg
+n 150 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 156 48 30 12 re f*
+.960784 .960784 .862745 rg
+n 186 48 12 12 re f*
+.960784 .960784 .862745 rg
+n 24 36 216 12 re f*
+.960784 .960784 .862745 rg
+n 24 24 90 12 re f*
+.960784 .960784 .862745 rg
+n 24 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 48 12 42 12 re f*
+.960784 .960784 .862745 rg
+n 90 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 96 12 24 12 re f*
+.960784 .960784 .862745 rg
+n 120 12 12 12 re f*
+.960784 .960784 .862745 rg
+n 48 0 36 12 re f*
+.960784 .960784 .862745 rg
+n 90 0 6 12 re f*
+BT 1 0 0 1 0 50 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 (SomeSet) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Sized) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# methods that make SomeSet set-like) Tj /F3 10 Tf 0 0 0 rg T* ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# not shown ...) 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 (__len__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) 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 .4 .4 .4 rg (0) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 659.8236 cm
+q
+BT 1 0 0 1 0 14 Tm 1.042651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here the author of ) Tj /F3 10 Tf 0 0 0 rg (SomeSet ) Tj /F1 10 Tf 0 0 0 rg (made a mistake by not inheriting from ) Tj /F3 10 Tf 0 0 0 rg (collections.Set) Tj /F1 10 Tf 0 0 0 rg (, but only from) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (collections.Sized) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 629.8236 cm
+q
+BT 1 0 0 1 0 14 Tm 1.797485 Tw 12 TL /F1 10 Tf 0 0 0 rg (This is not a problem since we can register ) Tj /F4 10 Tf (a posteriori) Tj /F1 10 Tf ( ) Tj /F3 10 Tf 0 0 0 rg (collections.Set ) Tj /F1 10 Tf 0 0 0 rg (as a virtual ancestor of) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (SomeSet ) Tj /F1 10 Tf 0 0 0 rg (\(in general any instance of ) Tj /F3 10 Tf 0 0 0 rg (abc.ABCMeta ) Tj /F1 10 Tf 0 0 0 rg (can be registered to work as a virtual ancestor\):) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 596.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -6864,25 +6928,25 @@ n 144 0 48 12 re f* .960784 .960784 .862745 rg
n 192 0 6 12 re f*
.960784 .960784 .862745 rg
-n 198 0 60 12 re f*
+n 198 0 42 12 re f*
.960784 .960784 .862745 rg
-n 258 0 6 12 re f*
+n 240 0 6 12 re f*
.960784 .960784 .862745 rg
-n 276 0 174 12 re f*
-BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Set) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (register) Tj 0 0 0 rg (\() Tj 0 0 0 rg (WithLength) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# issubclass\(WithLength, Set\)) Tj T* ET
+n 258 0 156 12 re f*
+BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Set) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (register) Tj 0 0 0 rg (\() Tj 0 0 0 rg (SomeSet) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# issubclass\(SomeSet, Set\)) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 719.8236 cm
+1 0 0 1 62.69291 576.6236 cm
q
BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (Now, let us define an implementation of ) Tj /F3 10 Tf 0 0 0 rg (get_length ) Tj /F1 10 Tf 0 0 0 rg (specific to set:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 662.6236 cm
+1 0 0 1 62.69291 519.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -6938,13 +7002,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 630.6236 cm
+1 0 0 1 62.69291 487.4236 cm
q
-BT 1 0 0 1 0 14 Tm 2.462651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The current implementation first check in the MRO and then look for abstract bases classes; since) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (WithLength ) Tj /F1 10 Tf 0 0 0 rg (inherits directly from ) Tj /F3 10 Tf 0 0 0 rg (collections.Sized ) Tj /F1 10 Tf 0 0 0 rg (that implementation is found first:) Tj T* ET
+BT 1 0 0 1 0 14 Tm 1.152651 Tw 12 TL /F1 10 Tf 0 0 0 rg (The current implementation first check in the MRO and then look for virtual ancestors; since ) Tj /F3 10 Tf 0 0 0 rg (SomeSet) Tj T* 0 Tw /F1 10 Tf 0 0 0 rg (inherits directly from ) Tj /F3 10 Tf 0 0 0 rg (collections.Sized ) Tj /F1 10 Tf 0 0 0 rg (that implementation is found first:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 585.4236 cm
+1 0 0 1 62.69291 442.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -6968,44 +7032,199 @@ n 24 12 60 12 re f* .960784 .960784 .862745 rg
n 84 12 6 12 re f*
.960784 .960784 .862745 rg
-n 90 12 60 12 re f*
+n 90 12 42 12 re f*
.960784 .960784 .862745 rg
-n 150 12 18 12 re f*
+n 132 12 18 12 re f*
.960784 .960784 .862745 rg
n 0 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 (get_length) Tj 0 0 0 rg (\() Tj 0 0 0 rg (WithLength) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* .4 .4 .4 rg (0) Tj T* ET
+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 (get_length) Tj 0 0 0 rg (\() Tj 0 0 0 rg (SomeSet) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* .4 .4 .4 rg (0) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 541.4236 cm
+1 0 0 1 62.69291 362.2236 cm
q
-BT 1 0 0 1 0 26 Tm 2.257752 Tw 12 TL /F1 10 Tf 0 0 0 rg (Generic functions implemented via ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (use a more sophisticated lookup) Tj T* 0 Tw 1.095542 Tw (algorithm; in particular they are able to discern that a ) Tj /F3 10 Tf 0 0 0 rg (Set ) Tj /F1 10 Tf 0 0 0 rg (is a ) Tj /F3 10 Tf 0 0 0 rg (Sized ) Tj /F1 10 Tf 0 0 0 rg (object, so the most specialized) Tj T* 0 Tw (implementation is the one for ) Tj /F3 10 Tf 0 0 0 rg (Set ) Tj /F1 10 Tf 0 0 0 rg (and the result should be 1, not 0.) Tj T* ET
+BT 1 0 0 1 0 62 Tm 2.257752 Tw 12 TL /F1 10 Tf 0 0 0 rg (Generic functions implemented via ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (use a more sophisticated lookup) Tj T* 0 Tw .632209 Tw (algorithm; in particular they are able to discern that a ) Tj /F3 10 Tf 0 0 0 rg (Set ) Tj /F1 10 Tf 0 0 0 rg (is a ) Tj /F3 10 Tf 0 0 0 rg (Sized ) Tj /F1 10 Tf 0 0 0 rg (object, so the implementation for) Tj T* 0 Tw 10.16355 Tw /F3 10 Tf 0 0 0 rg (Set ) Tj /F1 10 Tf 0 0 0 rg (is taken and the result is 1, not 0. Also, the functions implemented via) Tj T* 0 Tw .927251 Tw /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (are smarter when there are conflicting implementations and are able to) Tj T* 0 Tw .844488 Tw (solve more potential conflicts. Just to have an idea of what I am talking about, here is a situation with a) Tj T* 0 Tw (conflict:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 511.4236 cm
+1 0 0 1 62.69291 245.0236 cm
+q
q
-BT 1 0 0 1 0 14 Tm 2.653735 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally let me notice that the current implementation does not use any cache, whereas the one in) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg (singledispatch ) Tj /F1 10 Tf 0 0 0 rg (has a cache.) Tj T* ET
+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 108 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*
+.960784 .960784 .862745 rg
+n 12 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 24 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 36 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 48 84 66 12 re f*
+.960784 .960784 .862745 rg
+n 114 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 120 84 48 12 re f*
+.960784 .960784 .862745 rg
+n 168 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 174 84 48 12 re f*
+.960784 .960784 .862745 rg
+n 222 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 228 84 60 12 re f*
+.960784 .960784 .862745 rg
+n 288 84 6 12 re f*
+.960784 .960784 .862745 rg
+n 0 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 6 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 12 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 24 72 120 12 re f*
+.960784 .960784 .862745 rg
+n 144 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 150 72 66 12 re f*
+.960784 .960784 .862745 rg
+n 216 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 222 72 48 12 re f*
+.960784 .960784 .862745 rg
+n 270 72 6 12 re f*
+.960784 .960784 .862745 rg
+n 0 60 18 12 re f*
+.960784 .960784 .862745 rg
+n 24 60 18 12 re f*
+.960784 .960784 .862745 rg
+n 48 60 114 12 re f*
+.960784 .960784 .862745 rg
+n 162 60 6 12 re f*
+.960784 .960784 .862745 rg
+n 168 60 18 12 re f*
+.960784 .960784 .862745 rg
+n 186 60 12 12 re f*
+.960784 .960784 .862745 rg
+n 0 48 18 12 re f*
+.960784 .960784 .862745 rg
+n 48 48 30 12 re f*
+.960784 .960784 .862745 rg
+n 84 48 54 12 re f*
+.960784 .960784 .862745 rg
+n 138 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 144 48 228 12 re f*
+.960784 .960784 .862745 rg
+n 372 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 0 36 6 12 re f*
+.960784 .960784 .862745 rg
+n 6 36 6 12 re f*
+.960784 .960784 .862745 rg
+n 12 36 6 12 re f*
+.960784 .960784 .862745 rg
+n 24 36 60 12 re f*
+.960784 .960784 .862745 rg
+n 84 36 6 12 re f*
+.960784 .960784 .862745 rg
+n 90 36 60 12 re f*
+.960784 .960784 .862745 rg
+n 150 36 18 12 re f*
+.960784 .960784 .862745 rg
+n 0 24 54 12 re f*
+.960784 .960784 .862745 rg
+n 60 24 6 12 re f*
+.960784 .960784 .862745 rg
+n 66 24 24 12 re f*
+.960784 .960784 .862745 rg
+n 96 24 36 12 re f*
+.960784 .960784 .862745 rg
+n 138 24 24 12 re f*
+.960784 .960784 .862745 rg
+n 168 24 24 12 re f*
+.960784 .960784 .862745 rg
+n 192 24 12 12 re f*
+.960784 .960784 .862745 rg
+n 12 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 0 0 72 12 re f*
+.960784 .960784 .862745 rg
+n 72 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 84 0 54 12 re f*
+.960784 .960784 .862745 rg
+n 144 0 48 12 re f*
+.960784 .960784 .862745 rg
+n 198 0 18 12 re f*
+.960784 .960784 .862745 rg
+n 222 0 60 12 re f*
+.960784 .960784 .862745 rg
+n 288 0 48 12 re f*
+.960784 .960784 .862745 rg
+n 336 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 348 0 30 12 re f*
+.960784 .960784 .862745 rg
+n 384 0 12 12 re f*
+.960784 .960784 .862745 rg
+n 402 0 48 12 re f*
+.960784 .960784 .862745 rg
+n 450 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 0 0 0 rg (_) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Iterable) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (register) Tj 0 0 0 rg (\() Tj 0 0 0 rg (WithLength) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@get_length.register) Tj 0 0 0 rg (\() Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Iterable) Tj 0 0 0 rg (\)) 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 (get_length_iterable) Tj 0 0 0 rg (\() Tj 0 0 0 rg (obj) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (raise) Tj /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf .823529 .254902 .227451 rg (TypeError) Tj /F3 10 Tf 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ('Cannot get the length of an iterable') Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (get_length) Tj 0 0 0 rg (\() Tj 0 0 0 rg (WithLength) Tj 0 0 0 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 (RuntimeError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (Ambiguous) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (dispatch) Tj 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (for) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (WithLength) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (instance) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (Sized) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (or) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (Iterable) Tj 0 0 0 rg (?) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 189.0236 cm
+q
+BT 1 0 0 1 0 38 Tm 9.280976 Tw 12 TL /F1 10 Tf 0 0 0 rg (Since ) Tj /F3 10 Tf 0 0 0 rg (WithLength ) Tj /F1 10 Tf 0 0 0 rg (is both a \(virtual\) subclass of ) Tj /F3 10 Tf 0 0 0 rg (collections.Iterable ) Tj /F1 10 Tf 0 0 0 rg (and of) Tj T* 0 Tw .08998 Tw /F3 10 Tf 0 0 0 rg (collections.Sized) Tj /F1 10 Tf 0 0 0 rg (, it is impossible to decide which implementation should be taken. Consistently with) Tj T* 0 Tw .488314 Tw (the ) Tj /F4 10 Tf (refuse the temptation to guess ) Tj /F1 10 Tf (philosophy, an error is raised. ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (works) Tj T* 0 Tw (exactly the same in this case.) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 159.0236 cm
+q
+BT 1 0 0 1 0 14 Tm .39561 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally let me notice that the decorator module implementation does not use any cache, whereas the one) Tj T* 0 Tw (in ) Tj /F3 10 Tf 0 0 0 rg (singledispatch ) Tj /F1 10 Tf 0 0 0 rg (has a cache.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 478.4236 cm
+1 0 0 1 62.69291 126.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 448.4236 cm
+1 0 0 1 62.69291 96.02362 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
+
+endstream
+endobj
+116 0 obj
+<< /Length 10091 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 223.2236 cm
+1 0 0 1 62.69291 547.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -7026,13 +7245,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 203.2236 cm
+1 0 0 1 62.69291 527.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 146.0236 cm
+1 0 0 1 62.69291 470.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -7053,27 +7272,20 @@ Q Q
Q
q
-1 0 0 1 62.69291 102.0236 cm
+1 0 0 1 62.69291 426.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
-
-endstream
-endobj
-115 0 obj
-<< /Length 16053 >>
-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 396.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
q
-1 0 0 1 62.69291 683.8236 cm
+1 0 0 1 62.69291 339.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -7117,13 +7329,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 651.8236 cm
+1 0 0 1 62.69291 307.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 522.6236 cm
+1 0 0 1 62.69291 178.2236 cm
q
q
1 0 0 1 0 0 cm
@@ -7271,31 +7483,44 @@ Q Q
Q
q
-1 0 0 1 62.69291 454.6236 cm
+1 0 0 1 62.69291 110.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 376.6236 cm
+1 0 0 1 62.69291 80.22362 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
+BT 1 0 0 1 0 14 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 ET
Q
Q
+
+endstream
+endobj
+117 0 obj
+<< /Length 12826 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 334.6236 cm
+1 0 0 1 62.69291 717.0236 cm
+q
+BT 1 0 0 1 0 38 Tm .74186 Tw 12 TL /F1 10 Tf 0 0 0 rg (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 675.0236 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, especially for Python 2.X.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 304.6236 cm
+1 0 0 1 62.69291 645.0236 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 187.4236 cm
+1 0 0 1 62.69291 527.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -7397,14 +7622,14 @@ Q Q
Q
q
-1 0 0 1 62.69291 155.4236 cm
+1 0 0 1 62.69291 495.8236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.720651 Tw (Finally, the implementation is such that the decorated function makes a \(shallow\) copy of the original) Tj T* 0 Tw (function dictionary:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 86.22362 cm
+1 0 0 1 62.69291 342.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -7414,88 +7639,61 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 60 re B*
+n -6 -6 468.6898 144 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 36 6 12 re f*
-.960784 .960784 .862745 rg
-n 6 36 6 12 re f*
+n 0 120 6 12 re f*
.960784 .960784 .862745 rg
-n 12 36 6 12 re f*
+n 6 120 6 12 re f*
.960784 .960784 .862745 rg
-n 24 36 18 12 re f*
+n 12 120 6 12 re f*
.960784 .960784 .862745 rg
-n 48 36 6 12 re f*
+n 24 120 18 12 re f*
.960784 .960784 .862745 rg
-n 54 36 18 12 re f*
+n 48 120 6 12 re f*
.960784 .960784 .862745 rg
-n 78 36 24 12 re f*
+n 54 120 18 12 re f*
.960784 .960784 .862745 rg
-n 108 36 138 12 re f*
+n 78 120 24 12 re f*
.960784 .960784 .862745 rg
-n 0 24 6 12 re f*
+n 108 120 138 12 re f*
.960784 .960784 .862745 rg
-n 6 24 6 12 re f*
+n 0 108 6 12 re f*
.960784 .960784 .862745 rg
-n 12 24 6 12 re f*
+n 6 108 6 12 re f*
.960784 .960784 .862745 rg
-n 24 24 6 12 re f*
+n 12 108 6 12 re f*
.960784 .960784 .862745 rg
-n 30 24 6 12 re f*
+n 24 108 6 12 re f*
.960784 .960784 .862745 rg
-n 36 24 30 12 re f*
+n 30 108 6 12 re f*
.960784 .960784 .862745 rg
-n 72 24 6 12 re f*
+n 36 108 30 12 re f*
.960784 .960784 .862745 rg
-n 84 24 66 12 re f*
+n 72 108 6 12 re f*
.960784 .960784 .862745 rg
-n 156 24 132 12 re f*
+n 84 108 66 12 re f*
.960784 .960784 .862745 rg
-n 0 12 6 12 re f*
+n 156 108 132 12 re f*
.960784 .960784 .862745 rg
-n 6 12 6 12 re f*
+n 0 96 6 12 re f*
.960784 .960784 .862745 rg
-n 12 12 6 12 re f*
+n 6 96 6 12 re f*
.960784 .960784 .862745 rg
-n 24 12 6 12 re f*
+n 12 96 6 12 re f*
.960784 .960784 .862745 rg
-n 30 12 6 12 re f*
+n 24 96 6 12 re f*
.960784 .960784 .862745 rg
-n 36 12 30 12 re f*
+n 30 96 6 12 re f*
.960784 .960784 .862745 rg
-n 72 12 6 12 re f*
+n 36 96 30 12 re f*
.960784 .960784 .862745 rg
-n 84 12 96 12 re f*
+n 72 96 6 12 re f*
.960784 .960784 .862745 rg
-n 186 12 162 12 re f*
-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 (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* ET
-Q
-Q
-Q
-Q
-Q
-
-endstream
-endobj
-116 0 obj
-<< /Length 5590 >>
-stream
-1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
-q
-1 0 0 1 62.69291 667.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 84 96 96 12 re f*
.960784 .960784 .862745 rg
-n -6 -6 468.6898 96 re B*
-Q
-q
+n 186 96 162 12 re f*
.960784 .960784 .862745 rg
n 0 72 6 12 re f*
.960784 .960784 .862745 rg
@@ -7564,37 +7762,37 @@ 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 74 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 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
+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 634.8236 cm
+1 0 0 1 62.69291 309.6236 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 616.8236 cm
+1 0 0 1 62.69291 291.6236 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 586.8236 cm
+1 0 0 1 62.69291 261.6236 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 580.8236 cm
+1 0 0 1 62.69291 255.6236 cm
Q
q
-1 0 0 1 62.69291 532.8236 cm
+1 0 0 1 62.69291 207.6236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -7609,17 +7807,24 @@ q Q
Q
q
-1 0 0 1 62.69291 532.8236 cm
+1 0 0 1 62.69291 207.6236 cm
Q
q
-1 0 0 1 62.69291 406.8236 cm
+1 0 0 1 62.69291 81.62362 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
+
+endstream
+endobj
+118 0 obj
+<< /Length 361 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 376.8236 cm
+1 0 0 1 62.69291 741.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
@@ -7628,68 +7833,71 @@ Q endstream
endobj
-117 0 obj
-<< /Nums [ 0 118 0 R 1 119 0 R 2 120 0 R 3 121 0 R 4 122 0 R
- 5 123 0 R 6 124 0 R 7 125 0 R 8 126 0 R 9 127 0 R
- 10 128 0 R 11 129 0 R 12 130 0 R 13 131 0 R 14 132 0 R
- 15 133 0 R 16 134 0 R 17 135 0 R ] >>
+119 0 obj
+<< /Nums [ 0 120 0 R 1 121 0 R 2 122 0 R 3 123 0 R 4 124 0 R
+ 5 125 0 R 6 126 0 R 7 127 0 R 8 128 0 R 9 129 0 R
+ 10 130 0 R 11 131 0 R 12 132 0 R 13 133 0 R 14 134 0 R
+ 15 135 0 R 16 136 0 R 17 137 0 R 18 138 0 R ] >>
endobj
-118 0 obj
+120 0 obj
<< /S /D /St 1 >>
endobj
-119 0 obj
+121 0 obj
<< /S /D /St 2 >>
endobj
-120 0 obj
+122 0 obj
<< /S /D /St 3 >>
endobj
-121 0 obj
+123 0 obj
<< /S /D /St 4 >>
endobj
-122 0 obj
+124 0 obj
<< /S /D /St 5 >>
endobj
-123 0 obj
+125 0 obj
<< /S /D /St 6 >>
endobj
-124 0 obj
+126 0 obj
<< /S /D /St 7 >>
endobj
-125 0 obj
+127 0 obj
<< /S /D /St 8 >>
endobj
-126 0 obj
+128 0 obj
<< /S /D /St 9 >>
endobj
-127 0 obj
+129 0 obj
<< /S /D /St 10 >>
endobj
-128 0 obj
+130 0 obj
<< /S /D /St 11 >>
endobj
-129 0 obj
+131 0 obj
<< /S /D /St 12 >>
endobj
-130 0 obj
+132 0 obj
<< /S /D /St 13 >>
endobj
-131 0 obj
+133 0 obj
<< /S /D /St 14 >>
endobj
-132 0 obj
+134 0 obj
<< /S /D /St 15 >>
endobj
-133 0 obj
+135 0 obj
<< /S /D /St 16 >>
endobj
-134 0 obj
+136 0 obj
<< /S /D /St 17 >>
endobj
-135 0 obj
+137 0 obj
<< /S /D /St 18 >>
endobj
+138 0 obj
+<< /S /D /St 19 >>
+endobj
xref
-0 136
+0 139
0000000000 65535 f
0000000075 00000 n
0000000162 00000 n
@@ -7740,97 +7948,100 @@ xref 0000007759 00000 n
0000007931 00000 n
0000008103 00000 n
-0000008644 00000 n
-0000008763 00000 n
-0000008974 00000 n
-0000009179 00000 n
-0000009293 00000 n
-0000009410 00000 n
-0000009637 00000 n
-0000009874 00000 n
-0000010085 00000 n
-0000010296 00000 n
-0000010492 00000 n
-0000010722 00000 n
-0000010933 00000 n
-0000011144 00000 n
-0000011355 00000 n
-0000011566 00000 n
-0000011757 00000 n
-0000011987 00000 n
-0000012205 00000 n
-0000012435 00000 n
-0000012646 00000 n
-0000012857 00000 n
-0000013068 00000 n
-0000013279 00000 n
-0000013474 00000 n
-0000013704 00000 n
-0000013915 00000 n
-0000014025 00000 n
-0000014273 00000 n
-0000014351 00000 n
-0000014468 00000 n
-0000014596 00000 n
-0000014738 00000 n
-0000014867 00000 n
-0000015009 00000 n
-0000015139 00000 n
-0000015274 00000 n
-0000015412 00000 n
-0000015549 00000 n
-0000015675 00000 n
-0000015809 00000 n
-0000015941 00000 n
-0000016082 00000 n
-0000016223 00000 n
-0000016376 00000 n
-0000016511 00000 n
-0000016663 00000 n
-0000016804 00000 n
-0000016916 00000 n
-0000017104 00000 n
-0000024719 00000 n
-0000032191 00000 n
-0000044755 00000 n
-0000061374 00000 n
-0000079955 00000 n
-0000097641 00000 n
-0000118055 00000 n
-0000136810 00000 n
-0000151520 00000 n
-0000165801 00000 n
-0000182131 00000 n
-0000198293 00000 n
-0000212006 00000 n
-0000228125 00000 n
-0000241220 00000 n
-0000248637 00000 n
-0000264749 00000 n
-0000270397 00000 n
-0000270633 00000 n
-0000270671 00000 n
-0000270709 00000 n
-0000270747 00000 n
-0000270785 00000 n
-0000270823 00000 n
-0000270861 00000 n
-0000270899 00000 n
-0000270937 00000 n
-0000270975 00000 n
-0000271014 00000 n
-0000271053 00000 n
-0000271092 00000 n
-0000271131 00000 n
-0000271170 00000 n
-0000271209 00000 n
-0000271248 00000 n
-0000271287 00000 n
+0000008645 00000 n
+0000008764 00000 n
+0000008975 00000 n
+0000009180 00000 n
+0000009294 00000 n
+0000009411 00000 n
+0000009638 00000 n
+0000009875 00000 n
+0000010086 00000 n
+0000010297 00000 n
+0000010493 00000 n
+0000010723 00000 n
+0000010934 00000 n
+0000011145 00000 n
+0000011356 00000 n
+0000011567 00000 n
+0000011758 00000 n
+0000011988 00000 n
+0000012206 00000 n
+0000012436 00000 n
+0000012647 00000 n
+0000012858 00000 n
+0000013069 00000 n
+0000013280 00000 n
+0000013491 00000 n
+0000013686 00000 n
+0000013916 00000 n
+0000014127 00000 n
+0000014237 00000 n
+0000014485 00000 n
+0000014563 00000 n
+0000014680 00000 n
+0000014808 00000 n
+0000014950 00000 n
+0000015079 00000 n
+0000015221 00000 n
+0000015351 00000 n
+0000015486 00000 n
+0000015624 00000 n
+0000015761 00000 n
+0000015887 00000 n
+0000016021 00000 n
+0000016153 00000 n
+0000016294 00000 n
+0000016435 00000 n
+0000016588 00000 n
+0000016723 00000 n
+0000016880 00000 n
+0000017021 00000 n
+0000017133 00000 n
+0000017328 00000 n
+0000024949 00000 n
+0000032421 00000 n
+0000044985 00000 n
+0000061604 00000 n
+0000080185 00000 n
+0000097871 00000 n
+0000118285 00000 n
+0000137040 00000 n
+0000151750 00000 n
+0000166031 00000 n
+0000182361 00000 n
+0000198523 00000 n
+0000212236 00000 n
+0000228355 00000 n
+0000241287 00000 n
+0000255669 00000 n
+0000265819 00000 n
+0000278704 00000 n
+0000279122 00000 n
+0000279369 00000 n
+0000279407 00000 n
+0000279445 00000 n
+0000279483 00000 n
+0000279521 00000 n
+0000279559 00000 n
+0000279597 00000 n
+0000279635 00000 n
+0000279673 00000 n
+0000279711 00000 n
+0000279750 00000 n
+0000279789 00000 n
+0000279828 00000 n
+0000279867 00000 n
+0000279906 00000 n
+0000279945 00000 n
+0000279984 00000 n
+0000280023 00000 n
+0000280062 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
- [(\231\262\373k\004\241\377\267mp#\237\330Gl\026) (\231\262\373k\004\241\377\267mp#\237\330Gl\026)]
- /Info 77 0 R /Root 76 0 R /Size 136 >>
+ [(\001/{;`\255:\224G\357U\210\302\220\020\246) (\001/{;`\255:\224G\357U\210\302\220\020\246)]
+ /Info 78 0 R /Root 77 0 R /Size 139 >>
startxref
-271326
+280101
%%EOF
|
