diff options
| -rw-r--r-- | documentation.pdf | 885 | ||||
| -rw-r--r-- | documentation.rst | 34 | ||||
| -rw-r--r-- | src/tests/documentation.py | 93 |
3 files changed, 623 insertions, 389 deletions
diff --git a/documentation.pdf b/documentation.pdf index d6787e7..83305f8 100644 --- a/documentation.pdf +++ b/documentation.pdf @@ -1,7 +1,7 @@ %PDF-1.4
%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
1 0 obj
-<< /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 50 0 R /F5 53 0 R /F6 54 0 R >>
+<< /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 50 0 R /F5 54 0 R /F6 55 0 R >>
endobj
2 0 obj
<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>
@@ -19,310 +19,313 @@ endobj << /A << /S /URI /Type /Action /URI (http://pypi.python.org/pypi/decorator/4.0.0) >> /Border [ 0 0 0 ] /Rect [ 153.7323 659.7736 338.2823 671.7736 ] /Subtype /Link /Type /Annot >>
endobj
7 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 560.0236 121.0229 572.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 560.0236 121.0229 572.0236 ] /Subtype /Link /Type /Annot >>
endobj
8 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 560.7736 532.5827 572.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 560.7736 532.5827 572.7736 ] /Subtype /Link /Type /Annot >>
endobj
9 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 594.0236 0 ] /Rect [ 62.69291 542.0236 117.3029 554.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 594.0236 0 ] /Rect [ 62.69291 542.0236 117.3029 554.0236 ] /Subtype /Link /Type /Annot >>
endobj
10 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 594.0236 0 ] /Rect [ 527.0227 542.7736 532.5827 554.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 594.0236 0 ] /Rect [ 527.0227 542.7736 532.5827 554.7736 ] /Subtype /Link /Type /Annot >>
endobj
11 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 381.0236 0 ] /Rect [ 62.69291 524.0236 182.7229 536.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 381.0236 0 ] /Rect [ 62.69291 524.0236 182.7229 536.0236 ] /Subtype /Link /Type /Annot >>
endobj
12 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 381.0236 0 ] /Rect [ 527.0227 524.7736 532.5827 536.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 381.0236 0 ] /Rect [ 527.0227 524.7736 532.5827 536.7736 ] /Subtype /Link /Type /Annot >>
endobj
13 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 506.0236 114.3629 518.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 506.0236 114.3629 518.0236 ] /Subtype /Link /Type /Annot >>
endobj
14 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 506.7736 532.5827 518.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 506.7736 532.5827 518.7736 ] /Subtype /Link /Type /Annot >>
endobj
15 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 528.0236 0 ] /Rect [ 62.69291 488.0236 183.2629 500.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 528.0236 0 ] /Rect [ 62.69291 488.0236 183.2629 500.0236 ] /Subtype /Link /Type /Annot >>
endobj
16 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 528.0236 0 ] /Rect [ 527.0227 488.7736 532.5827 500.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 528.0236 0 ] /Rect [ 527.0227 488.7736 532.5827 500.7736 ] /Subtype /Link /Type /Annot >>
endobj
17 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 469.4236 0 ] /Rect [ 62.69291 470.0236 122.1429 482.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 469.4236 0 ] /Rect [ 62.69291 470.0236 122.1429 482.0236 ] /Subtype /Link /Type /Annot >>
endobj
18 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 57 0 R /XYZ 62.69291 469.4236 0 ] /Rect [ 527.0227 470.7736 532.5827 482.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 469.4236 0 ] /Rect [ 527.0227 470.7736 532.5827 482.7736 ] /Subtype /Link /Type /Annot >>
endobj
19 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 62.69291 452.0236 69.91291 464.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 62.69291 452.0236 69.91291 464.0236 ] /Subtype /Link /Type /Annot >>
endobj
20 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 72.69291 452.0236 102.6929 464.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 72.69291 452.0236 102.6929 464.0236 ] /Subtype /Link /Type /Annot >>
endobj
21 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 108.6929 452.0236 154.8129 464.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 108.6929 452.0236 154.8129 464.0236 ] /Subtype /Link /Type /Annot >>
endobj
22 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 527.0227 452.7736 532.5827 464.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 492.6236 0 ] /Rect [ 527.0227 452.7736 532.5827 464.7736 ] /Subtype /Link /Type /Annot >>
endobj
23 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 631.8236 0 ] /Rect [ 62.69291 434.0236 164.3629 446.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 631.8236 0 ] /Rect [ 62.69291 434.0236 164.3629 446.0236 ] /Subtype /Link /Type /Annot >>
endobj
24 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 631.8236 0 ] /Rect [ 527.0227 434.7736 532.5827 446.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 631.8236 0 ] /Rect [ 527.0227 434.7736 532.5827 446.7736 ] /Subtype /Link /Type /Annot >>
endobj
25 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 416.0236 176.6929 428.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 416.0236 176.6929 428.0236 ] /Subtype /Link /Type /Annot >>
endobj
26 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 416.7736 532.5827 428.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 416.7736 532.5827 428.7736 ] /Subtype /Link /Type /Annot >>
endobj
27 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 317.2236 0 ] /Rect [ 62.69291 398.0236 110.6929 410.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 317.2236 0 ] /Rect [ 62.69291 398.0236 110.6929 410.0236 ] /Subtype /Link /Type /Annot >>
endobj
28 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 61 0 R /XYZ 62.69291 317.2236 0 ] /Rect [ 527.0227 398.7736 532.5827 410.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 317.2236 0 ] /Rect [ 527.0227 398.7736 532.5827 410.7736 ] /Subtype /Link /Type /Annot >>
endobj
29 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 434.6236 0 ] /Rect [ 62.69291 380.0236 146.6929 392.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 434.6236 0 ] /Rect [ 62.69291 380.0236 146.6929 392.0236 ] /Subtype /Link /Type /Annot >>
endobj
30 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 62 0 R /XYZ 62.69291 434.6236 0 ] /Rect [ 527.0227 380.7736 532.5827 392.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 434.6236 0 ] /Rect [ 527.0227 380.7736 532.5827 392.7736 ] /Subtype /Link /Type /Annot >>
endobj
31 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 62.69291 362.0236 139.9329 374.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 62.69291 362.0236 139.9329 374.0236 ] /Subtype /Link /Type /Annot >>
endobj
32 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 63 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 527.0227 362.7736 532.5827 374.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 527.0227 362.7736 532.5827 374.7736 ] /Subtype /Link /Type /Annot >>
endobj
33 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 62.69291 344.0236 80.47291 356.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 62.69291 344.0236 80.47291 356.0236 ] /Subtype /Link /Type /Annot >>
endobj
34 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 83.25291 344.0236 161.2529 356.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 83.25291 344.0236 161.2529 356.0236 ] /Subtype /Link /Type /Annot >>
endobj
35 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 167.2529 344.0236 192.2729 356.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 167.2529 344.0236 192.2729 356.0236 ] /Subtype /Link /Type /Annot >>
endobj
36 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 64 0 R /XYZ 62.69291 669.0236 0 ] /Rect [ 521.4627 344.7736 532.5827 356.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 669.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 [ 66 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 62.69291 326.0236 177.1629 338.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 62.69291 326.0236 177.1629 338.0236 ] /Subtype /Link /Type /Annot >>
endobj
38 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 66 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 521.4627 326.7736 532.5827 338.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 521.4627 326.7736 532.5827 338.7736 ] /Subtype /Link /Type /Annot >>
endobj
39 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 66 0 R /XYZ 62.69291 180.0236 0 ] /Rect [ 62.69291 308.0236 228.2829 320.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /XYZ 62.69291 180.0236 0 ] /Rect [ 62.69291 308.0236 228.2829 320.0236 ] /Subtype /Link /Type /Annot >>
endobj
40 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 66 0 R /XYZ 62.69291 180.0236 0 ] /Rect [ 521.4627 308.7736 532.5827 320.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /XYZ 62.69291 180.0236 0 ] /Rect [ 521.4627 308.7736 532.5827 320.7736 ] /Subtype /Link /Type /Annot >>
endobj
41 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 69 0 R /XYZ 62.69291 445.4236 0 ] /Rect [ 62.69291 290.0236 144.3729 302.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 70 0 R /XYZ 62.69291 445.4236 0 ] /Rect [ 62.69291 290.0236 144.3729 302.0236 ] /Subtype /Link /Type /Annot >>
endobj
42 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 69 0 R /XYZ 62.69291 445.4236 0 ] /Rect [ 521.4627 290.7736 532.5827 302.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 70 0 R /XYZ 62.69291 445.4236 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 503.8236 0 ] /Rect [ 62.69291 272.0236 251.0829 284.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 72 0 R /XYZ 62.69291 503.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 503.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 503.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 [ 73 0 R /XYZ 62.69291 675.0236 0 ] /Rect [ 62.69291 254.0236 174.3929 266.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 74 0 R /XYZ 62.69291 448.6236 0 ] /Rect [ 62.69291 254.0236 174.3929 266.0236 ] /Subtype /Link /Type /Annot >>
endobj
46 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 73 0 R /XYZ 62.69291 675.0236 0 ] /Rect [ 521.4627 254.7736 532.5827 266.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 74 0 R /XYZ 62.69291 448.6236 0 ] /Rect [ 521.4627 254.7736 532.5827 266.7736 ] /Subtype /Link /Type /Annot >>
endobj
47 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 76 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 236.0236 106.0329 248.0236 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 77 0 R /XYZ 62.69291 575.8236 0 ] /Rect [ 62.69291 236.0236 106.0329 248.0236 ] /Subtype /Link /Type /Annot >>
endobj
48 0 obj
-<< /Border [ 0 0 0 ] /Contents () /Dest [ 76 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 521.4627 236.7736 532.5827 248.7736 ] /Subtype /Link /Type /Annot >>
+<< /Border [ 0 0 0 ] /Contents () /Dest [ 77 0 R /XYZ 62.69291 575.8236 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 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
+ 45 0 R 46 0 R 47 0 R 48 0 R ] /Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 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 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 >>
+<< /A << /S /URI /Type /Action /URI (http://pythonwheels.com/) >> /Border [ 0 0 0 ] /Rect [ 397.6066 642.0236 425.9338 654.0236 ] /Subtype /Link /Type /Annot >>
endobj
52 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.python.org/moin/PythonDecoratorLibrary) >> /Border [ 0 0 0 ] /Rect [ 219.6428 453.0236 449.1728 465.0236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 51 0 R ] /Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
53 0 obj
-<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font >>
+<< /A << /S /URI /Type /Action /URI (http://www.python.org/moin/PythonDecoratorLibrary) >> /Border [ 0 0 0 ] /Rect [ 219.6428 453.0236 449.1728 465.0236 ] /Subtype /Link /Type /Annot >>
endobj
54 0 obj
-<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font >>
+<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font >>
endobj
55 0 obj
-<< /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 >>
+<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font >>
endobj
56 0 obj
-<< /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 >>
+<< /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
57 0 obj
-<< /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 >>
+<< /Annots [ 53 0 R 56 0 R ] /Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
58 0 obj
-<< /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 << >>
+<< /Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 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 >>
+<< /Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
60 0 obj
-<< /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 >>
+<< /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
61 0 obj
-<< /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 >>
+<< /Annots [ 60 0 R ] /Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
62 0 obj
-<< /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 << >>
+<< /Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
63 0 obj
-<< /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 << >>
+<< /Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
64 0 obj
-<< /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 << >>
+<< /Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 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 345.2236 172.2473 357.2236 ] /Subtype /Link /Type /Annot >>
+<< /Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
66 0 obj
-<< /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 >>
+<< /A << /S /URI /Type /Action /URI (http://bugs.python.org/issue1764286) >> /Border [ 0 0 0 ] /Rect [ 133.3162 345.2236 172.2473 357.2236 ] /Subtype /Link /Type /Annot >>
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 515.8236 363.4029 527.8236 ] /Subtype /Link /Type /Annot >>
+<< /Annots [ 66 0 R ] /Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
68 0 obj
-<< /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 >>
+<< /A << /S /URI /Type /Action /URI (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) >> /Border [ 0 0 0 ] /Rect [ 62.69291 515.8236 363.4029 527.8236 ] /Subtype /Link /Type /Annot >>
endobj
69 0 obj
-<< /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 >>
+<< /Annots [ 68 0 R ] /Contents 112 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
70 0 obj
-<< /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 << >>
+<< /Contents 113 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
71 0 obj
-<< /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 << >>
+<< /Contents 114 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
72 0 obj
-<< /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 << >>
+<< /Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
73 0 obj
-<< /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 << >>
+<< /Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
/Type /Page >>
endobj
74 0 obj
-<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 593.8236 317.8397 605.8236 ] /Subtype /Link /Type /Annot >>
+<< /Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
75 0 obj
-<< /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 >>
+<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 370.6236 317.8397 382.6236 ] /Subtype /Link /Type /Annot >>
endobj
76 0 obj
-<< /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 >>
+<< /Annots [ 75 0 R ] /Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0
+ /Trans << >> /Type /Page >>
endobj
77 0 obj
-<< /Outlines 79 0 R /PageLabels 119 0 R /PageMode /UseNone /Pages 99 0 R /Type /Catalog >>
+<< /Contents 119 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 100 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >>
+ /Type /Page >>
endobj
78 0 obj
-<< /Author (Michele Simionato) /CreationDate (D:20150722135458-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
- /Title (The decorator module) >>
+<< /Outlines 80 0 R /PageLabels 120 0 R /PageMode /UseNone /Pages 100 0 R /Type /Catalog >>
endobj
79 0 obj
-<< /Count 19 /First 80 0 R /Last 98 0 R /Type /Outlines >>
+<< /Author (Michele Simionato) /CreationDate (D:20150722163825-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\))
+ /Title (The decorator module) >>
endobj
80 0 obj
-<< /Dest [ 51 0 R /XYZ 62.69291 765.0236 0 ] /Next 81 0 R /Parent 79 0 R /Title (Introduction) >>
+<< /Count 19 /First 81 0 R /Last 99 0 R /Type /Outlines >>
endobj
81 0 obj
-<< /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) >>
+<< /Dest [ 52 0 R /XYZ 62.69291 765.0236 0 ] /Next 82 0 R /Parent 80 0 R /Title (Introduction) >>
endobj
82 0 obj
-<< /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) >>
+<< /Dest [ 52 0 R /XYZ 62.69291 594.0236 0 ] /Next 83 0 R /Parent 80 0 R /Prev 81 0 R /Title (What's new) >>
endobj
83 0 obj
-<< /Dest [ 56 0 R /XYZ 62.69291 765.0236 0 ] /Next 84 0 R /Parent 79 0 R /Prev 82 0 R /Title (Definitions) >>
+<< /Dest [ 52 0 R /XYZ 62.69291 381.0236 0 ] /Next 84 0 R /Parent 80 0 R /Prev 82 0 R /Title (Usefulness of decorators) >>
endobj
84 0 obj
-<< /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) >>
+<< /Dest [ 57 0 R /XYZ 62.69291 765.0236 0 ] /Next 85 0 R /Parent 80 0 R /Prev 83 0 R /Title (Definitions) >>
endobj
85 0 obj
-<< /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) >>
+<< /Dest [ 57 0 R /XYZ 62.69291 528.0236 0 ] /Next 86 0 R /Parent 80 0 R /Prev 84 0 R /Title (Statement of the problem) >>
endobj
86 0 obj
-<< /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) >>
+<< /Dest [ 58 0 R /XYZ 62.69291 469.4236 0 ] /Next 87 0 R /Parent 80 0 R /Prev 85 0 R /Title (The solution) >>
endobj
87 0 obj
-<< /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) >>
+<< /Dest [ 59 0 R /XYZ 62.69291 492.6236 0 ] /Next 88 0 R /Parent 80 0 R /Prev 86 0 R /Title (A trace decorator) >>
endobj
88 0 obj
-<< /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) >>
+<< /Dest [ 61 0 R /XYZ 62.69291 631.8236 0 ] /Next 89 0 R /Parent 80 0 R /Prev 87 0 R /Title (Function annotations) >>
endobj
89 0 obj
-<< /Dest [ 61 0 R /XYZ 62.69291 317.2236 0 ] /Next 90 0 R /Parent 79 0 R /Prev 88 0 R /Title (blocking) >>
+<< /Dest [ 62 0 R /XYZ 62.69291 765.0236 0 ] /Next 90 0 R /Parent 80 0 R /Prev 88 0 R /Title (decorator.decorator) >>
endobj
90 0 obj
-<< /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\)) >>
+<< /Dest [ 62 0 R /XYZ 62.69291 317.2236 0 ] /Next 91 0 R /Parent 80 0 R /Prev 89 0 R /Title (blocking) >>
endobj
91 0 obj
-<< /Dest [ 63 0 R /XYZ 62.69291 542.6236 0 ] /Next 92 0 R /Parent 79 0 R /Prev 90 0 R /Title (contextmanager) >>
+<< /Dest [ 63 0 R /XYZ 62.69291 434.6236 0 ] /Next 92 0 R /Parent 80 0 R /Prev 90 0 R /Title (decorator\(cls\)) >>
endobj
92 0 obj
-<< /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) >>
+<< /Dest [ 64 0 R /XYZ 62.69291 542.6236 0 ] /Next 93 0 R /Parent 80 0 R /Prev 91 0 R /Title (contextmanager) >>
endobj
93 0 obj
-<< /Dest [ 66 0 R /XYZ 62.69291 647.8236 0 ] /Next 94 0 R /Parent 79 0 R /Prev 92 0 R /Title (Getting the source code) >>
+<< /Dest [ 65 0 R /XYZ 62.69291 669.0236 0 ] /Next 94 0 R /Parent 80 0 R /Prev 92 0 R /Title (The FunctionMaker class) >>
endobj
94 0 obj
-<< /Dest [ 66 0 R /XYZ 62.69291 180.0236 0 ] /Next 95 0 R /Parent 79 0 R /Prev 93 0 R /Title (Dealing with third party decorators) >>
+<< /Dest [ 67 0 R /XYZ 62.69291 647.8236 0 ] /Next 95 0 R /Parent 80 0 R /Prev 93 0 R /Title (Getting the source code) >>
endobj
95 0 obj
-<< /Dest [ 69 0 R /XYZ 62.69291 445.4236 0 ] /Next 96 0 R /Parent 79 0 R /Prev 94 0 R /Title (Multiple dispatch) >>
+<< /Dest [ 67 0 R /XYZ 62.69291 180.0236 0 ] /Next 96 0 R /Parent 80 0 R /Prev 94 0 R /Title (Dealing with third party decorators) >>
endobj
96 0 obj
-<< /Dest [ 71 0 R /XYZ 62.69291 503.8236 0 ] /Next 97 0 R /Parent 79 0 R /Prev 95 0 R /Title (Generic functions and virtual ancestors) >>
+<< /Dest [ 70 0 R /XYZ 62.69291 445.4236 0 ] /Next 97 0 R /Parent 80 0 R /Prev 95 0 R /Title (Multiple dispatch) >>
endobj
97 0 obj
-<< /Dest [ 73 0 R /XYZ 62.69291 675.0236 0 ] /Next 98 0 R /Parent 79 0 R /Prev 96 0 R /Title (Caveats and limitations) >>
+<< /Dest [ 72 0 R /XYZ 62.69291 503.8236 0 ] /Next 98 0 R /Parent 80 0 R /Prev 96 0 R /Title (Generic functions and virtual ancestors) >>
endobj
98 0 obj
-<< /Dest [ 76 0 R /XYZ 62.69291 765.0236 0 ] /Parent 79 0 R /Prev 97 0 R /Title (LICENSE) >>
+<< /Dest [ 74 0 R /XYZ 62.69291 448.6236 0 ] /Next 99 0 R /Parent 80 0 R /Prev 97 0 R /Title (Caveats and limitations) >>
endobj
99 0 obj
-<< /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 >>
+<< /Dest [ 77 0 R /XYZ 62.69291 575.8236 0 ] /Parent 80 0 R /Prev 98 0 R /Title (LICENSE) >>
endobj
100 0 obj
+<< /Count 19 /Kids [ 49 0 R 52 0 R 57 0 R 58 0 R 59 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R
+ 67 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 76 0 R 77 0 R ] /Type /Pages >>
+endobj
+101 0 obj
<< /Length 7563 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -760,8 +763,8 @@ Q endstream
endobj
-101 0 obj
-<< /Length 7414 >>
+102 0 obj
+<< /Length 7450 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -773,7 +776,7 @@ Q q
1 0 0 1 62.69291 606.0236 cm
q
-BT 1 0 0 1 0 122 Tm 1.033876 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorator module is over ten years old, but still alive and kicking. It is used by several frameworks) Tj T* 0 Tw 1.737356 Tw (\(IPython, scipy, pyramid,...\) and has been stable for a ) Tj /F4 10 Tf (long ) Tj /F1 10 Tf (time. It is your best option if you want to) Tj T* 0 Tw .607984 Tw (preserve the signature of decorated functions in a consistent way across Python releases. Version 4.0 is) Tj T* 0 Tw 1.318221 Tw (fully compatible with the past, except for one thing: support for Python 2.4 and 2.5 has been dropped.) Tj T* 0 Tw .843488 Tw (That decision made it possible to use a single code base both for Python 2.X and Python 3.X. This is a) Tj T* 0 Tw 2.409982 Tw /F4 10 Tf (huge ) Tj /F1 10 Tf (bonus, since I could remove over 2,000 lines of duplicated documentation/doctests. Having to) Tj T* 0 Tw .18561 Tw (maintain separate docs for Python 2 and Python 3 effectively stopped any development on the module for) Tj T* 0 Tw 2.207209 Tw (several years. Moreover, it is now trivial to distribute the module as a wheel since 2to3 is no more) Tj T* 0 Tw .038935 Tw (required. Since Python 2.5 has been released 9 years ago, I felt that it was reasonable to drop the support) Tj T* 0 Tw .012209 Tw (for it. If you need to support ancient versions of Python, stick with the decorator module version 3.4.2. This) Tj T* 0 Tw (version supports all Python releases from 2.6 up to 3.5, which currently is still in beta status.) Tj T* ET
+BT 1 0 0 1 0 122 Tm 1.033876 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorator module is over ten years old, but still alive and kicking. It is used by several frameworks) Tj T* 0 Tw 1.737356 Tw (\(IPython, scipy, pyramid,...\) and has been stable for a ) Tj /F4 10 Tf (long ) Tj /F1 10 Tf (time. It is your best option if you want to) Tj T* 0 Tw .607984 Tw (preserve the signature of decorated functions in a consistent way across Python releases. Version 4.0 is) Tj T* 0 Tw 1.318221 Tw (fully compatible with the past, except for one thing: support for Python 2.4 and 2.5 has been dropped.) Tj T* 0 Tw .843488 Tw (That decision made it possible to use a single code base both for Python 2.X and Python 3.X. This is a) Tj T* 0 Tw 2.409982 Tw /F4 10 Tf (huge ) Tj /F1 10 Tf (bonus, since I could remove over 2,000 lines of duplicated documentation/doctests. Having to) Tj T* 0 Tw .18561 Tw (maintain separate docs for Python 2 and Python 3 effectively stopped any development on the module for) Tj T* 0 Tw 2.207209 Tw (several years. Moreover, it is now trivial to distribute the module as a ) Tj 0 0 .501961 rg (wheel ) Tj 0 0 0 rg (since 2to3 is no more) Tj T* 0 Tw .038935 Tw (required. Since Python 2.5 has been released 9 years ago, I felt that it was reasonable to drop the support) Tj T* 0 Tw .012209 Tw (for it. If you need to support ancient versions of Python, stick with the decorator module version 3.4.2. This) Tj T* 0 Tw (version supports all Python releases from 2.6 up to 3.5, which currently is still in beta status.) Tj T* ET
Q
Q
q
@@ -931,7 +934,7 @@ Q endstream
endobj
-102 0 obj
+103 0 obj
<< /Length 12505 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1262,7 +1265,7 @@ Q endstream
endobj
-103 0 obj
+104 0 obj
<< /Length 16560 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -1742,7 +1745,7 @@ Q endstream
endobj
-104 0 obj
+105 0 obj
<< /Length 18522 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2335,7 +2338,7 @@ Q endstream
endobj
-105 0 obj
+106 0 obj
<< /Length 17634 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -2846,7 +2849,7 @@ Q endstream
endobj
-106 0 obj
+107 0 obj
<< /Length 20355 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -3412,7 +3415,7 @@ Q endstream
endobj
-107 0 obj
+108 0 obj
<< /Length 18696 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -3915,7 +3918,7 @@ Q endstream
endobj
-108 0 obj
+109 0 obj
<< /Length 14651 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -4338,7 +4341,7 @@ Q endstream
endobj
-109 0 obj
+110 0 obj
<< /Length 14222 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -4639,15 +4642,14 @@ Q endstream
endobj
-110 0 obj
-<< /Length 18338 >>
+111 0 obj
+<< /Length 18456 >>
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
-0 0 0 rg
-BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .795697 Tw (Notice: you should not pass signature strings with default arguments, i.e. something like 'f1\(a, b=None\)'.) Tj T* 0 Tw (Just pass 'f1\(a, b\)' and then a tuple of defaults:) Tj T* ET
+BT 1 0 0 1 0 14 Tm 6.828314 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice: you should not pass signature strings with default arguments, i.e. something like) Tj T* 0 Tw /F3 10 Tf 0 0 0 rg ('f1\(a,) Tj ( ) Tj (b=None\)') Tj /F1 10 Tf 0 0 0 rg (. Just pass ) Tj /F3 10 Tf 0 0 0 rg ('f1\(a,) Tj ( ) Tj (b\)' ) Tj /F1 10 Tf 0 0 0 rg (and then a tuple of defaults:) Tj T* ET
Q
Q
q
@@ -5157,7 +5159,7 @@ Q endstream
endobj
-111 0 obj
+112 0 obj
<< /Length 16552 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -5575,7 +5577,7 @@ Q endstream
endobj
-112 0 obj
+113 0 obj
<< /Length 12371 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -5900,7 +5902,7 @@ Q endstream
endobj
-113 0 obj
+114 0 obj
<< /Length 16993 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -6449,7 +6451,7 @@ Q endstream
endobj
-114 0 obj
+115 0 obj
<< /Length 14159 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
@@ -6906,8 +6908,8 @@ Q endstream
endobj
-115 0 obj
-<< /Length 14956 >>
+116 0 obj
+<< /Length 12865 >>
stream
1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
@@ -7177,19 +7179,222 @@ Q Q
Q
q
-1 0 0 1 62.69291 267.0236 cm
+1 0 0 1 62.69291 255.0236 cm
+q
+BT 1 0 0 1 0 50 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 2.135777 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. Still, the implementation in the decorator module is easy to) Tj T* 0 Tw 2.038555 Tw (undestand, once one declare that real ancestors take the precedence over virtual ancestors and the) Tj T* 0 Tw (problem can be solved anyway by subclassing. As a matter of fact, if we define a subclass) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 161.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 84 re B*
+Q
+q
+.960784 .960784 .862745 rg
+n 0 60 30 12 re f*
+.960784 .960784 .862745 rg
+n 36 60 48 12 re f*
+.960784 .960784 .862745 rg
+n 84 60 6 12 re f*
+.960784 .960784 .862745 rg
+n 90 60 42 12 re f*
+.960784 .960784 .862745 rg
+n 132 60 6 12 re f*
+.960784 .960784 .862745 rg
+n 144 60 66 12 re f*
+.960784 .960784 .862745 rg
+n 210 60 6 12 re f*
+.960784 .960784 .862745 rg
+n 216 60 18 12 re f*
+.960784 .960784 .862745 rg
+n 234 60 12 12 re f*
+.960784 .960784 .862745 rg
+n 24 48 18 12 re f*
+.960784 .960784 .862745 rg
+n 48 48 72 12 re f*
+.960784 .960784 .862745 rg
+n 120 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 126 48 24 12 re f*
+.960784 .960784 .862745 rg
+n 150 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 162 48 6 12 re f*
+.960784 .960784 .862745 rg
+n 168 48 12 12 re f*
+.960784 .960784 .862745 rg
+n 48 36 36 12 re f*
+.960784 .960784 .862745 rg
+n 90 36 24 12 re f*
+.960784 .960784 .862745 rg
+n 24 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 48 12 48 12 re f*
+.960784 .960784 .862745 rg
+n 96 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 102 12 24 12 re f*
+.960784 .960784 .862745 rg
+n 126 12 12 12 re f*
+.960784 .960784 .862745 rg
+n 48 0 30 12 re f*
+.960784 .960784 .862745 rg
+n 84 0 6 12 re f*
+BT 1 0 0 1 0 62 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 (SomeSet2) Tj /F3 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (SomeSet) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (collections) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Set) 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 (__contains__) 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 (a) 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 (True) 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 (__iter__) 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 (yield) Tj /F3 10 Tf 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 141.8236 cm
q
-BT 1 0 0 1 0 38 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 2.135777 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. Still, the implementation in the decorator module is easy to) Tj T* 0 Tw (undestand, once one declare that real ancestors take the precedence over virtual ancestors.) Tj T* ET
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (which inherits from ) Tj /F3 10 Tf 0 0 0 rg (collections.Set) Tj /F1 10 Tf 0 0 0 rg (, we get as expected) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 225.0236 cm
+1 0 0 1 62.69291 96.62362 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 6 12 re f*
+.960784 .960784 .862745 rg
+n 6 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 12 12 6 12 re f*
+.960784 .960784 .862745 rg
+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 48 12 re f*
+.960784 .960784 .862745 rg
+n 138 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 (SomeSet2) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* .4 .4 .4 rg (1) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+
+endstream
+endobj
+117 0 obj
+<< /Length 11086 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
+q
+1 0 0 1 62.69291 753.0236 cm
+q
+BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (consistently with the method resolution order, with ) Tj /F3 10 Tf 0 0 0 rg (Set ) Tj /F1 10 Tf 0 0 0 rg (having the precedence with respect to ) Tj /F3 10 Tf 0 0 0 rg (Sized) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET
+Q
+Q
+q
+1 0 0 1 62.69291 707.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 0 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 6 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 12 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 24 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 30 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 36 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 42 12 48 12 re f*
+.960784 .960784 .862745 rg
+n 96 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 120 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 132 12 12 12 re f*
+.960784 .960784 .862745 rg
+n 150 12 48 12 re f*
+.960784 .960784 .862745 rg
+n 198 12 6 12 re f*
+.960784 .960784 .862745 rg
+n 204 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 222 12 18 12 re f*
+.960784 .960784 .862745 rg
+n 0 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 6 0 60 12 re f*
+.960784 .960784 .862745 rg
+n 66 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 78 0 54 12 re f*
+.960784 .960784 .862745 rg
+n 132 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 144 0 30 12 re f*
+.960784 .960784 .862745 rg
+n 174 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 186 0 42 12 re f*
+.960784 .960784 .862745 rg
+n 228 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 240 0 60 12 re f*
+.960784 .960784 .862745 rg
+n 300 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 312 0 66 12 re f*
+.960784 .960784 .862745 rg
+n 378 0 6 12 re f*
+.960784 .960784 .862745 rg
+n 390 0 48 12 re f*
+.960784 .960784 .862745 rg
+n 438 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 ([) Tj 0 0 0 rg (c) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) 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 (c) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (SomeSet2) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (mro) Tj 0 0 0 rg (\(\)]) Tj 0 0 0 rg T* 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('SomeSet2') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('SomeSet') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('Set') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('Sized') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('Iterable') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('Container') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('object') Tj 0 0 0 rg (]) Tj T* ET
+Q
+Q
+Q
+Q
+Q
+q
+1 0 0 1 62.69291 663.8236 cm
q
BT 1 0 0 1 0 26 Tm 1.365976 Tw 12 TL /F1 10 Tf 0 0 0 rg (The functions implemented via ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (are smarter when there are conflicting) Tj T* 0 Tw .691654 Tw (implementations and are able to solve more potential conflicts. Just to have an idea of what I am talking) Tj T* 0 Tw (about, here is a situation with a conflict:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 107.8236 cm
+1 0 0 1 62.69291 546.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -7330,40 +7535,33 @@ Q Q
Q
Q
-
-endstream
-endobj
-116 0 obj
-<< /Length 8003 >>
-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 490.6236 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 4.906647 Tw /F3 10 Tf 0 0 0 rg (collections.Sized) Tj /F1 10 Tf 0 0 0 rg (, which are not related by subclassing, it is impossible to decide which) Tj T* 0 Tw .214269 Tw (implementation should be taken. Consistently with the ) Tj /F4 10 Tf (refuse the temptation to guess ) Tj /F1 10 Tf (philosophy, an error) Tj T* 0 Tw (is raised. ) Tj /F3 10 Tf 0 0 0 rg (functools.singledispatch ) Tj /F1 10 Tf 0 0 0 rg (would work exactly the same in this case.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 687.0236 cm
+1 0 0 1 62.69291 460.6236 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 654.0236 cm
+1 0 0 1 62.69291 427.6236 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 624.0236 cm
+1 0 0 1 62.69291 397.6236 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 398.8236 cm
+1 0 0 1 62.69291 172.4236 cm
q
q
1 0 0 1 0 0 cm
@@ -7384,13 +7582,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 378.8236 cm
+1 0 0 1 62.69291 152.4236 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 321.6236 cm
+1 0 0 1 62.69291 95.22362 cm
q
q
1 0 0 1 0 0 cm
@@ -7410,21 +7608,28 @@ Q Q
Q
Q
+
+endstream
+endobj
+118 0 obj
+<< /Length 14630 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 277.6236 cm
+1 0 0 1 62.69291 729.0236 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 247.6236 cm
+1 0 0 1 62.69291 699.0236 cm
q
0 0 0 rg
BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .091984 Tw (More importantly, you should be aware that decorators will make your tracebacks longer and more difficult) Tj T* 0 Tw (to understand. Consider this example:) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 190.4236 cm
+1 0 0 1 62.69291 641.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -7468,13 +7673,13 @@ Q Q
Q
q
-1 0 0 1 62.69291 158.4236 cm
+1 0 0 1 62.69291 609.8236 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 77.22362 cm
+1 0 0 1 62.69291 480.6236 cm
q
q
1 0 0 1 0 0 cm
@@ -7484,110 +7689,83 @@ q .662745 .662745 .662745 RG
.5 w
.960784 .960784 .862745 rg
-n -6 -6 468.6898 72 re B*
+n -6 -6 468.6898 120 re B*
Q
q
.960784 .960784 .862745 rg
-n 0 48 6 12 re f*
+n 0 96 6 12 re f*
.960784 .960784 .862745 rg
-n 6 48 6 12 re f*
+n 6 96 6 12 re f*
.960784 .960784 .862745 rg
-n 12 48 6 12 re f*
+n 12 96 6 12 re f*
.960784 .960784 .862745 rg
-n 24 48 6 12 re f*
+n 24 96 6 12 re f*
.960784 .960784 .862745 rg
-n 30 48 12 12 re f*
+n 30 96 12 12 re f*
.960784 .960784 .862745 rg
-n 0 36 54 12 re f*
+n 0 84 54 12 re f*
.960784 .960784 .862745 rg
-n 60 36 6 12 re f*
+n 60 84 6 12 re f*
.960784 .960784 .862745 rg
-n 66 36 24 12 re f*
+n 66 84 24 12 re f*
.960784 .960784 .862745 rg
-n 96 36 36 12 re f*
+n 96 84 36 12 re f*
.960784 .960784 .862745 rg
-n 138 36 24 12 re f*
+n 138 84 24 12 re f*
.960784 .960784 .862745 rg
-n 168 36 24 12 re f*
+n 168 84 24 12 re f*
.960784 .960784 .862745 rg
-n 192 36 12 12 re f*
+n 192 84 12 12 re f*
.960784 .960784 .862745 rg
-n 12 24 18 12 re f*
+n 12 72 18 12 re f*
.960784 .960784 .862745 rg
-n 30 12 24 12 re f*
+n 30 60 24 12 re f*
.960784 .960784 .862745 rg
-n 60 12 6 12 re f*
+n 60 60 6 12 re f*
.960784 .960784 .862745 rg
-n 66 12 6 12 re f*
+n 66 60 6 12 re f*
.960784 .960784 .862745 rg
-n 72 12 36 12 re f*
+n 72 60 36 12 re f*
.960784 .960784 .862745 rg
-n 108 12 6 12 re f*
+n 108 60 6 12 re f*
.960784 .960784 .862745 rg
-n 114 12 6 12 re f*
+n 114 60 6 12 re f*
.960784 .960784 .862745 rg
-n 120 12 6 12 re f*
+n 120 60 6 12 re f*
.960784 .960784 .862745 rg
-n 132 12 24 12 re f*
+n 132 60 24 12 re f*
.960784 .960784 .862745 rg
-n 162 12 6 12 re f*
+n 162 60 6 12 re f*
.960784 .960784 .862745 rg
-n 168 12 6 12 re f*
+n 168 60 6 12 re f*
.960784 .960784 .862745 rg
-n 180 12 12 12 re f*
+n 180 60 12 12 re f*
.960784 .960784 .862745 rg
-n 198 12 6 12 re f*
+n 198 60 6 12 re f*
.960784 .960784 .862745 rg
-n 30 0 24 12 re f*
+n 30 48 24 12 re f*
.960784 .960784 .862745 rg
-n 60 0 6 12 re f*
-.960784 .960784 .862745 rg
-n 66 0 6 12 re f*
+n 60 48 6 12 re f*
.960784 .960784 .862745 rg
-n 72 0 120 12 re f*
+n 66 48 6 12 re f*
.960784 .960784 .862745 rg
-n 192 0 6 12 re f*
+n 72 48 120 12 re f*
.960784 .960784 .862745 rg
-n 198 0 6 12 re f*
+n 192 48 6 12 re f*
.960784 .960784 .862745 rg
-n 204 0 6 12 re f*
+n 198 48 6 12 re f*
.960784 .960784 .862745 rg
-n 216 0 24 12 re f*
+n 204 48 6 12 re f*
.960784 .960784 .862745 rg
-n 246 0 6 12 re f*
+n 216 48 24 12 re f*
.960784 .960784 .862745 rg
-n 252 0 6 12 re f*
+n 246 48 6 12 re f*
.960784 .960784 .862745 rg
-n 264 0 12 12 re f*
+n 252 48 6 12 re f*
.960784 .960784 .862745 rg
-n 282 0 30 12 re f*
-BT 1 0 0 1 0 50 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) 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* ( ) Tj 0 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (string) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[22]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (4) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg T* ET
-Q
-Q
-Q
-Q
-Q
-
-endstream
-endobj
-117 0 obj
-<< /Length 14983 >>
-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
+n 264 48 12 12 re f*
.960784 .960784 .862745 rg
-n -6 -6 468.6898 60 re B*
-Q
-q
+n 282 48 30 12 re f*
.960784 .960784 .862745 rg
n 42 36 36 12 re f*
.960784 .960784 .862745 rg
@@ -7642,38 +7820,38 @@ n 0 0 102 12 re f* n 102 0 6 12 re f*
.960784 .960784 .862745 rg
n 114 0 18 12 re f*
-BT 1 0 0 1 0 38 Tm 12 TL /F3 10 Tf 0 0 0 rg ( ) Tj /F5 10 Tf 0 .501961 0 rg (return) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) 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 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[51]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg T* ( ) Tj .4 .4 .4 rg (1) Tj .4 .4 .4 rg (/) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg T* /F5 10 Tf .823529 .254902 .227451 rg (ZeroDivisionError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (...) Tj T* ET
+BT 1 0 0 1 0 98 Tm 12 TL /F3 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) 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* ( ) Tj 0 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (string) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[22]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (4) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (trace) 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 (f) 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 0 0 rg (File) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[51]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (line) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj /F5 10 Tf .666667 .133333 1 rg (in) Tj /F3 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg T* ( ) Tj .4 .4 .4 rg (1) Tj .4 .4 .4 rg (/) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg T* /F5 10 Tf .823529 .254902 .227451 rg (ZeroDivisionError) Tj /F3 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (...) Tj T* ET
Q
Q
Q
Q
Q
q
-1 0 0 1 62.69291 635.8236 cm
+1 0 0 1 62.69291 412.6236 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 509.8236 cm
+1 0 0 1 62.69291 286.6236 cm
q
BT 1 0 0 1 0 110 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.4 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 2.169398 Tw (maintaining the module and releasing new versions. It should be noticed that in Python 3.5 a lot of) Tj T* 0 Tw 9.189147 Tw (improvements have been made: in that version you can decorated a function with) Tj T* 0 Tw .084147 Tw /F3 10 Tf 0 0 0 rg (func_tools.update_wrapper ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F3 10 Tf 0 0 0 rg (pydoc ) Tj /F1 10 Tf 0 0 0 rg (will see the correct signature; still internally the function will) Tj T* 0 Tw 1.47748 Tw (have an incorrect signature, as you can see by using ) Tj /F3 10 Tf 0 0 0 rg (inspect.getfullargspec) Tj /F1 10 Tf 0 0 0 rg (: all documentation) Tj T* 0 Tw (tools using such function \(which has been correctly deprecated\) will see the wrong signature.) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 455.8236 cm
+1 0 0 1 62.69291 232.6236 cm
q
BT 1 0 0 1 0 38 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 2.15881 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 \(in Python 3.5 a lot of such) Tj T* 0 Tw (limitations have been removed\).) Tj T* ET
Q
Q
q
-1 0 0 1 62.69291 425.8236 cm
+1 0 0 1 62.69291 202.6236 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 308.6236 cm
+1 0 0 1 62.69291 85.42362 cm
q
q
1 0 0 1 0 0 cm
@@ -7774,15 +7952,22 @@ Q Q
Q
Q
+
+endstream
+endobj
+119 0 obj
+<< /Length 8045 >>
+stream
+1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET
q
-1 0 0 1 62.69291 276.6236 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 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 123.4236 cm
+1 0 0 1 62.69291 587.8236 cm
q
q
1 0 0 1 0 0 cm
@@ -7921,38 +8106,31 @@ Q Q
Q
Q
-
-endstream
-endobj
-118 0 obj
-<< /Length 2646 >>
-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 554.8236 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 726.0236 cm
+1 0 0 1 62.69291 536.8236 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 696.0236 cm
+1 0 0 1 62.69291 506.8236 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 690.0236 cm
+1 0 0 1 62.69291 500.8236 cm
Q
q
-1 0 0 1 62.69291 642.0236 cm
+1 0 0 1 62.69291 452.8236 cm
0 0 0 rg
BT /F1 10 Tf 12 TL ET
BT 1 0 0 1 0 2 Tm T* ET
@@ -7967,17 +8145,17 @@ q Q
Q
q
-1 0 0 1 62.69291 642.0236 cm
+1 0 0 1 62.69291 452.8236 cm
Q
q
-1 0 0 1 62.69291 516.0236 cm
+1 0 0 1 62.69291 326.8236 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 486.0236 cm
+1 0 0 1 62.69291 296.8236 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
@@ -7986,71 +8164,71 @@ Q endstream
endobj
-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
120 0 obj
-<< /S /D /St 1 >>
+<< /Nums [ 0 121 0 R 1 122 0 R 2 123 0 R 3 124 0 R 4 125 0 R
+ 5 126 0 R 6 127 0 R 7 128 0 R 8 129 0 R 9 130 0 R
+ 10 131 0 R 11 132 0 R 12 133 0 R 13 134 0 R 14 135 0 R
+ 15 136 0 R 16 137 0 R 17 138 0 R 18 139 0 R ] >>
endobj
121 0 obj
-<< /S /D /St 2 >>
+<< /S /D /St 1 >>
endobj
122 0 obj
-<< /S /D /St 3 >>
+<< /S /D /St 2 >>
endobj
123 0 obj
-<< /S /D /St 4 >>
+<< /S /D /St 3 >>
endobj
124 0 obj
-<< /S /D /St 5 >>
+<< /S /D /St 4 >>
endobj
125 0 obj
-<< /S /D /St 6 >>
+<< /S /D /St 5 >>
endobj
126 0 obj
-<< /S /D /St 7 >>
+<< /S /D /St 6 >>
endobj
127 0 obj
-<< /S /D /St 8 >>
+<< /S /D /St 7 >>
endobj
128 0 obj
-<< /S /D /St 9 >>
+<< /S /D /St 8 >>
endobj
129 0 obj
-<< /S /D /St 10 >>
+<< /S /D /St 9 >>
endobj
130 0 obj
-<< /S /D /St 11 >>
+<< /S /D /St 10 >>
endobj
131 0 obj
-<< /S /D /St 12 >>
+<< /S /D /St 11 >>
endobj
132 0 obj
-<< /S /D /St 13 >>
+<< /S /D /St 12 >>
endobj
133 0 obj
-<< /S /D /St 14 >>
+<< /S /D /St 13 >>
endobj
134 0 obj
-<< /S /D /St 15 >>
+<< /S /D /St 14 >>
endobj
135 0 obj
-<< /S /D /St 16 >>
+<< /S /D /St 15 >>
endobj
136 0 obj
-<< /S /D /St 17 >>
+<< /S /D /St 16 >>
endobj
137 0 obj
-<< /S /D /St 18 >>
+<< /S /D /St 17 >>
endobj
138 0 obj
+<< /S /D /St 18 >>
+endobj
+139 0 obj
<< /S /D /St 19 >>
endobj
xref
-0 139
+0 140
0000000000 65535 f
0000000075 00000 n
0000000162 00000 n
@@ -8101,100 +8279,101 @@ xref 0000007759 00000 n
0000007931 00000 n
0000008103 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
+0000008646 00000 n
+0000008765 00000 n
+0000008945 00000 n
+0000009176 00000 n
+0000009381 00000 n
+0000009495 00000 n
+0000009612 00000 n
+0000009839 00000 n
+0000010077 00000 n
+0000010289 00000 n
+0000010501 00000 n
+0000010697 00000 n
+0000010928 00000 n
+0000011140 00000 n
+0000011352 00000 n
+0000011564 00000 n
+0000011776 00000 n
+0000011967 00000 n
+0000012198 00000 n
+0000012416 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
-0000097878 00000 n
-0000118292 00000 n
-0000137047 00000 n
-0000151757 00000 n
-0000166038 00000 n
-0000184435 00000 n
-0000201046 00000 n
-0000213476 00000 n
-0000230528 00000 n
-0000244746 00000 n
-0000259761 00000 n
-0000267822 00000 n
-0000282864 00000 n
-0000285568 00000 n
-0000285815 00000 n
-0000285853 00000 n
-0000285891 00000 n
-0000285929 00000 n
-0000285967 00000 n
-0000286005 00000 n
-0000286043 00000 n
-0000286081 00000 n
-0000286119 00000 n
-0000286157 00000 n
-0000286196 00000 n
-0000286235 00000 n
-0000286274 00000 n
-0000286313 00000 n
-0000286352 00000 n
-0000286391 00000 n
-0000286430 00000 n
-0000286469 00000 n
-0000286508 00000 n
+0000012859 00000 n
+0000013071 00000 n
+0000013283 00000 n
+0000013495 00000 n
+0000013707 00000 n
+0000013902 00000 n
+0000014133 00000 n
+0000014345 00000 n
+0000014456 00000 n
+0000014704 00000 n
+0000014782 00000 n
+0000014899 00000 n
+0000015027 00000 n
+0000015169 00000 n
+0000015298 00000 n
+0000015440 00000 n
+0000015570 00000 n
+0000015705 00000 n
+0000015843 00000 n
+0000015980 00000 n
+0000016106 00000 n
+0000016240 00000 n
+0000016372 00000 n
+0000016513 00000 n
+0000016654 00000 n
+0000016807 00000 n
+0000016942 00000 n
+0000017099 00000 n
+0000017240 00000 n
+0000017352 00000 n
+0000017548 00000 n
+0000025169 00000 n
+0000032677 00000 n
+0000045241 00000 n
+0000061860 00000 n
+0000080441 00000 n
+0000098134 00000 n
+0000118548 00000 n
+0000137303 00000 n
+0000152013 00000 n
+0000166294 00000 n
+0000184809 00000 n
+0000201420 00000 n
+0000213850 00000 n
+0000230902 00000 n
+0000245120 00000 n
+0000258044 00000 n
+0000269189 00000 n
+0000283878 00000 n
+0000291981 00000 n
+0000292228 00000 n
+0000292266 00000 n
+0000292304 00000 n
+0000292342 00000 n
+0000292380 00000 n
+0000292418 00000 n
+0000292456 00000 n
+0000292494 00000 n
+0000292532 00000 n
+0000292570 00000 n
+0000292609 00000 n
+0000292648 00000 n
+0000292687 00000 n
+0000292726 00000 n
+0000292765 00000 n
+0000292804 00000 n
+0000292843 00000 n
+0000292882 00000 n
+0000292921 00000 n
trailer
<< /ID
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
- [(\241\3655\207R\273B\314\2276\253\347\311\271\004\)) (\241\3655\207R\273B\314\2276\253\347\311\271\004\))]
- /Info 78 0 R /Root 77 0 R /Size 139 >>
+ [(\246\331\010\202\265\001C\307O\247?\347\352\236\362\252) (\246\331\010\202\265\001C\307O\247?\347\352\236\362\252)]
+ /Info 79 0 R /Root 78 0 R /Size 140 >>
startxref
-286547
+292960
%%EOF
diff --git a/documentation.rst b/documentation.rst index 92a27d4..b373586 100644 --- a/documentation.rst +++ b/documentation.rst @@ -26,13 +26,15 @@ single code base both for Python 2.X and Python 3.X. This is a *huge* bonus, since I could remove over 2,000 lines of duplicated documentation/doctests. Having to maintain separate docs for Python 2 and Python 3 effectively stopped any development on the module for several -years. Moreover, it is now trivial to distribute the module as a wheel +years. Moreover, it is now trivial to distribute the module as a wheel_ since 2to3 is no more required. Since Python 2.5 has been released 9 years ago, I felt that it was reasonable to drop the support for it. If you need to support ancient versions of Python, stick with the decorator module version 3.4.2. This version supports all Python releases from 2.6 up to 3.5, which currently is still in beta status. +.. _wheel: http://pythonwheels.com/ + What's new --------------------- @@ -667,7 +669,7 @@ the names of the mandatory arguments) an attribute ``arg0``, ``arg1``, attribute, a string with the signature of the original function. Notice: you should not pass signature strings with default arguments, -i.e. something like 'f1(a, b=None)'. Just pass 'f1(a, b)' and then +i.e. something like ``'f1(a, b=None)'``. Just pass ``'f1(a, b)'`` and then a tuple of defaults: .. code-block:: python @@ -1100,7 +1102,33 @@ to discern that a ``Set`` is a ``Sized`` object, so the implementation for ``Set`` is taken and the result is 1, not 0. Still, the implementation in the decorator module is easy to undestand, once one declare that real ancestors take the precedence -over virtual ancestors. +over virtual ancestors and the problem can be solved anyway by +subclassing. As a matter of fact, if we define a subclass + +.. code-block:: python + + class SomeSet2(SomeSet, collections.Set): + def __contains__(self, a): + return True + + def __iter__(self): + yield 1 + + +which inherits from ``collections.Set``, we get as expected + +.. code-block:: python + + >>> get_length(SomeSet2()) + 1 + +consistently with the method resolution order, with ``Set`` having the +precedence with respect to ``Sized``: + +.. code-block:: python + + >>> [c.__name__ for c in SomeSet2.mro()] + ['SomeSet2', 'SomeSet', 'Set', 'Sized', 'Iterable', 'Container', 'object'] The functions implemented via ``functools.singledispatch`` are smarter when there are conflicting implementations and are diff --git a/src/tests/documentation.py b/src/tests/documentation.py index cdee30f..f4aa995 100644 --- a/src/tests/documentation.py +++ b/src/tests/documentation.py @@ -18,22 +18,25 @@ Introduction ----------------------------------------- The decorator module is over ten years old, but still alive and -kicking. It is used by several frameworks (IPython, scipy, -pyramid,...) and has been stable for a *long* time. It is your best -option if you want to preserve the signature of decorated functions in -a consistent way across Python releases. Version 4.0 is fully -compatible with the past, except for one thing: support for Python 2.4 -and 2.5 has been dropped. That decision made it possible to use a -single code base both for Python 2.X and Python 3.X. This is a *huge* -bonus, since I could remove over 2,000 lines of duplicated -documentation/doctests. Having to maintain separate docs for Python 2 and -Python 3 effectively stopped any development on the module for several -years. Moreover, it is now trivial to distribute the module as a wheel -since 2to3 is no more required. Since Python 2.5 has been released 9 -years ago, I felt that it was reasonable to drop the support for it. If you -need to support ancient versions of Python, stick with the decorator -module version 3.4.2. This version supports all Python releases from -2.6 up to 3.5, which currently is still in beta status. +kicking. It is used by several frameworks (IPython, scipy, authkit, +pylons, repoze, pycuda, sugar, ...) and has been stable for a *long* +time. It is your best option if you want to preserve the signature of +decorated functions in a consistent way across Python +releases. Version 4.0 is fully compatible with the past, except for +one thing: support for Python 2.4 and 2.5 has been dropped. That +decision made it possible to use a single code base both for Python +2.X and Python 3.X. This is a *huge* bonus, since I could remove over +2,000 lines of duplicated documentation/doctests. Having to maintain +separate docs for Python 2 and Python 3 effectively stopped any +development on the module for several years. Moreover, it is now +trivial to distribute the module as a wheel_ since 2to3 is no more +required. Since Python 2.5 has been released 9 years ago, I felt that +it was reasonable to drop the support for it. If you need to support +ancient versions of Python, stick with the decorator module version +3.4.2. This version supports all Python releases from 2.6 up to 3.5, +which currently is still in beta status. + +.. _wheel: http://pythonwheels.com/ What's new --------------------- @@ -41,11 +44,10 @@ What's new Since now there is a single manual for all Python versions, I took the occasion for overhauling the documentation. Therefore, even if you are an old time user, you may want to read the docs again, since several -examples have been improved. The packaging has been improved and now -I am also distributing the code in wheel format. The integration -with setuptools has been improved and now you can use -``python setup.py test`` to run the tests. -A new utility function ``decorate(func, +examples have been improved. The packaging has been improved and now I +am also distributing the code in wheel format. The integration with +setuptools has been improved and now you can use ``python setup.py +test`` to run the tests. A new utility function ``decorate(func, caller)`` has been added, doing the same job that in the past was done by ``decorator(caller, func)``. The old functionality is still there for compatibility sake, but it is deprecated and not documented @@ -54,14 +56,14 @@ anymore. Apart from that, there is a new experimental feature. The decorator module now includes an implementation of generic (multiple dispatch) functions. The API is designed to mimic the one of -`functools.singledispatch` but the implementation is much simpler and -more general; moreover all the decorators involved preserve the -signature of the decorated functions. For the moment the facility is -there mostly to exemplify the power of the module. In the future it -could change and/or be enhanced/optimized; on the other hand, it could -even become deprecated. Such is the fate of experimental features. In -any case it is very short and compact, so you can extract it for -your own use. Take it as food for thought. +`functools.singledispatch` but the implementation is much simpler; +moreover all the decorators involved preserve the signature of the +decorated functions. For the moment the facility is there mostly to +exemplify the power of the module. In the future it could change +and/or be enhanced/optimized; on the other hand, it could even become +deprecated. Such is the fate of experimental features. In any case it +is very short and compact, so you can extract it for your own +use. Take it as food for thought. Usefulness of decorators ------------------------------------------------ @@ -536,7 +538,7 @@ the names of the mandatory arguments) an attribute ``arg0``, ``arg1``, attribute, a string with the signature of the original function. Notice: you should not pass signature strings with default arguments, -i.e. something like 'f1(a, b=None)'. Just pass 'f1(a, b)' and then +i.e. something like ``'f1(a, b=None)'``. Just pass ``'f1(a, b)'`` and then a tuple of defaults: .. code-block:: python @@ -828,7 +830,25 @@ to discern that a ``Set`` is a ``Sized`` object, so the implementation for ``Set`` is taken and the result is 1, not 0. Still, the implementation in the decorator module is easy to undestand, once one declare that real ancestors take the precedence -over virtual ancestors. +over virtual ancestors and the problem can be solved anyway by +subclassing. As a matter of fact, if we define a subclass + +$$SomeSet2 + +which inherits from ``collections.Set``, we get as expected + +.. code-block:: python + + >>> get_length(SomeSet2()) + 1 + +consistently with the method resolution order, with ``Set`` having the +precedence with respect to ``Sized``: + +.. code-block:: python + + >>> [c.__name__ for c in SomeSet2.mro()] + ['SomeSet2', 'SomeSet', 'Set', 'Sized', 'Iterable', 'Container', 'object'] The functions implemented via ``functools.singledispatch`` are smarter when there are conflicting implementations and are @@ -932,7 +952,7 @@ would require to change the CPython implementation of functions and add an hook to make it possible to change their signature directly. That could happen in future versions of Python (see PEP 362_) and then the decorator module would become obsolete. However, at present, -even in Python 3.4 it is impossible to change the function signature +even in Python 3.5 it is impossible to change the function signature directly, therefore the ``decorator`` module is still useful. Actually, this is the main reasons why I keep maintaining the module and releasing new versions. @@ -985,7 +1005,6 @@ a (shallow) copy of the original function dictionary: 'something else' .. _function annotations: http://www.python.org/dev/peps/pep-3107/ -.. _distribute: http://packages.python.org/distribute/ .. _docutils: http://docutils.sourceforge.net/ .. _pygments: http://pygments.org/ @@ -1453,3 +1472,11 @@ def get_length(obj): @get_length.register(collections.Sized) def get_length_sized(obj): return len(obj) + + +class SomeSet2(SomeSet, collections.Set): + def __contains__(self, a): + return True + + def __iter__(self): + yield 1 |
