From d7d4bac90419a049165da9f29e2b8fef18fa7f33 Mon Sep 17 00:00:00 2001 From: Michele Simionato Date: Mon, 16 Mar 2015 12:19:26 +0100 Subject: Rebuilt the docs --- documentation.pdf | 6646 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 4640 insertions(+), 2006 deletions(-) (limited to 'documentation.pdf') diff --git a/documentation.pdf b/documentation.pdf index 611972e..66bf009 100644 --- a/documentation.pdf +++ b/documentation.pdf @@ -1,1367 +1,285 @@ %PDF-1.4 -%���� ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary +%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com 1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 7 0 R - /F5 39 0 R - /F6 41 0 R >> -endobj -% 'F1': class PDFType1Font +<< /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 7 0 R /F5 44 0 R /F6 46 0 R >> +endobj 2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> +endobj 3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font +<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> +endobj 4 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class PDFDictionary +<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> +endobj 5 0 obj -<< /A << /S /URI - /Type /Action - /URI (mailto:michele.simionato@gmail.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 153.7323 - 704.7736 - 289.4623 - 716.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER2': class PDFDictionary +<< /A << /S /URI /Type /Action /URI (mailto:michele.simionato@gmail.com) >> /Border [ 0 0 0 ] /Rect [ 153.7323 704.7736 289.4623 716.7736 ] /Subtype /Link /Type /Annot >> +endobj 6 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://pypi.python.org/pypi/decorator/3.4.0) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 153.7323 - 659.7736 - 526.5827 - 671.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'F4': class PDFType1Font +<< /A << /S /URI /Type /Action /URI (http://pypi.python.org/pypi/decorator/3.4.1) >> /Border [ 0 0 0 ] /Rect [ 153.7323 659.7736 526.5827 671.7736 ] /Subtype /Link /Type /Annot >> +endobj 7 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER3': class LinkAnnotation +<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> +endobj 8 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 38 0 R - /XYZ - 62.69291 - 293.0236 - 0 ] - /Rect [ 62.69291 - 560.7736 - 121.0229 - 572.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER4': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 43 0 R /XYZ 62.69291 293.0236 0 ] /Rect [ 62.69291 560.7736 121.0229 572.7736 ] /Subtype /Link /Type /Annot >> +endobj 9 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 38 0 R - /XYZ - 62.69291 - 293.0236 - 0 ] - /Rect [ 527.0227 - 560.7736 - 532.5827 - 572.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER5': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 43 0 R /XYZ 62.69291 293.0236 0 ] /Rect [ 527.0227 560.7736 532.5827 572.7736 ] /Subtype /Link /Type /Annot >> +endobj 10 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 43 0 R - /XYZ - 62.69291 - 675.0236 - 0 ] - /Rect [ 62.69291 - 542.7736 - 114.3629 - 554.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER6': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 48 0 R /XYZ 62.69291 675.0236 0 ] /Rect [ 62.69291 542.7736 114.3629 554.7736 ] /Subtype /Link /Type /Annot >> +endobj 11 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 43 0 R - /XYZ - 62.69291 - 675.0236 - 0 ] - /Rect [ 527.0227 - 542.7736 - 532.5827 - 554.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER7': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 48 0 R /XYZ 62.69291 675.0236 0 ] /Rect [ 527.0227 542.7736 532.5827 554.7736 ] /Subtype /Link /Type /Annot >> +endobj 12 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 43 0 R - /XYZ - 62.69291 - 438.0236 - 0 ] - /Rect [ 62.69291 - 524.7736 - 183.2629 - 536.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER8': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 48 0 R /XYZ 62.69291 438.0236 0 ] /Rect [ 62.69291 524.7736 183.2629 536.7736 ] /Subtype /Link /Type /Annot >> +endobj 13 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 43 0 R - /XYZ - 62.69291 - 438.0236 - 0 ] - /Rect [ 527.0227 - 524.7736 - 532.5827 - 536.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER9': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 48 0 R /XYZ 62.69291 438.0236 0 ] /Rect [ 527.0227 524.7736 532.5827 536.7736 ] /Subtype /Link /Type /Annot >> +endobj 14 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 44 0 R - /XYZ - 62.69291 - 427.4236 - 0 ] - /Rect [ 62.69291 - 506.7736 - 122.1429 - 518.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER10': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 49 0 R /XYZ 62.69291 427.4236 0 ] /Rect [ 62.69291 506.7736 122.1429 518.7736 ] /Subtype /Link /Type /Annot >> +endobj 15 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 44 0 R - /XYZ - 62.69291 - 427.4236 - 0 ] - /Rect [ 527.0227 - 506.7736 - 532.5827 - 518.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER11': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 49 0 R /XYZ 62.69291 427.4236 0 ] /Rect [ 527.0227 506.7736 532.5827 518.7736 ] /Subtype /Link /Type /Annot >> +endobj 16 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 45 0 R - /XYZ - 62.69291 - 435.4236 - 0 ] - /Rect [ 62.69291 - 488.7736 - 154.8129 - 500.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER12': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 50 0 R /XYZ 62.69291 435.4236 0 ] /Rect [ 62.69291 488.7736 72.69291 500.7736 ] /Subtype /Link /Type /Annot >> +endobj 17 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 45 0 R - /XYZ - 62.69291 - 435.4236 - 0 ] - /Rect [ 527.0227 - 488.7736 - 532.5827 - 500.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER13': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 50 0 R /XYZ 62.69291 435.4236 0 ] /Rect [ 72.69291 488.7736 108.6929 500.7736 ] /Subtype /Link /Type /Annot >> +endobj 18 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 46 0 R - /XYZ - 62.69291 - 398.778 - 0 ] - /Rect [ 62.69291 - 470.7736 - 188.2729 - 482.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER14': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 50 0 R /XYZ 62.69291 435.4236 0 ] /Rect [ 108.6929 488.7736 154.8129 500.7736 ] /Subtype /Link /Type /Annot >> +endobj 19 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 46 0 R - /XYZ - 62.69291 - 398.778 - 0 ] - /Rect [ 527.0227 - 470.7736 - 532.5827 - 482.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER15': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 50 0 R /XYZ 62.69291 435.4236 0 ] /Rect [ 527.0227 488.7736 532.5827 500.7736 ] /Subtype /Link /Type /Annot >> +endobj 20 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 47 0 R - /XYZ - 62.69291 - 647.8236 - 0 ] - /Rect [ 62.69291 - 452.7736 - 110.6929 - 464.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER16': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 397.4236 0 ] /Rect [ 62.69291 470.7736 122.6929 482.7736 ] /Subtype /Link /Type /Annot >> +endobj 21 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 47 0 R - /XYZ - 62.69291 - 647.8236 - 0 ] - /Rect [ 527.0227 - 452.7736 - 532.5827 - 464.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER17': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 397.4236 0 ] /Rect [ 122.6929 470.7736 188.2729 482.7736 ] /Subtype /Link /Type /Annot >> +endobj 22 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 48 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Rect [ 62.69291 - 434.7736 - 92.69291 - 446.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER18': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 51 0 R /XYZ 62.69291 397.4236 0 ] /Rect [ 527.0227 470.7736 532.5827 482.7736 ] /Subtype /Link /Type /Annot >> +endobj 23 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 48 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Rect [ 527.0227 - 434.7736 - 532.5827 - 446.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER19': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 62.69291 452.7736 110.6929 464.7736 ] /Subtype /Link /Type /Annot >> +endobj 24 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 49 0 R - /XYZ - 62.69291 - 267.4236 - 0 ] - /Rect [ 62.69291 - 416.7736 - 139.9329 - 428.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER20': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 52 0 R /XYZ 62.69291 647.8236 0 ] /Rect [ 527.0227 452.7736 532.5827 464.7736 ] /Subtype /Link /Type /Annot >> +endobj 25 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 49 0 R - /XYZ - 62.69291 - 267.4236 - 0 ] - /Rect [ 527.0227 - 416.7736 - 532.5827 - 428.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER21': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 53 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 62.69291 434.7736 92.69291 446.7736 ] /Subtype /Link /Type /Annot >> +endobj 26 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 50 0 R - /XYZ - 62.69291 - 354.6236 - 0 ] - /Rect [ 62.69291 - 398.7736 - 192.2729 - 410.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER22': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 53 0 R /XYZ 62.69291 765.0236 0 ] /Rect [ 527.0227 434.7736 532.5827 446.7736 ] /Subtype /Link /Type /Annot >> +endobj 27 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 50 0 R - /XYZ - 62.69291 - 354.6236 - 0 ] - /Rect [ 527.0227 - 398.7736 - 532.5827 - 410.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER23': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /XYZ 62.69291 255.4236 0 ] /Rect [ 62.69291 416.7736 139.9329 428.7736 ] /Subtype /Link /Type /Annot >> +endobj 28 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 51 0 R - /XYZ - 62.69291 - 363.8236 - 0 ] - /Rect [ 62.69291 - 380.7736 - 177.1629 - 392.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER24': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 54 0 R /XYZ 62.69291 255.4236 0 ] /Rect [ 527.0227 416.7736 532.5827 428.7736 ] /Subtype /Link /Type /Annot >> +endobj 29 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 51 0 R - /XYZ - 62.69291 - 363.8236 - 0 ] - /Rect [ 521.4627 - 380.7736 - 532.5827 - 392.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER25': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 55 0 R /XYZ 62.69291 324.6236 0 ] /Rect [ 62.69291 398.7736 83.25291 410.7736 ] /Subtype /Link /Type /Annot >> +endobj 30 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 54 0 R - /XYZ - 62.69291 - 599.8236 - 0 ] - /Rect [ 62.69291 - 362.7736 - 228.2829 - 374.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER26': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 55 0 R /XYZ 62.69291 324.6236 0 ] /Rect [ 83.25291 398.7736 167.2529 410.7736 ] /Subtype /Link /Type /Annot >> +endobj 31 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 54 0 R - /XYZ - 62.69291 - 599.8236 - 0 ] - /Rect [ 521.4627 - 362.7736 - 532.5827 - 374.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER27': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 55 0 R /XYZ 62.69291 324.6236 0 ] /Rect [ 167.2529 398.7736 192.2729 410.7736 ] /Subtype /Link /Type /Annot >> +endobj 32 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 55 0 R - /XYZ - 62.69291 - 215.0236 - 0 ] - /Rect [ 62.69291 - 344.7736 - 174.3929 - 356.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER28': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 55 0 R /XYZ 62.69291 324.6236 0 ] /Rect [ 527.0227 398.7736 532.5827 410.7736 ] /Subtype /Link /Type /Annot >> +endobj 33 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 55 0 R - /XYZ - 62.69291 - 215.0236 - 0 ] - /Rect [ 521.4627 - 344.7736 - 532.5827 - 356.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER29': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 333.8236 0 ] /Rect [ 62.69291 380.7736 177.1629 392.7736 ] /Subtype /Link /Type /Annot >> +endobj 34 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 65 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Rect [ 62.69291 - 326.7736 - 155.4829 - 338.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER30': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 56 0 R /XYZ 62.69291 333.8236 0 ] /Rect [ 521.4627 380.7736 532.5827 392.7736 ] /Subtype /Link /Type /Annot >> +endobj 35 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 65 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Rect [ 521.4627 - 326.7736 - 532.5827 - 338.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER31': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 62.69291 362.7736 228.2829 374.7736 ] /Subtype /Link /Type /Annot >> +endobj 36 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 65 0 R - /XYZ - 62.69291 - 414.0236 - 0 ] - /Rect [ 62.69291 - 308.7736 - 106.5829 - 320.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER32': class LinkAnnotation +<< /Border [ 0 0 0 ] /Contents () /Dest [ 59 0 R /XYZ 62.69291 542.6236 0 ] /Rect [ 521.4627 362.7736 532.5827 374.7736 ] /Subtype /Link /Type /Annot >> +endobj 37 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 65 0 R - /XYZ - 62.69291 - 414.0236 - 0 ] - /Rect [ 521.4627 - 308.7736 - 532.5827 - 320.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page1': class PDFPage +<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 131.0236 0 ] /Rect [ 62.69291 344.7736 174.3929 356.7736 ] /Subtype /Link /Type /Annot >> +endobj 38 0 obj -% Page dictionary -<< /Annots [ 5 0 R - 6 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 ] - /Contents 85 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F5': class PDFType1Font +<< /Border [ 0 0 0 ] /Contents () /Dest [ 60 0 R /XYZ 62.69291 131.0236 0 ] /Rect [ 521.4627 344.7736 532.5827 356.7736 ] /Subtype /Link /Type /Annot >> +endobj 39 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER33': class PDFDictionary +<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 667.8236 0 ] /Rect [ 62.69291 326.7736 155.4829 338.7736 ] /Subtype /Link /Type /Annot >> +endobj 40 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.python.org/moin/PythonDecoratorLibrary) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 219.6428 - 363.7736 - 449.1728 - 375.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'F6': class PDFType1Font +<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 667.8236 0 ] /Rect [ 521.4627 326.7736 532.5827 338.7736 ] /Subtype /Link /Type /Annot >> +endobj 41 0 obj -% Font Courier-Oblique -<< /BaseFont /Courier-Oblique - /Encoding /WinAnsiEncoding - /Name /F6 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER34': class PDFDictionary +<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 514.8236 0 ] /Rect [ 62.69291 308.7736 106.5829 320.7736 ] /Subtype /Link /Type /Annot >> +endobj 42 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.python.org/doc/2.5.2/lib/module-functools.html) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 151.0486 - 130.5736 - 270.69 - 142.5736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page2': class PDFPage +<< /Border [ 0 0 0 ] /Contents () /Dest [ 65 0 R /XYZ 62.69291 514.8236 0 ] /Rect [ 521.4627 308.7736 532.5827 320.7736 ] /Subtype /Link /Type /Annot >> +endobj 43 0 obj -% Page dictionary -<< /Annots [ 40 0 R - 42 0 R ] - /Contents 86 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage +<< /Annots [ 5 0 R 6 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 ] /Contents 85 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 + /Trans << >> /Type /Page >> +endobj 44 0 obj -% Page dictionary -<< /Contents 87 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage +<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font >> +endobj 45 0 obj -% Page dictionary -<< /Contents 88 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage +<< /A << /S /URI /Type /Action /URI (http://www.python.org/moin/PythonDecoratorLibrary) >> /Border [ 0 0 0 ] /Rect [ 219.6428 363.7736 449.1728 375.7736 ] /Subtype /Link /Type /Annot >> +endobj 46 0 obj -% Page dictionary -<< /Contents 89 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage +<< /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font >> +endobj 47 0 obj -% Page dictionary -<< /Contents 90 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage +<< /A << /S /URI /Type /Action /URI (https://docs.python.org/2/library/functools.html#functools.update_wrapper) >> /Border [ 0 0 0 ] /Rect [ 151.0486 118.5736 270.69 130.5736 ] /Subtype /Link /Type /Annot >> +endobj 48 0 obj -% Page dictionary -<< /Contents 91 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page8': class PDFPage +<< /Annots [ 45 0 R 47 0 R ] /Contents 86 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 + /Trans << >> /Type /Page >> +endobj 49 0 obj -% Page dictionary -<< /Contents 92 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page9': class PDFPage +<< /Contents 87 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 50 0 obj -% Page dictionary -<< /Contents 93 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page10': class PDFPage +<< /Contents 88 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 51 0 obj -% Page dictionary -<< /Contents 94 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER35': class PDFDictionary +<< /Contents 89 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 52 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://bugs.python.org/issue1764286) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 137.6966 - 753.7736 - 180.8679 - 765.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER36': class PDFDictionary +<< /Contents 90 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 53 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 62.69291 - 280.3736 - 363.4029 - 292.3736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page11': class PDFPage +<< /Contents 91 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 54 0 obj -% Page dictionary -<< /Annots [ 52 0 R - 53 0 R ] - /Contents 95 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page12': class PDFPage +<< /Contents 92 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 55 0 obj -% Page dictionary -<< /Contents 96 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER37': class PDFDictionary +<< /Contents 93 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 56 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.python.org/dev/peps/pep-0362) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 301.1597 - 116.9736 - 317.8397 - 128.9736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page13': class PDFPage +<< /Contents 94 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 57 0 obj -% Page dictionary -<< /Annots [ 56 0 R ] - /Contents 97 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page14': class PDFPage +<< /A << /S /URI /Type /Action /URI (http://bugs.python.org/issue1764286) >> /Border [ 0 0 0 ] /Rect [ 137.6966 708.5736 180.8679 720.5736 ] /Subtype /Link /Type /Annot >> +endobj 58 0 obj -% Page dictionary -<< /Contents 98 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER38': class PDFDictionary +<< /A << /S /URI /Type /Action /URI (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) >> /Border [ 0 0 0 ] /Rect [ 62.69291 223.1736 363.4029 235.1736 ] /Subtype /Link /Type /Annot >> +endobj 59 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.python.org/dev/peps/pep-3107/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 497.5627 - 726.7736 - 531.1777 - 738.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER39': class PDFDictionary +<< /Annots [ 57 0 R 58 0 R ] /Contents 95 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 + /Trans << >> /Type /Page >> +endobj 60 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.python.org/dev/peps/pep-3107/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 62.69291 - 714.7736 - 114.3929 - 726.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER40': class PDFDictionary +<< /Contents 96 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 61 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://packages.python.org/distribute/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 172.9507 - 702.7736 - 216.6742 - 714.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER41': class PDFDictionary +<< /Contents 97 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> + /Type /Page >> +endobj 62 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://docutils.sourceforge.net/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 82.15291 - 678.7736 - 118.8329 - 690.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER42': class PDFDictionary +<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-0362) >> /Border [ 0 0 0 ] /Rect [ 301.1597 729.7736 317.8397 741.7736 ] /Subtype /Link /Type /Annot >> +endobj 63 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://pygments.org/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 138.2929 - 678.7736 - 184.4229 - 690.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER43': class PDFDictionary +<< /Annots [ 62 0 R ] /Contents 98 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 + /Trans << >> /Type /Page >> +endobj 64 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.phyast.pitt.edu/~micheles/python/documentation.html#class-decorators-and-decorator-factories) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 364.2921 - 540.7736 - 531.64 - 552.7736 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page15': class PDFPage +<< /A << /S /URI /Type /Action /URI (http://www.python.org/dev/peps/pep-3107/) >> /Border [ 0 0 0 ] /Rect [ 281.1568 629.5736 372.4888 641.5736 ] /Subtype /Link /Type /Annot >> +endobj 65 0 obj -% Page dictionary -<< /Annots [ 59 0 R - 60 0 R - 61 0 R - 62 0 R - 63 0 R - 64 0 R ] - /Contents 99 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 84 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R66': class PDFCatalog +<< /Annots [ 64 0 R ] /Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 84 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 + /Trans << >> /Type /Page >> +endobj 66 0 obj -% Document Root -<< /Outlines 68 0 R - /PageLabels 100 0 R - /PageMode /UseNone - /Pages 84 0 R - /Type /Catalog >> -endobj -% 'R67': class PDFInfo +<< /Outlines 68 0 R /PageLabels 100 0 R /PageMode /UseNone /Pages 84 0 R /Type /Catalog >> +endobj 67 0 obj -<< /Author (Michele Simionato) - /CreationDate (D:20121018102559-01'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (The decorator module) >> -endobj -% 'R68': class PDFOutlines +<< /Author (Michele Simionato) /CreationDate (D:20150316121851-01'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) + /Title (The decorator module) >> +endobj 68 0 obj -<< /Count 15 - /First 69 0 R - /Last 83 0 R - /Type /Outlines >> +<< /Count 15 /First 69 0 R /Last 83 0 R /Type /Outlines >> endobj -% 'Outline.0': class OutlineEntryObject 69 0 obj -<< /Dest [ 38 0 R - /XYZ - 62.69291 - 293.0236 - 0 ] - /Next 70 0 R - /Parent 68 0 R - /Title (Introduction) >> -endobj -% 'Outline.1': class OutlineEntryObject +<< /Dest [ 43 0 R /XYZ 62.69291 293.0236 0 ] /Next 70 0 R /Parent 68 0 R /Title (Introduction) >> +endobj 70 0 obj -<< /Dest [ 43 0 R - /XYZ - 62.69291 - 675.0236 - 0 ] - /Next 71 0 R - /Parent 68 0 R - /Prev 69 0 R - /Title (Definitions) >> -endobj -% 'Outline.2': class OutlineEntryObject +<< /Dest [ 48 0 R /XYZ 62.69291 675.0236 0 ] /Next 71 0 R /Parent 68 0 R /Prev 69 0 R /Title (Definitions) >> +endobj 71 0 obj -<< /Dest [ 43 0 R - /XYZ - 62.69291 - 438.0236 - 0 ] - /Next 72 0 R - /Parent 68 0 R - /Prev 70 0 R - /Title (Statement of the problem) >> -endobj -% 'Outline.3': class OutlineEntryObject +<< /Dest [ 48 0 R /XYZ 62.69291 438.0236 0 ] /Next 72 0 R /Parent 68 0 R /Prev 70 0 R /Title (Statement of the problem) >> +endobj 72 0 obj -<< /Dest [ 44 0 R - /XYZ - 62.69291 - 427.4236 - 0 ] - /Next 73 0 R - /Parent 68 0 R - /Prev 71 0 R - /Title (The solution) >> -endobj -% 'Outline.4': class OutlineEntryObject +<< /Dest [ 49 0 R /XYZ 62.69291 427.4236 0 ] /Next 73 0 R /Parent 68 0 R /Prev 71 0 R /Title (The solution) >> +endobj 73 0 obj -<< /Dest [ 45 0 R - /XYZ - 62.69291 - 435.4236 - 0 ] - /Next 74 0 R - /Parent 68 0 R - /Prev 72 0 R - /Title (A trace decorator) >> -endobj -% 'Outline.5': class OutlineEntryObject +<< /Dest [ 50 0 R /XYZ 62.69291 435.4236 0 ] /Next 74 0 R /Parent 68 0 R /Prev 72 0 R /Title (A trace decorator) >> +endobj 74 0 obj -<< /Dest [ 46 0 R - /XYZ - 62.69291 - 398.778 - 0 ] - /Next 75 0 R - /Parent 68 0 R - /Prev 73 0 R - /Title (decorator is a decorator) >> -endobj -% 'Outline.6': class OutlineEntryObject +<< /Dest [ 51 0 R /XYZ 62.69291 397.4236 0 ] /Next 75 0 R /Parent 68 0 R /Prev 73 0 R /Title (decorator is a decorator) >> +endobj 75 0 obj -<< /Dest [ 47 0 R - /XYZ - 62.69291 - 647.8236 - 0 ] - /Next 76 0 R - /Parent 68 0 R - /Prev 74 0 R - /Title (blocking) >> -endobj -% 'Outline.7': class OutlineEntryObject +<< /Dest [ 52 0 R /XYZ 62.69291 647.8236 0 ] /Next 76 0 R /Parent 68 0 R /Prev 74 0 R /Title (blocking) >> +endobj 76 0 obj -<< /Dest [ 48 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Next 77 0 R - /Parent 68 0 R - /Prev 75 0 R - /Title (async) >> -endobj -% 'Outline.8': class OutlineEntryObject +<< /Dest [ 53 0 R /XYZ 62.69291 765.0236 0 ] /Next 77 0 R /Parent 68 0 R /Prev 75 0 R /Title (async) >> +endobj 77 0 obj -<< /Dest [ 49 0 R - /XYZ - 62.69291 - 267.4236 - 0 ] - /Next 78 0 R - /Parent 68 0 R - /Prev 76 0 R - /Title (contextmanager) >> -endobj -% 'Outline.9': class OutlineEntryObject +<< /Dest [ 54 0 R /XYZ 62.69291 255.4236 0 ] /Next 78 0 R /Parent 68 0 R /Prev 76 0 R /Title (contextmanager) >> +endobj 78 0 obj -<< /Dest [ 50 0 R - /XYZ - 62.69291 - 354.6236 - 0 ] - /Next 79 0 R - /Parent 68 0 R - /Prev 77 0 R - /Title (The FunctionMaker class) >> -endobj -% 'Outline.10': class OutlineEntryObject +<< /Dest [ 55 0 R /XYZ 62.69291 324.6236 0 ] /Next 79 0 R /Parent 68 0 R /Prev 77 0 R /Title (The FunctionMaker class) >> +endobj 79 0 obj -<< /Dest [ 51 0 R - /XYZ - 62.69291 - 363.8236 - 0 ] - /Next 80 0 R - /Parent 68 0 R - /Prev 78 0 R - /Title (Getting the source code) >> -endobj -% 'Outline.11': class OutlineEntryObject +<< /Dest [ 56 0 R /XYZ 62.69291 333.8236 0 ] /Next 80 0 R /Parent 68 0 R /Prev 78 0 R /Title (Getting the source code) >> +endobj 80 0 obj -<< /Dest [ 54 0 R - /XYZ - 62.69291 - 599.8236 - 0 ] - /Next 81 0 R - /Parent 68 0 R - /Prev 79 0 R - /Title (Dealing with third party decorators) >> -endobj -% 'Outline.12': class OutlineEntryObject +<< /Dest [ 59 0 R /XYZ 62.69291 542.6236 0 ] /Next 81 0 R /Parent 68 0 R /Prev 79 0 R /Title (Dealing with third party decorators) >> +endobj 81 0 obj -<< /Dest [ 55 0 R - /XYZ - 62.69291 - 215.0236 - 0 ] - /Next 82 0 R - /Parent 68 0 R - /Prev 80 0 R - /Title (Caveats and limitations) >> -endobj -% 'Outline.13': class OutlineEntryObject +<< /Dest [ 60 0 R /XYZ 62.69291 131.0236 0 ] /Next 82 0 R /Parent 68 0 R /Prev 80 0 R /Title (Caveats and limitations) >> +endobj 82 0 obj -<< /Dest [ 65 0 R - /XYZ - 62.69291 - 765.0236 - 0 ] - /Next 83 0 R - /Parent 68 0 R - /Prev 81 0 R - /Title (Compatibility notes) >> -endobj -% 'Outline.14': class OutlineEntryObject +<< /Dest [ 65 0 R /XYZ 62.69291 667.8236 0 ] /Next 83 0 R /Parent 68 0 R /Prev 81 0 R /Title (Compatibility notes) >> +endobj 83 0 obj -<< /Dest [ 65 0 R - /XYZ - 62.69291 - 414.0236 - 0 ] - /Parent 68 0 R - /Prev 82 0 R - /Title (LICENCE) >> -endobj -% 'R84': class PDFPages +<< /Dest [ 65 0 R /XYZ 62.69291 514.8236 0 ] /Parent 68 0 R /Prev 82 0 R /Title (LICENCE) >> +endobj 84 0 obj -% page tree -<< /Count 15 - /Kids [ 38 0 R - 43 0 R - 44 0 R - 45 0 R - 46 0 R - 47 0 R - 48 0 R - 49 0 R - 50 0 R - 51 0 R - 54 0 R - 55 0 R - 57 0 R - 58 0 R - 65 0 R ] - /Type /Pages >> -endobj -% 'R85': class PDFStream +<< /Count 15 /Kids [ 43 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R + 59 0 R 60 0 R 61 0 R 63 0 R 65 0 R ] /Type /Pages >> +endobj 85 0 obj -% page stream -<< /Length 9046 >> +<< /Length 9109 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q 1 0 0 1 62.69291 741.0236 cm q -BT 1 0 0 1 0 4 Tm 118.8249 0 Td 24 TL /F2 20 Tf 0 0 0 rg (The ) Tj /F3 20 Tf (decorator ) Tj /F2 20 Tf (module) Tj T* -118.8249 0 Td ET +BT 1 0 0 1 0 4 Tm 118.8249 0 Td 24 TL /F2 20 Tf 0 0 0 rg (The ) Tj /F3 20 Tf 0 0 0 rg (decorator ) Tj /F2 20 Tf 0 0 0 rg (module) Tj T* -118.8249 0 Td ET Q Q q @@ -1420,7 +338,7 @@ q 1 0 0 1 91.03937 3 cm q 0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (3.4.0 \(2012-10-18\)) Tj T* ET +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (3.4.1 \(2015-03-16\)) Tj T* ET Q Q q @@ -1463,7 +381,7 @@ q q 0 0 .501961 rg 0 0 .501961 RG -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (http://pypi.python.org/pypi/decorator/3.4.0) Tj T* ET +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (http://pypi.python.org/pypi/decorator/3.4.1) Tj T* ET Q Q q @@ -1579,7 +497,7 @@ Q q 1 0 0 1 0 183 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (A ) Tj /F3 10 Tf (trace ) Tj /F2 10 Tf (decorator) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (A ) Tj /F3 10 Tf 0 0 0 rg (trace ) Tj /F2 10 Tf 0 0 .501961 rg (decorator) Tj T* ET Q Q q @@ -1593,7 +511,7 @@ Q q 1 0 0 1 0 165 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (decorator ) Tj /F2 10 Tf (is a decorator) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (decorator ) Tj /F2 10 Tf 0 0 .501961 rg (is a decorator) Tj T* ET Q Q q @@ -1607,7 +525,7 @@ Q q 1 0 0 1 0 147 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (blocking) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (blocking) Tj T* ET Q Q q @@ -1621,7 +539,7 @@ Q q 1 0 0 1 0 129 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 .501961 rg (async) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (async) Tj T* ET Q Q q @@ -1649,7 +567,7 @@ Q q 1 0 0 1 0 93 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (The ) Tj /F3 10 Tf (FunctionMaker ) Tj /F2 10 Tf (class) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf 0 0 .501961 rg (The ) Tj /F3 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F2 10 Tf 0 0 .501961 rg (class) Tj T* ET Q Q q @@ -1858,22 +776,20 @@ Q endstream endobj -% 'R86': class PDFStream 86 0 obj -% page stream -<< /Length 7546 >> +<< /Length 12549 >> 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 q -BT 1 0 0 1 0 38 Tm 1.093735 Tw 12 TL /F1 10 Tf 0 0 0 rg (The aim of the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module it to simplify the usage of decorators for the average programmer,) Tj T* 0 Tw 2.456136 Tw (and to popularize decorators by showing various non-trivial examples. Of course, as all techniques,) Tj T* 0 Tw 2.234987 Tw (decorators can be abused \(I have seen that\) and you should not try to solve every problem with a) Tj T* 0 Tw (decorator, just because you can.) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.093735 Tw 12 TL /F1 10 Tf 0 0 0 rg (The aim of the ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module it to simplify the usage of decorators for the average programmer,) Tj T* 0 Tw 2.456136 Tw (and to popularize decorators by showing various non-trivial examples. Of course, as all techniques,) Tj T* 0 Tw 2.234987 Tw (decorators can be abused \(I have seen that\) and you should not try to solve every problem with a) Tj T* 0 Tw (decorator, just because you can.) Tj T* ET Q Q q 1 0 0 1 62.69291 687.0236 cm q -BT 1 0 0 1 0 14 Tm .13561 Tw 12 TL /F1 10 Tf 0 0 0 rg (You may find the source code for all the examples discussed here in the ) Tj /F4 10 Tf (documentation.py ) Tj /F1 10 Tf (file, which) Tj T* 0 Tw (contains this documentation in the form of doctests.) Tj T* ET +BT 1 0 0 1 0 14 Tm .13561 Tw 12 TL /F1 10 Tf 0 0 0 rg (You may find the source code for all the examples discussed here in the ) Tj /F4 10 Tf 0 0 0 rg (documentation.py ) Tj /F1 10 Tf 0 0 0 rg (file, which) Tj T* 0 Tw (contains this documentation in the form of doctests.) Tj T* ET Q Q q @@ -1944,7 +860,7 @@ Q q 1 0 0 1 62.69291 510.0236 cm q -BT 1 0 0 1 0 26 Tm 2.832706 Tw 12 TL /F1 10 Tf 0 0 0 rg (Signature-changing decorators have their use: for instance the builtin classes ) Tj /F4 10 Tf (staticmethod ) Tj /F1 10 Tf (and) Tj T* 0 Tw 1.506651 Tw /F4 10 Tf (classmethod ) Tj /F1 10 Tf (are in this group, since they take functions and return descriptor objects which are not) Tj T* 0 Tw (functions, nor callables.) Tj T* ET +BT 1 0 0 1 0 26 Tm 2.832706 Tw 12 TL /F1 10 Tf 0 0 0 rg (Signature-changing decorators have their use: for instance the builtin classes ) Tj /F4 10 Tf 0 0 0 rg (staticmethod ) Tj /F1 10 Tf 0 0 0 rg (and) Tj T* 0 Tw 1.506651 Tw /F4 10 Tf 0 0 0 rg (classmethod ) Tj /F1 10 Tf 0 0 0 rg (are in this group, since they take functions and return descriptor objects which are not) Tj T* 0 Tw (functions, nor callables.) Tj T* ET Q Q q @@ -1970,11 +886,11 @@ Q q 1 0 0 1 62.69291 339.0236 cm q -BT 1 0 0 1 0 62 Tm .351235 Tw 12 TL /F1 10 Tf 0 0 0 rg (A very common use case for decorators is the memoization of functions. A ) Tj /F4 10 Tf (memoize ) Tj /F1 10 Tf (decorator works by) Tj T* 0 Tw .871988 Tw (caching the result of the function call in a dictionary, so that the next time the function is called with the) Tj T* 0 Tw 2.350651 Tw (same input parameters the result is retrieved from the cache and not recomputed. There are many) Tj T* 0 Tw 2.92247 Tw (implementations of ) Tj /F4 10 Tf (memoize ) Tj /F1 10 Tf (in ) Tj 0 0 .501961 rg (http://www.python.org/moin/PythonDecoratorLibrary) Tj 0 0 0 rg (, but they do not) Tj T* 0 Tw 2.683984 Tw (preserve the signature. A simple implementation could be the following \(notice that in general it is) Tj T* 0 Tw (impossible to memoize correctly something that depends on non-hashable arguments\):) Tj T* ET +BT 1 0 0 1 0 62 Tm .351235 Tw 12 TL /F1 10 Tf 0 0 0 rg (A very common use case for decorators is the memoization of functions. A ) Tj /F4 10 Tf 0 0 0 rg (memoize ) Tj /F1 10 Tf 0 0 0 rg (decorator works by) Tj T* 0 Tw .871988 Tw (caching the result of the function call in a dictionary, so that the next time the function is called with the) Tj T* 0 Tw 2.350651 Tw (same input parameters the result is retrieved from the cache and not recomputed. There are many) Tj T* 0 Tw 2.92247 Tw (implementations of ) Tj /F4 10 Tf 0 0 0 rg (memoize ) Tj /F1 10 Tf 0 0 0 rg (in ) Tj 0 0 .501961 rg (http://www.python.org/moin/PythonDecoratorLibrary) Tj 0 0 0 rg (, but they do not) Tj T* 0 Tw 2.683984 Tw (preserve the signature. A simple implementation could be the following \(notice that in general it is) Tj T* 0 Tw (impossible to memoize correctly something that depends on non-hashable arguments\):) Tj T* ET Q Q q -1 0 0 1 62.69291 149.8236 cm +1 0 0 1 62.69291 137.8236 cm q q 1 0 0 1 0 0 cm @@ -1984,34 +900,194 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 180 re B* +n -6 -6 468.6898 192 re B* Q q -BT 1 0 0 1 0 158 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize_uw) Tj 0 0 0 rg (\() Tj (func) Tj (\):) Tj T* ( ) Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj ({}) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (kw) Tj (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# frozenset is used to ensure hashability) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj (key) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (args) Tj (,) Tj ( ) Tj 0 .501961 0 rg (frozenset) Tj 0 0 0 rg (\() Tj (kw) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (iteritems) Tj (\(\)\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (key) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (args) Tj T* ( ) Tj (cache) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (key) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (cache) Tj (:) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (cache) Tj ([) Tj (key) Tj (]) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (cache) Tj ([) Tj (key) Tj (]) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (result) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (result) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (functools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (update_wrapper) Tj (\() Tj (memoize) Tj (,) Tj ( ) Tj (func) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 168.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 168.75 60 12 re f* +.960784 .960784 .862745 rg +n 84 168.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 168.75 24 12 re f* +.960784 .960784 .862745 rg +n 114 168.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 156.75 30 12 re f* +.960784 .960784 .862745 rg +n 90 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 132.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 132.75 42 12 re f* +.960784 .960784 .862745 rg +n 90 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 132.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 132.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 132.75 12 12 re f* +.960784 .960784 .862745 rg +n 162 132.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 78 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 120.75 246 12 re f* +.960784 .960784 .862745 rg +n 72 108.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 108.75 24 12 re f* +.960784 .960784 .862745 rg +n 132 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 108.75 54 12 re f* +.960784 .960784 .862745 rg +n 198 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 216 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 222 108.75 54 12 re f* +.960784 .960784 .862745 rg +n 276 108.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 120 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 108 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 138 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 114 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 144 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 168 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 228 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 234 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 240 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 264 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 276 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 288 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 300 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 54 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 84 12 re f* +.960784 .960784 .862745 rg +n 210 .75 6 12 re f* +.960784 .960784 .862745 rg +n 216 .75 42 12 re f* +.960784 .960784 .862745 rg +n 258 .75 6 12 re f* +.960784 .960784 .862745 rg +n 270 .75 24 12 re f* +.960784 .960784 .862745 rg +n 294 .75 6 12 re f* +BT 1 0 0 1 0 170 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize_uw) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize) 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 /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# frozenset is used to ensure hashability) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (frozenset) Tj 0 0 0 rg (\() Tj 0 0 0 rg (kw) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (iteritems) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ([) Tj 0 0 0 rg (key) Tj 0 0 0 rg (]) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ([) Tj 0 0 0 rg (key) 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 (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (functools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (update_wrapper) Tj 0 0 0 rg (\() Tj 0 0 0 rg (memoize) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 93.82362 cm +1 0 0 1 62.69291 81.82362 cm q -BT 1 0 0 1 0 38 Tm 1.801412 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here we used the ) Tj 0 0 .501961 rg (functools.update_wrapper ) Tj 0 0 0 rg (utility, which has been added in Python 2.5 expressly to) Tj T* 0 Tw .91686 Tw (simplify the definition of decorators \(in older versions of Python you need to copy the function attributes) Tj T* 0 Tw .580814 Tw /F4 10 Tf (__name__) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (__doc__) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (__module__ ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (__dict__ ) Tj /F1 10 Tf (from the original function to the decorated function) Tj T* 0 Tw (by hand\).) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.801412 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here we used the ) Tj 0 0 .501961 rg (functools.update_wrapper ) Tj 0 0 0 rg (utility, which has been added in Python 2.5 expressly to) Tj T* 0 Tw .91686 Tw (simplify the definition of decorators \(in older versions of Python you need to copy the function attributes) Tj T* 0 Tw .580814 Tw /F4 10 Tf 0 0 0 rg (__name__) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (__doc__) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (__module__ ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (__dict__ ) Tj /F1 10 Tf 0 0 0 rg (from the original function to the decorated function) Tj T* 0 Tw (by hand\).) Tj T* ET Q Q endstream endobj -% 'R87': class PDFStream 87 0 obj -% page stream -<< /Length 8057 >> +<< /Length 17189 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q 1 0 0 1 62.69291 729.0236 cm q -BT 1 0 0 1 0 26 Tm 2.517126 Tw 12 TL /F1 10 Tf 0 0 0 rg (The implementation above works in the sense that the decorator can accept functions with generic) Tj T* 0 Tw 1.233615 Tw (signatures; unfortunately this implementation does ) Tj /F5 10 Tf (not ) Tj /F1 10 Tf (define a signature-preserving decorator, since in) Tj T* 0 Tw (general ) Tj /F4 10 Tf (memoize_uw ) Tj /F1 10 Tf (returns a function with a ) Tj /F5 10 Tf (different signature ) Tj /F1 10 Tf (from the original function.) Tj T* ET +BT 1 0 0 1 0 26 Tm 2.517126 Tw 12 TL /F1 10 Tf 0 0 0 rg (The implementation above works in the sense that the decorator can accept functions with generic) Tj T* 0 Tw 1.233615 Tw (signatures; unfortunately this implementation does ) Tj /F5 10 Tf (not ) Tj /F1 10 Tf (define a signature-preserving decorator, since in) Tj T* 0 Tw (general ) Tj /F4 10 Tf 0 0 0 rg (memoize_uw ) Tj /F1 10 Tf 0 0 0 rg (returns a function with a ) Tj /F5 10 Tf (different signature ) Tj /F1 10 Tf (from the original function.) Tj T* ET Q Q q @@ -2035,7 +1111,49 @@ q n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@memoize_uw) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj (x) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# simulate some long computation) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (x) Tj T* ET +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 66 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 108 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 12.75 192 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 36 12 re f* +.960784 .960784 .862745 rg +n 90 .75 6 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@memoize_uw) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj 0 0 0 rg (x) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# simulate some long computation) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (x) Tj T* ET Q Q Q @@ -2044,7 +1162,7 @@ Q q 1 0 0 1 62.69291 609.8236 cm q -BT 1 0 0 1 0 14 Tm .26311 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here the original function takes a single argument named ) Tj /F4 10 Tf (x) Tj /F1 10 Tf (, but the decorated function takes any number) Tj T* 0 Tw (of arguments and keyword arguments:) Tj T* ET +BT 1 0 0 1 0 14 Tm .26311 Tw 12 TL /F1 10 Tf 0 0 0 rg (Here the original function takes a single argument named ) Tj /F4 10 Tf 0 0 0 rg (x) Tj /F1 10 Tf 0 0 0 rg (, but the decorated function takes any number) Tj T* 0 Tw (of arguments and keyword arguments:) Tj T* ET Q Q q @@ -2061,7 +1179,73 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (inspect) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj (\() Tj (f1) Tj (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# I am using Python 2.6+ here) Tj /F4 10 Tf 0 0 0 rg T* (ArgSpec) Tj (\() Tj (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([],) Tj ( ) Tj (varargs) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('args') Tj 0 0 0 rg (,) Tj ( ) Tj (keywords) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('kw') Tj 0 0 0 rg (,) Tj ( ) Tj (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 42 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 144 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 138 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 174 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 42 .75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 18 12 re f* +.960784 .960784 .862745 rg +n 102 .75 42 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +.960784 .960784 .862745 rg +n 150 .75 36 12 re f* +.960784 .960784 .862745 rg +n 186 .75 6 12 re f* +.960784 .960784 .862745 rg +n 198 .75 48 12 re f* +.960784 .960784 .862745 rg +n 246 .75 6 12 re f* +.960784 .960784 .862745 rg +n 252 .75 24 12 re f* +.960784 .960784 .862745 rg +n 276 .75 6 12 re f* +.960784 .960784 .862745 rg +n 288 .75 48 12 re f* +.960784 .960784 .862745 rg +n 336 .75 6 12 re f* +.960784 .960784 .862745 rg +n 342 .75 24 12 re f* +.960784 .960784 .862745 rg +n 366 .75 6 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (inspect) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# I am using Python 2.6+ here) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (ArgSpec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([],) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (varargs) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('args') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (keywords) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('kw') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2070,7 +1254,7 @@ Q q 1 0 0 1 62.69291 508.6236 cm q -BT 1 0 0 1 0 26 Tm .411235 Tw 12 TL /F1 10 Tf 0 0 0 rg (This means that introspection tools such as pydoc will give wrong informations about the signature of ) Tj /F4 10 Tf (f1) Tj /F1 10 Tf (.) Tj T* 0 Tw .161654 Tw (This is pretty bad: pydoc will tell you that the function accepts a generic signature ) Tj /F4 10 Tf (*args) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (**kw) Tj /F1 10 Tf (, but when) Tj T* 0 Tw (you try to call the function with more than an argument, you will get an error:) Tj T* ET +BT 1 0 0 1 0 26 Tm .411235 Tw 12 TL /F1 10 Tf 0 0 0 rg (This means that introspection tools such as pydoc will give wrong informations about the signature of ) Tj /F4 10 Tf 0 0 0 rg (f1) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* 0 Tw .161654 Tw (This is pretty bad: pydoc will tell you that the function accepts a generic signature ) Tj /F4 10 Tf 0 0 0 rg (*args) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (**kw) Tj /F1 10 Tf 0 0 0 rg (, but when) Tj T* 0 Tw (you try to call the function with more than an argument, you will get an error:) Tj T* ET Q Q q @@ -2087,7 +1271,65 @@ q n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f1) Tj (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj T* (Traceback) Tj ( ) Tj (\() Tj (most) Tj ( ) Tj (recent) Tj ( ) Tj (call) Tj ( ) Tj (last) Tj (\):) Tj T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F3 10 Tf .823529 .254902 .227451 rg (TypeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj (f1) Tj (\(\)) Tj ( ) Tj (takes) Tj ( ) Tj (exactly) Tj ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg ( ) Tj (argument) Tj ( ) Tj (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg ( ) Tj (given) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 36 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 54 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 18 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 .75 54 12 re f* +.960784 .960784 .862745 rg +n 54 .75 6 12 re f* +.960784 .960784 .862745 rg +n 66 .75 12 12 re f* +.960784 .960784 .862745 rg +n 78 .75 12 12 re f* +.960784 .960784 .862745 rg +n 96 .75 30 12 re f* +.960784 .960784 .862745 rg +n 132 .75 42 12 re f* +.960784 .960784 .862745 rg +n 180 .75 6 12 re f* +.960784 .960784 .862745 rg +n 192 .75 48 12 re f* +.960784 .960784 .862745 rg +n 246 .75 6 12 re f* +.960784 .960784 .862745 rg +n 252 .75 6 12 re f* +.960784 .960784 .862745 rg +n 264 .75 30 12 re f* +.960784 .960784 .862745 rg +n 294 .75 6 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) 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* /F3 10 Tf .823529 .254902 .227451 rg (TypeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (takes) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (exactly) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (argument) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (given) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2102,7 +1344,7 @@ Q q 1 0 0 1 62.69291 364.4236 cm q -BT 1 0 0 1 0 26 Tm 3.313984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The solution is to provide a generic factory of generators, which hides the complexity of making) Tj T* 0 Tw 3.362976 Tw (signature-preserving decorators from the application programmer. The ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (function in the) Tj T* 0 Tw /F4 10 Tf (decorator ) Tj /F1 10 Tf (module is such a factory:) Tj T* ET +BT 1 0 0 1 0 26 Tm 3.313984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The solution is to provide a generic factory of generators, which hides the complexity of making) Tj T* 0 Tw 3.362976 Tw (signature-preserving decorators from the application programmer. The ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (function in the) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module is such a factory:) Tj T* ET Q Q q @@ -2119,7 +1361,21 @@ q n -6 -6 468.6898 24 re B* Q q -BT 1 0 0 1 0 2 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (decorator) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (decorator) Tj T* ET +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 6 12 re f* +.960784 .960784 .862745 rg +n 12 .75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 24 12 re f* +.960784 .960784 .862745 rg +n 54 .75 54 12 re f* +.960784 .960784 .862745 rg +n 114 .75 36 12 re f* +.960784 .960784 .862745 rg +n 156 .75 54 12 re f* +BT 1 0 0 1 0 2 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (decorator) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj T* ET Q Q Q @@ -2128,7 +1384,7 @@ Q q 1 0 0 1 62.69291 275.2236 cm q -BT 1 0 0 1 0 38 Tm 1.716412 Tw 12 TL /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf (takes two arguments, a caller function describing the functionality of the decorator and a) Tj T* 0 Tw 2.594983 Tw (function to be decorated; it returns the decorated function. The caller function must have signature) Tj T* 0 Tw .19311 Tw /F4 10 Tf (\(f,) Tj ( ) Tj (*args,) Tj ( ) Tj (**kw\) ) Tj /F1 10 Tf (and it must call the original function ) Tj /F4 10 Tf (f ) Tj /F1 10 Tf (with arguments ) Tj /F4 10 Tf (args ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (kw) Tj /F1 10 Tf (, implementing) Tj T* 0 Tw (the wanted capability, i.e. memoization in this case:) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.716412 Tw 12 TL /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (takes two arguments, a caller function describing the functionality of the decorator and a) Tj T* 0 Tw 2.594983 Tw (function to be decorated; it returns the decorated function. The caller function must have signature) Tj T* 0 Tw .19311 Tw /F4 10 Tf 0 0 0 rg (\(f,) Tj ( ) Tj (*args,) Tj ( ) Tj (**kw\) ) Tj /F1 10 Tf 0 0 0 rg (and it must call the original function ) Tj /F4 10 Tf 0 0 0 rg (f ) Tj /F1 10 Tf 0 0 0 rg (with arguments ) Tj /F4 10 Tf 0 0 0 rg (args ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (kw) Tj /F1 10 Tf 0 0 0 rg (, implementing) Tj T* 0 Tw (the wanted capability, i.e. memoization in this case:) Tj T* ET Q Q q @@ -2145,7 +1401,137 @@ q n -6 -6 468.6898 144 re B* Q q -BT 1 0 0 1 0 122 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (_memoize) Tj 0 0 0 rg (\() Tj (func) Tj (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (kw) Tj (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# frozenset is used to ensure hashability) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj (key) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (args) Tj (,) Tj ( ) Tj 0 .501961 0 rg (frozenset) Tj 0 0 0 rg (\() Tj (kw) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (iteritems) Tj (\(\)\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (key) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (args) Tj T* ( ) Tj (cache) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# attributed added by memoize) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (key) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (cache) Tj (:) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (cache) Tj ([) Tj (key) Tj (]) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (cache) Tj ([) Tj (key) Tj (]) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (result) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (result) Tj T* ET +.960784 .960784 .862745 rg +n 0 120.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 120.75 48 12 re f* +.960784 .960784 .862745 rg +n 72 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 120.75 24 12 re f* +.960784 .960784 .862745 rg +n 102 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 120.75 24 12 re f* +.960784 .960784 .862745 rg +n 144 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 168 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 180 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 54 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 108.75 246 12 re f* +.960784 .960784 .862745 rg +n 48 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 108 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 96.75 54 12 re f* +.960784 .960784 .862745 rg +n 174 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 192 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 96.75 54 12 re f* +.960784 .960784 .862745 rg +n 252 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 144 60.75 174 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 66 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 84 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 114 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 144 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 102 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 168 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 204 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 210 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 240 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 264 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 276 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 36 12 re f* +.960784 .960784 .862745 rg +n 90 .75 36 12 re f* +BT 1 0 0 1 0 122 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (_memoize) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# frozenset is used to ensure hashability) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (frozenset) Tj 0 0 0 rg (\() Tj 0 0 0 rg (kw) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (iteritems) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# attributed added by memoize) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (key) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ([) Tj 0 0 0 rg (key) Tj 0 0 0 rg (]) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ([) Tj 0 0 0 rg (key) 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 (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj T* ET Q Q Q @@ -2161,10 +1547,8 @@ Q endstream endobj -% 'R88': class PDFStream 88 0 obj -% page stream -<< /Length 7115 >> +<< /Length 15826 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q @@ -2181,7 +1565,41 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize) Tj 0 0 0 rg (\() Tj (f) Tj (\):) Tj T* ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj ({}) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (decorator) Tj (\() Tj (_memoize) Tj (,) Tj ( ) Tj (f) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 42 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 54 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 48 12 re f* +.960784 .960784 .862745 rg +n 174 .75 6 12 re f* +.960784 .960784 .862745 rg +n 186 .75 6 12 re f* +.960784 .960784 .862745 rg +n 192 .75 6 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (memoize) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (cache) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_memoize) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2190,7 +1608,7 @@ Q q 1 0 0 1 62.69291 671.8236 cm q -BT 1 0 0 1 0 26 Tm .12561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The difference with respect to the ) Tj /F4 10 Tf (memoize_uw ) Tj /F1 10 Tf (approach, which is based on nested functions, is that the) Tj T* 0 Tw 2.59528 Tw (decorator module forces you to lift the inner function at the outer level \() Tj /F5 10 Tf (flat is better than nested) Tj /F1 10 Tf (\).) Tj T* 0 Tw (Moreover, you are forced to pass explicitly the function you want to decorate to the caller function.) Tj T* ET +BT 1 0 0 1 0 26 Tm .12561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The difference with respect to the ) Tj /F4 10 Tf 0 0 0 rg (memoize_uw ) Tj /F1 10 Tf 0 0 0 rg (approach, which is based on nested functions, is that the) Tj T* 0 Tw 2.59528 Tw (decorator module forces you to lift the inner function at the outer level \() Tj /F5 10 Tf (flat is better than nested) Tj /F1 10 Tf (\).) Tj T* 0 Tw (Moreover, you are forced to pass explicitly the function you want to decorate to the caller function.) Tj T* ET Q Q q @@ -2214,7 +1632,75 @@ q n -6 -6 468.6898 132 re B* Q q -BT 1 0 0 1 0 110 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@memoize) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (heavy_computation) Tj 0 0 0 rg (\(\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("done") Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (heavy_computation) Tj (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the first time it will take 2 seconds) Tj /F4 10 Tf 0 0 0 rg T* (done) Tj T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (heavy_computation) Tj (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the second time it will be instantaneous) Tj /F4 10 Tf 0 0 0 rg T* (done) Tj T* ET +.960784 .960784 .862745 rg +n 0 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 108.75 48 12 re f* +.960784 .960784 .862745 rg +n 0 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 96.75 102 12 re f* +.960784 .960784 .862745 rg +n 150 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 84.75 30 12 re f* +.960784 .960784 .862745 rg +n 108 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 48.75 102 12 re f* +.960784 .960784 .862745 rg +n 162 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 180 48.75 234 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 102 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 180 12.75 252 12 re f* +.960784 .960784 .862745 rg +n 0 .75 24 12 re f* +BT 1 0 0 1 0 110 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@memoize) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (heavy_computation) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("done") Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (heavy_computation) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the first time it will take 2 seconds) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (done) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (heavy_computation) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the second time it will be instantaneous) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (done) Tj T* ET Q Q Q @@ -2223,7 +1709,7 @@ Q q 1 0 0 1 62.69291 492.6236 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The signature of ) Tj /F4 10 Tf (heavy_computation ) Tj /F1 10 Tf (is the one you would expect:) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The signature of ) Tj /F4 10 Tf 0 0 0 rg (heavy_computation ) Tj /F1 10 Tf 0 0 0 rg (is the one you would expect:) Tj T* ET Q Q q @@ -2240,7 +1726,57 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj (\() Tj (heavy_computation) Tj (\)) Tj T* (ArgSpec) Tj (\() Tj (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([],) Tj ( ) Tj (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 102 12 re f* +.960784 .960784 .862745 rg +n 228 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 42 .75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 18 12 re f* +.960784 .960784 .862745 rg +n 102 .75 42 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +.960784 .960784 .862745 rg +n 150 .75 24 12 re f* +.960784 .960784 .862745 rg +n 174 .75 6 12 re f* +.960784 .960784 .862745 rg +n 186 .75 48 12 re f* +.960784 .960784 .862745 rg +n 234 .75 6 12 re f* +.960784 .960784 .862745 rg +n 240 .75 24 12 re f* +.960784 .960784 .862745 rg +n 264 .75 6 12 re f* +.960784 .960784 .862745 rg +n 276 .75 48 12 re f* +.960784 .960784 .862745 rg +n 324 .75 6 12 re f* +.960784 .960784 .862745 rg +n 330 .75 24 12 re f* +.960784 .960784 .862745 rg +n 354 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (heavy_computation) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (ArgSpec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([],) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2249,13 +1785,13 @@ Q q 1 0 0 1 62.69291 414.4236 cm q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (A ) Tj /F3 17.5 Tf (trace ) Tj /F2 17.5 Tf (decorator) Tj T* ET +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (A ) Tj /F3 17.5 Tf 0 0 0 rg (trace ) Tj /F2 17.5 Tf 0 0 0 rg (decorator) Tj T* ET Q Q q 1 0 0 1 62.69291 384.4236 cm q -BT 1 0 0 1 0 14 Tm .479398 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an additional example, here is how you can define a trivial ) Tj /F4 10 Tf (trace ) Tj /F1 10 Tf (decorator, which prints a message) Tj T* 0 Tw (everytime the traced function is called:) Tj T* ET +BT 1 0 0 1 0 14 Tm .479398 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an additional example, here is how you can define a trivial ) Tj /F4 10 Tf 0 0 0 rg (trace ) Tj /F1 10 Tf 0 0 0 rg (decorator, which prints a message) Tj T* 0 Tw (everytime the traced function is called:) Tj T* ET Q Q q @@ -2272,7 +1808,83 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (_trace) Tj 0 0 0 rg (\() Tj (f) Tj (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("calling ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg ( with args ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (, ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (") Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj (\() Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj (,) Tj ( ) Tj (args) Tj (,) Tj ( ) Tj (kw) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 114 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 66 12 re f* +.960784 .960784 .862745 rg +n 192 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 204 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 216 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 228 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 240 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 258 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 264 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 270 12.75 48 12 re f* +.960784 .960784 .862745 rg +n 318 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 330 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 354 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 366 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 378 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 6 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 84 .75 24 12 re f* +.960784 .960784 .862745 rg +n 108 .75 6 12 re f* +.960784 .960784 .862745 rg +n 120 .75 12 12 re f* +.960784 .960784 .862745 rg +n 132 .75 12 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (_trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("calling ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg ( with args ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (, ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (") Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 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 T* ET Q Q Q @@ -2292,7 +1904,31 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (trace) Tj 0 0 0 rg (\() Tj (f) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (decorator) Tj (\() Tj (_trace) Tj (,) Tj ( ) Tj (f) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 54 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 36 12 re f* +.960784 .960784 .862745 rg +n 162 .75 6 12 re f* +.960784 .960784 .862745 rg +n 174 .75 6 12 re f* +.960784 .960784 .862745 rg +n 180 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_trace) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2319,7 +1955,31 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj (x) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj 0 0 0 rg (x) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET Q Q Q @@ -2328,7 +1988,7 @@ Q q 1 0 0 1 62.69291 184.8236 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (It is immediate to verify that ) Tj /F4 10 Tf (f1 ) Tj /F1 10 Tf (works) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (It is immediate to verify that ) Tj /F4 10 Tf 0 0 0 rg (f1 ) Tj /F1 10 Tf 0 0 0 rg (works) Tj T* ET Q Q q @@ -2345,7 +2005,37 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f1) Tj (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (\)) Tj T* (calling) Tj ( ) Tj (f1) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (args) Tj ( ) Tj (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,\),) Tj ( ) Tj ({}) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 48 .75 12 12 re f* +.960784 .960784 .862745 rg +n 66 .75 24 12 re f* +.960784 .960784 .862745 rg +n 96 .75 24 12 re f* +.960784 .960784 .862745 rg +n 126 .75 6 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 138 .75 18 12 re f* +.960784 .960784 .862745 rg +n 162 .75 12 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (calling) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj T* ET Q Q Q @@ -2361,10 +2051,8 @@ Q endstream endobj -% 'R89': class PDFStream 89 0 obj -% page stream -<< /Length 8852 >> +<< /Length 22325 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q @@ -2381,7 +2069,61 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj (\() Tj (f1) Tj (\)) Tj T* (ArgSpec) Tj (\() Tj (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (],) Tj ( ) Tj (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 138 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 42 .75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 84 .75 18 12 re f* +.960784 .960784 .862745 rg +n 102 .75 12 12 re f* +.960784 .960784 .862745 rg +n 120 .75 42 12 re f* +.960784 .960784 .862745 rg +n 162 .75 6 12 re f* +.960784 .960784 .862745 rg +n 168 .75 24 12 re f* +.960784 .960784 .862745 rg +n 192 .75 6 12 re f* +.960784 .960784 .862745 rg +n 204 .75 48 12 re f* +.960784 .960784 .862745 rg +n 252 .75 6 12 re f* +.960784 .960784 .862745 rg +n 258 .75 24 12 re f* +.960784 .960784 .862745 rg +n 282 .75 6 12 re f* +.960784 .960784 .862745 rg +n 294 .75 48 12 re f* +.960784 .960784 .862745 rg +n 342 .75 6 12 re f* +.960784 .960784 .862745 rg +n 348 .75 24 12 re f* +.960784 .960784 .862745 rg +n 372 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (ArgSpec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (],) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (defaults) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q @@ -2395,12 +2137,12 @@ BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The same decorator works with functions of an Q Q q -1 0 0 1 62.69291 579.978 cm +1 0 0 1 62.69291 578.6236 cm q q -.988825 0 0 .988825 0 0 cm +1 0 0 1 0 0 cm q -1 0 0 1 6.6 6.674587 cm +1 0 0 1 6.6 6.6 cm q .662745 .662745 .662745 RG .5 w @@ -2408,21 +2150,183 @@ q n -6 -6 474 120 re B* Q q -BT 1 0 0 1 0 98 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj (x) Tj (,) Tj ( ) Tj (y) Tj .4 .4 .4 rg (=) Tj (1) Tj 0 0 0 rg (,) Tj ( ) Tj (z) Tj .4 .4 .4 rg (=) Tj (2) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f) Tj (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (\)) Tj T* (calling) Tj ( ) Tj (f) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (args) Tj ( ) Tj (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\),) Tj ( ) Tj ({}) Tj T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj (\() Tj (f) Tj (\)) Tj T* (ArgSpec) Tj (\() Tj (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('y') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('z') Tj 0 0 0 rg (],) Tj ( ) Tj (varargs) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('args') Tj 0 0 0 rg (,) Tj ( ) Tj (keywords) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('kw') Tj 0 0 0 rg (,) Tj ( ) Tj (defaults) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)\)) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 559.978 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (That includes even functions with exotic signatures like the following:) Tj T* ET +.960784 .960784 .862745 rg +n 0 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 192 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 204 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 186 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 42 .75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 84 .75 18 12 re f* +.960784 .960784 .862745 rg +n 102 .75 6 12 re f* +.960784 .960784 .862745 rg +n 114 .75 18 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 144 .75 18 12 re f* +.960784 .960784 .862745 rg +n 162 .75 12 12 re f* +.960784 .960784 .862745 rg +n 180 .75 42 12 re f* +.960784 .960784 .862745 rg +n 222 .75 6 12 re f* +.960784 .960784 .862745 rg +n 228 .75 36 12 re f* +.960784 .960784 .862745 rg +n 264 .75 6 12 re f* +.960784 .960784 .862745 rg +n 276 .75 48 12 re f* +.960784 .960784 .862745 rg +n 324 .75 6 12 re f* +.960784 .960784 .862745 rg +n 330 .75 24 12 re f* +.960784 .960784 .862745 rg +n 354 .75 6 12 re f* +.960784 .960784 .862745 rg +n 366 .75 48 12 re f* +.960784 .960784 .862745 rg +n 414 .75 6 12 re f* +.960784 .960784 .862745 rg +n 420 .75 6 12 re f* +.960784 .960784 .862745 rg +n 426 .75 6 12 re f* +.960784 .960784 .862745 rg +n 432 .75 6 12 re f* +.960784 .960784 .862745 rg +n 444 .75 6 12 re f* +.960784 .960784 .862745 rg +n 450 .75 12 12 re f* +BT 1 0 0 1 0 98 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (x) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (y) Tj .4 .4 .4 rg (=) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (z) Tj .4 .4 .4 rg (=) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (calling) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) 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 (ArgSpec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('y') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('z') Tj 0 0 0 rg (],) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (varargs) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('args') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (keywords) Tj .4 .4 .4 rg (=) Tj .729412 .129412 .129412 rg ('kw') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (defaults) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)\)) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 558.6236 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (That includes even functions with exotic signatures like the following:) Tj T* ET Q Q q -1 0 0 1 62.69291 442.778 cm +1 0 0 1 62.69291 441.4236 cm q q 1 0 0 1 0 0 cm @@ -2435,33 +2339,173 @@ q n -6 -6 468.6898 108 re B* Q q -BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (exotic_signature) Tj 0 0 0 rg (\(\() Tj (x) Tj (,) Tj ( ) Tj (y) Tj (\)) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)\):) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (x) Tj .4 .4 .4 rg (+) Tj 0 0 0 rg (y) Tj T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (getargspec) Tj (\() Tj (exotic_signature) Tj (\)) Tj T* (ArgSpec) Tj (\() Tj (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([[) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('y') Tj 0 0 0 rg (]],) Tj ( ) Tj (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (defaults) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\(\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\),\)\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (exotic_signature) Tj (\(\)) Tj T* (calling) Tj ( ) Tj (exotic_signature) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (args) Tj ( ) Tj (\(\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\),\),) Tj ( ) Tj ({}) Tj T* .4 .4 .4 rg (3) Tj T* ET +.960784 .960784 .862745 rg +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 96 12 re f* +.960784 .960784 .862745 rg +n 144 72.75 12 12 re f* +.960784 .960784 .862745 rg +n 156 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 186 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 192 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 210 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 240 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 282 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 288 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 294 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 48.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 48.75 96 12 re f* +.960784 .960784 .862745 rg +n 222 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 42 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 108 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 138 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 162 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 204 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 210 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 234 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 246 36.75 48 12 re f* +.960784 .960784 .862745 rg +n 294 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 300 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 324 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 336 36.75 48 12 re f* +.960784 .960784 .862745 rg +n 384 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 390 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 402 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 408 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 420 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 426 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 96 12 re f* +.960784 .960784 .862745 rg +n 120 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 42 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 96 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 180 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 210 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 222 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 228 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 240 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 246 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 276 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (exotic_signature) Tj 0 0 0 rg (\(\() Tj 0 0 0 rg (x) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (y) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)\):) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (+) Tj 0 0 0 rg (y) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (getargspec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (exotic_signature) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (ArgSpec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (args) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ([[) Tj .729412 .129412 .129412 rg ('x') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('y') Tj 0 0 0 rg (]],) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (varargs) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (keywords) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (defaults) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (\(\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) 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 (exotic_signature) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* 0 0 0 rg (calling) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (exotic_signature) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\(\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\),\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj 0 0 0 rg T* .4 .4 .4 rg (3) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 410.778 cm +1 0 0 1 62.69291 409.4236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .84561 Tw (Notice that the support for exotic signatures has been deprecated in Python 2.6 and removed in Python) Tj T* 0 Tw (3.0.) Tj T* ET Q Q q -1 0 0 1 62.69291 377.778 cm +1 0 0 1 62.69291 376.4236 cm q -BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (decorator ) Tj /F2 17.5 Tf (is a decorator) Tj T* ET +BT 1 0 0 1 0 3.5 Tm 21 TL /F3 17.5 Tf 0 0 0 rg (decorator ) Tj /F2 17.5 Tf 0 0 0 rg (is a decorator) Tj T* ET Q Q q -1 0 0 1 62.69291 275.778 cm +1 0 0 1 62.69291 274.4236 cm q -BT 1 0 0 1 0 86 Tm .643876 Tw 12 TL /F1 10 Tf 0 0 0 rg (It may be annoying to write a caller function \(like the ) Tj /F4 10 Tf (_trace ) Tj /F1 10 Tf (function above\) and then a trivial wrapper) Tj T* 0 Tw 1.510888 Tw (\() Tj /F4 10 Tf (def) Tj ( ) Tj (trace\(f\):) Tj ( ) Tj (return) Tj ( ) Tj (decorator\(_trace,) Tj ( ) Tj (f\)) Tj /F1 10 Tf (\) every time. For this reason, the ) Tj /F4 10 Tf (decorator) Tj T* 0 Tw .334269 Tw /F1 10 Tf (module provides an easy shortcut to convert the caller function into a signature-preserving decorator: you) Tj T* 0 Tw 7.364269 Tw (can just call ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (with a single argument. In our example you can just write) Tj T* 0 Tw .951647 Tw /F4 10 Tf (trace) Tj ( ) Tj (=) Tj ( ) Tj (decorator\(_trace\)) Tj /F1 10 Tf (. The ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (function can also be used as a signature-changing) Tj T* 0 Tw 1.077752 Tw (decorator, just as ) Tj /F4 10 Tf (classmethod ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (staticmethod) Tj /F1 10 Tf (. However, ) Tj /F4 10 Tf (classmethod ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (staticmethod) Tj T* 0 Tw .531797 Tw /F1 10 Tf (return generic objects which are not callable, while ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (returns signature-preserving decorators,) Tj T* 0 Tw (i.e. functions of a single argument. For instance, you can write directly) Tj T* ET +BT 1 0 0 1 0 86 Tm .643876 Tw 12 TL /F1 10 Tf 0 0 0 rg (It may be annoying to write a caller function \(like the ) Tj /F4 10 Tf 0 0 0 rg (_trace ) Tj /F1 10 Tf 0 0 0 rg (function above\) and then a trivial wrapper) Tj T* 0 Tw 1.510888 Tw (\() Tj /F4 10 Tf 0 0 0 rg (def) Tj ( ) Tj (trace\(f\):) Tj ( ) Tj (return) Tj ( ) Tj (decorator\(_trace,) Tj ( ) Tj (f\)) Tj /F1 10 Tf 0 0 0 rg (\) every time. For this reason, the ) Tj /F4 10 Tf 0 0 0 rg (decorator) Tj T* 0 Tw .334269 Tw /F1 10 Tf 0 0 0 rg (module provides an easy shortcut to convert the caller function into a signature-preserving decorator: you) Tj T* 0 Tw 7.364269 Tw (can just call ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (with a single argument. In our example you can just write) Tj T* 0 Tw .951647 Tw /F4 10 Tf 0 0 0 rg (trace) Tj ( ) Tj (=) Tj ( ) Tj (decorator\(_trace\)) Tj /F1 10 Tf 0 0 0 rg (. The ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (function can also be used as a signature-changing) Tj T* 0 Tw 1.077752 Tw (decorator, just as ) Tj /F4 10 Tf 0 0 0 rg (classmethod ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (staticmethod) Tj /F1 10 Tf 0 0 0 rg (. However, ) Tj /F4 10 Tf 0 0 0 rg (classmethod ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (staticmethod) Tj T* 0 Tw .531797 Tw /F1 10 Tf 0 0 0 rg (return generic objects which are not callable, while ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (returns signature-preserving decorators,) Tj T* 0 Tw (i.e. functions of a single argument. For instance, you can write directly) Tj T* ET Q Q q -1 0 0 1 62.69291 206.578 cm +1 0 0 1 62.69291 205.2236 cm q q 1 0 0 1 0 0 cm @@ -2474,20 +2518,110 @@ q n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@decorator) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (trace) Tj 0 0 0 rg (\() Tj (f) Tj (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("calling ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg ( with args ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (, ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (") Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj (\() Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func_name) Tj (,) Tj ( ) Tj (args) Tj (,) Tj ( ) Tj (kw) Tj (\)) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 60 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 132 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 156 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 168 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 138 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 66 12 re f* +.960784 .960784 .862745 rg +n 216 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 228 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 240 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 252 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 264 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 276 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 282 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 288 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 294 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 348 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 360 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 384 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 396 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 408 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 36 12 re f* +.960784 .960784 .862745 rg +n 90 .75 6 12 re f* +.960784 .960784 .862745 rg +n 96 .75 6 12 re f* +.960784 .960784 .862745 rg +n 102 .75 6 12 re f* +.960784 .960784 .862745 rg +n 108 .75 24 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 144 .75 12 12 re f* +.960784 .960784 .862745 rg +n 156 .75 12 12 re f* +.960784 .960784 .862745 rg +n 168 .75 6 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@decorator) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("calling ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg ( with args ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (, ) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (") Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func_name) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 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 T* ET Q Q Q Q Q q -1 0 0 1 62.69291 174.578 cm +1 0 0 1 62.69291 173.2236 cm q -BT 1 0 0 1 0 14 Tm 1.806654 Tw 12 TL /F1 10 Tf 0 0 0 rg (and now ) Tj /F4 10 Tf (trace ) Tj /F1 10 Tf (will be a decorator. Actually ) Tj /F4 10 Tf (trace ) Tj /F1 10 Tf (is a ) Tj /F4 10 Tf (partial ) Tj /F1 10 Tf (object which can be used as a) Tj T* 0 Tw (decorator:) Tj T* ET +BT 1 0 0 1 0 14 Tm 1.806654 Tw 12 TL /F1 10 Tf 0 0 0 rg (and now ) Tj /F4 10 Tf 0 0 0 rg (trace ) Tj /F1 10 Tf 0 0 0 rg (will be a decorator. Actually ) Tj /F4 10 Tf 0 0 0 rg (trace ) Tj /F1 10 Tf 0 0 0 rg (is a ) Tj /F4 10 Tf 0 0 0 rg (partial ) Tj /F1 10 Tf 0 0 0 rg (object which can be used as a) Tj T* 0 Tw (decorator:) Tj T* ET Q Q q -1 0 0 1 62.69291 129.378 cm +1 0 0 1 62.69291 128.0236 cm q q 1 0 0 1 0 0 cm @@ -2500,14 +2634,38 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (trace) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (function) Tj ( ) Tj (trace) Tj ( ) Tj (at) Tj ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (...) Tj (>) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 48 12 re f* +.960784 .960784 .862745 rg +n 60 .75 30 12 re f* +.960784 .960784 .862745 rg +n 96 .75 12 12 re f* +.960784 .960784 .862745 rg +n 114 .75 6 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 18 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (function) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (at) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (...) Tj (>) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 109.378 cm +1 0 0 1 62.69291 108.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an example of usage:) Tj T* ET @@ -2516,10 +2674,8 @@ Q endstream endobj -% 'R90': class PDFStream 90 0 obj -% page stream -<< /Length 7156 >> +<< /Length 18247 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q @@ -2536,7 +2692,47 @@ q n -6 -6 468.6898 72 re B* Q q -BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func) Tj 0 0 0 rg (\(\):) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (func) Tj (\(\)) Tj T* (calling) Tj ( ) Tj (func) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (args) Tj ( ) Tj (\(\),) Tj ( ) Tj ({}) Tj T* ET +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 .75 42 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 78 .75 24 12 re f* +.960784 .960784 .862745 rg +n 108 .75 24 12 re f* +.960784 .960784 .862745 rg +n 138 .75 18 12 re f* +.960784 .960784 .862745 rg +n 162 .75 12 12 re f* +BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* 0 0 0 rg (calling) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\(\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj T* ET Q Q Q @@ -2545,7 +2741,7 @@ Q q 1 0 0 1 62.69291 659.8236 cm q -BT 1 0 0 1 0 14 Tm 2.44686 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you are using an old Python version \(Python 2.4\) the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module provides a poor man) Tj T* 0 Tw (replacement for ) Tj /F4 10 Tf (functools.partial) Tj /F1 10 Tf (.) Tj T* ET +BT 1 0 0 1 0 14 Tm 2.44686 Tw 12 TL /F1 10 Tf 0 0 0 rg (If you are using an old Python version \(Python 2.4\) the ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module provides a poor man) Tj T* 0 Tw (replacement for ) Tj /F4 10 Tf 0 0 0 rg (functools.partial) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET Q Q q @@ -2557,11 +2753,11 @@ Q q 1 0 0 1 62.69291 584.8236 cm q -BT 1 0 0 1 0 26 Tm 1.224692 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes one has to deal with blocking resources, such as ) Tj /F4 10 Tf (stdin) Tj /F1 10 Tf (, and sometimes it is best to have) Tj T* 0 Tw .266235 Tw (back a "busy" message than to block everything. This behavior can be implemented with a suitable family) Tj T* 0 Tw (of decorators, where the parameter is the busy message:) Tj T* ET +BT 1 0 0 1 0 26 Tm 1.224692 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes one has to deal with blocking resources, such as ) Tj /F4 10 Tf 0 0 0 rg (stdin) Tj /F1 10 Tf 0 0 0 rg (, and sometimes it is best to have) Tj T* 0 Tw .266235 Tw (back a "busy" message than to block everything. This behavior can be implemented with a suitable family) Tj T* 0 Tw (of decorators, where the parameter is the busy message:) Tj T* ET Q Q q -1 0 0 1 62.69291 407.6236 cm +1 0 0 1 62.69291 395.6236 cm q q 1 0 0 1 0 0 cm @@ -2571,36 +2767,382 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 168 re B* -Q -q -BT 1 0 0 1 0 146 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (blocking) Tj 0 0 0 rg (\() Tj (not_avail) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (blocking) Tj 0 0 0 rg (\() Tj (f) Tj (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (not) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (hasattr) Tj 0 0 0 rg (\() Tj (f) Tj (,) Tj ( ) Tj .729412 .129412 .129412 rg ("thread") Tj 0 0 0 rg (\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# no thread running) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (set_result) Tj 0 0 0 rg (\(\):) Tj ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (result) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (f) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj (\() Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (set_result) Tj (\)) Tj T* ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj (\(\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (not_avail) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (elif) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (isAlive) Tj (\(\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (not_avail) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the thread is ended, return the stored result) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (del) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (result) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (decorator) Tj (\() Tj (blocking) Tj (\)) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 375.6236 cm -q -BT 1 0 0 1 0 14 Tm 1.010651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Functions decorated with ) Tj /F4 10 Tf (blocking ) Tj /F1 10 Tf (will return a busy message if the resource is unavailable, and the) Tj T* 0 Tw (intended result if the resource is available. For instance:) Tj T* ET -Q +n -6 -6 468.6898 180 re B* Q q -1 0 0 1 62.69291 126.4236 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 0 156.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 156.75 48 12 re f* +.960784 .960784 .862745 rg +n 72 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 156.75 54 12 re f* +.960784 .960784 .862745 rg +n 132 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 144.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 144.75 48 12 re f* +.960784 .960784 .862745 rg +n 96 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 144.75 24 12 re f* +.960784 .960784 .862745 rg +n 150 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 144.75 12 12 re f* +.960784 .960784 .862745 rg +n 174 144.75 12 12 re f* +.960784 .960784 .862745 rg +n 186 144.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 132.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 132.75 18 12 re f* +.960784 .960784 .862745 rg +n 90 132.75 42 12 re f* +.960784 .960784 .862745 rg +n 132 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 132.75 48 12 re f* +.960784 .960784 .862745 rg +n 204 132.75 12 12 re f* +.960784 .960784 .862745 rg +n 228 132.75 114 12 re f* +.960784 .960784 .862745 rg +n 72 120.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 120.75 60 12 re f* +.960784 .960784 .862745 rg +n 156 120.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 108.75 36 12 re f* +.960784 .960784 .862745 rg +n 150 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 108.75 24 12 re f* +.960784 .960784 .862745 rg +n 204 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 228 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 240 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 96.75 36 12 re f* +.960784 .960784 .862745 rg +n 126 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 96.75 54 12 re f* +.960784 .960784 .862745 rg +n 192 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 96.75 36 12 re f* +.960784 .960784 .862745 rg +n 234 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 240 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 264 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 276 96.75 60 12 re f* +.960784 .960784 .862745 rg +n 336 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 84.75 36 12 re f* +.960784 .960784 .862745 rg +n 120 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 84.75 30 12 re f* +.960784 .960784 .862745 rg +n 156 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 72 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 114 72.75 54 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 78 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 126 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 60.75 42 12 re f* +.960784 .960784 .862745 rg +n 174 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 114 48.75 54 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 282 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 54 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 48 12 re f* +.960784 .960784 .862745 rg +n 174 .75 6 12 re f* +BT 1 0 0 1 0 158 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (blocking) Tj 0 0 0 rg (\() Tj 0 0 0 rg (not_avail) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (blocking) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (not) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (hasattr) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("thread") Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# no thread running) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (set_result) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (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 (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (set_result) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (not_avail) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (elif) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (isAlive) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (not_avail) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the thread is ended, return the stored result) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (del) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (thread) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (result) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (blocking) Tj 0 0 0 rg (\)) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 363.6236 cm +q +BT 1 0 0 1 0 14 Tm 1.010651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Functions decorated with ) Tj /F4 10 Tf 0 0 0 rg (blocking ) Tj /F1 10 Tf 0 0 0 rg (will return a busy message if the resource is unavailable, and the) Tj T* 0 Tw (intended result if the resource is available. For instance:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 114.4236 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 240 re B* Q q -BT 1 0 0 1 0 218 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@blocking) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("Please wait ...") Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (read_data) Tj 0 0 0 rg (\(\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# simulate a blocking resource) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("some data") Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (read_data) Tj (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* (Please) Tj ( ) Tj (wait) Tj ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (read_data) Tj (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* (Please) Tj ( ) Tj (wait) Tj ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (read_data) Tj (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* (Please) Tj ( ) Tj (wait) Tj ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (1.1) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# after 3.1 seconds, data is available) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (read_data) Tj (\(\)) Tj T* (some) Tj ( ) Tj (data) Tj T* ET +.960784 .960784 .862745 rg +n 0 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 216.75 54 12 re f* +.960784 .960784 .862745 rg +n 78 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 216.75 102 12 re f* +.960784 .960784 .862745 rg +n 186 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 204.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 204.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 204.75 54 12 re f* +.960784 .960784 .862745 rg +n 102 204.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 192.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 192.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 192.75 30 12 re f* +.960784 .960784 .862745 rg +n 108 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 192.75 180 12 re f* +.960784 .960784 .862745 rg +n 0 180.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 180.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 180.75 66 12 re f* +.960784 .960784 .862745 rg +n 0 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 156.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 156.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 132 156.75 162 12 re f* +.960784 .960784 .862745 rg +n 0 144.75 36 12 re f* +.960784 .960784 .862745 rg +n 42 144.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 144.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 120.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 120.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 108.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 108.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 132 108.75 162 12 re f* +.960784 .960784 .862745 rg +n 0 96.75 36 12 re f* +.960784 .960784 .862745 rg +n 42 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 60.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 132 60.75 162 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 42 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 108 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 24.75 228 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 .75 24 12 re f* +.960784 .960784 .862745 rg +n 30 .75 24 12 re f* +BT 1 0 0 1 0 218 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@blocking) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("Please wait ...") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (read_data) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# simulate a blocking resource) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ("some data") Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (read_data) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (Please) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (wait) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (read_data) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (Please) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (wait) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (read_data) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# data is not available yet) Tj /F4 10 Tf 0 0 0 rg T* 0 0 0 rg (Please) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (wait) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1.1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# after 3.1 seconds, data is available) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (read_data) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* 0 0 0 rg (some) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (data) Tj T* ET Q Q Q @@ -2609,10 +3151,8 @@ Q endstream endobj -% 'R91': class PDFStream 91 0 obj -% page stream -<< /Length 7381 >> +<< /Length 16586 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q @@ -2631,7 +3171,7 @@ Q q 1 0 0 1 62.69291 636.0236 cm q -BT 1 0 0 1 0 50 Tm 2.853876 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an example, here will I show a decorator which is able to convert a blocking function into an) Tj T* 0 Tw 2.477126 Tw (asynchronous function. The function, when called, is executed in a separate thread. Moreover, it is) Tj T* 0 Tw .288443 Tw (possible to set three callbacks ) Tj /F4 10 Tf (on_success) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (on_failure ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (on_closing) Tj /F1 10 Tf (, to specify how to manage) Tj T* 0 Tw 1.854724 Tw (the function call \(of course the code here is just an example, it is not a recommended way of doing) Tj T* 0 Tw (multi-threaded programming\). The implementation is the following:) Tj T* ET +BT 1 0 0 1 0 50 Tm 2.853876 Tw 12 TL /F1 10 Tf 0 0 0 rg (As an example, here will I show a decorator which is able to convert a blocking function into an) Tj T* 0 Tw 2.477126 Tw (asynchronous function. The function, when called, is executed in a separate thread. Moreover, it is) Tj T* 0 Tw .288443 Tw (possible to set three callbacks ) Tj /F4 10 Tf 0 0 0 rg (on_success) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (on_failure ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (on_closing) Tj /F1 10 Tf 0 0 0 rg (, to specify how to manage) Tj T* 0 Tw 1.854724 Tw (the function call \(of course the code here is just an example, it is not a recommended way of doing) Tj T* 0 Tw (multi-threaded programming\). The implementation is the following:) Tj T* ET Q Q q @@ -2648,7 +3188,25 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_success) Tj 0 0 0 rg (\() Tj (result) Tj (\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called on the result of the function") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (result) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 24.75 144 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 228 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 36 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_success) Tj 0 0 0 rg (\() Tj 0 0 0 rg (result) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called on the result of the function") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj T* ET Q Q Q @@ -2668,7 +3226,23 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_failure) Tj 0 0 0 rg (\() Tj (exc_info) Tj (\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called if the function fails") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 48 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 162 24.75 144 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 180 12 re f* +.960784 .960784 .862745 rg +n 24 .75 24 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_failure) Tj 0 0 0 rg (\() Tj 0 0 0 rg (exc_info) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called if the function fails") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET Q Q Q @@ -2688,7 +3262,19 @@ q n -6 -6 468.6898 48 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_closing) Tj 0 0 0 rg (\(\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called at the end, both in case of success and failure") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 114 24.75 144 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 336 12 re f* +.960784 .960784 .862745 rg +n 24 .75 24 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (on_closing) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# default implementation) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("Called at the end, both in case of success and failure") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET Q Q Q @@ -2708,82 +3294,967 @@ q n -6 -6 468.6898 372 re B* Q q -BT 1 0 0 1 0 350 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (Async) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( A decorator converting blocking functions into asynchronous) Tj T* ( functions, by using threads or processes. Examples:) Tj T* T* ( async_with_threads = Async\(threading.Thread\)) Tj T* ( async_with_processes = Async\(multiprocessing.Process\)) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj ( ) Tj (threadfactory) Tj (,) Tj ( ) Tj (on_success) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_success) Tj (,) Tj T* ( ) Tj (on_failure) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_failure) Tj (,) Tj ( ) Tj (on_closing) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_closing) Tj (\):) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (threadfactory) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (on_success) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (on_failure) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (on_closing) Tj T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj ( ) Tj (func) Tj (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (counter) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (except) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf .823529 .254902 .227451 rg (AttributeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# instantiate the counter at the first call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj (counter) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (itertools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (count) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj T* ( ) Tj (name) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (') Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (-) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (') Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj (\() Tj (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj (,) Tj ( ) Tj (counter) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (next) Tj (\(\)\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func_wrapper) Tj 0 0 0 rg (\(\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj (result) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (except) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj (\() Tj (sys) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (exc_info) Tj (\(\)\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj (\() Tj (result) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (finally) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ET -Q -Q -Q -Q -Q - -endstream -endobj -% 'R92': class PDFStream -92 0 obj -% page stream -<< /Length 7221 >> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 62.69291 703.8236 cm -q -q -1 0 0 1 0 0 cm -q -1 0 0 1 6.6 6.6 cm -q -.662745 .662745 .662745 RG -.5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 60 re B* -Q -q -BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj (\(\)) Tj T* ( ) Tj (thread) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj (\() Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj ( ) Tj (func_wrapper) Tj (,) Tj ( ) Tj (name) Tj (\)) Tj T* ( ) Tj (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj (\(\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (thread) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 671.8236 cm -q -BT 1 0 0 1 0 14 Tm .865984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorated function returns the current execution thread, which can be stored and checked later, for) Tj T* 0 Tw (instance to verify that the thread ) Tj /F4 10 Tf (.isAlive\(\)) Tj /F1 10 Tf (.) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 629.8236 cm -q -0 0 0 rg -BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .691654 Tw (Here is an example of usage. Suppose one wants to write some data to an external resource which can) Tj T* 0 Tw .21683 Tw (be accessed by a single user at once \(for instance a printer\). Then the access to the writing function must) Tj T* 0 Tw (be locked. Here is a minimalistic example:) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 476.6236 cm -q -q +n 0 348.75 30 12 re f* +.960784 .960784 .862745 rg +n 36 348.75 30 12 re f* +.960784 .960784 .862745 rg +n 66 348.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 348.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 348.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 336.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 324.75 378 12 re f* +.960784 .960784 .862745 rg +n 0 312.75 330 12 re f* +.960784 .960784 .862745 rg +n 0 300.75 0 12 re f* +.960784 .960784 .862745 rg +n 0 288.75 294 12 re f* +.960784 .960784 .862745 rg +n 0 276.75 348 12 re f* +.960784 .960784 .862745 rg +n 0 264.75 42 12 re f* +.960784 .960784 .862745 rg +n 24 240.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 240.75 48 12 re f* +.960784 .960784 .862745 rg +n 96 240.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 240.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 240.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 240.75 78 12 re f* +.960784 .960784 .862745 rg +n 216 240.75 6 12 re f* +.960784 .960784 .862745 rg +n 228 240.75 60 12 re f* +.960784 .960784 .862745 rg +n 288 240.75 6 12 re f* +.960784 .960784 .862745 rg +n 294 240.75 60 12 re f* +.960784 .960784 .862745 rg +n 354 240.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 228.75 60 12 re f* +.960784 .960784 .862745 rg +n 162 228.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 228.75 60 12 re f* +.960784 .960784 .862745 rg +n 228 228.75 6 12 re f* +.960784 .960784 .862745 rg +n 240 228.75 60 12 re f* +.960784 .960784 .862745 rg +n 300 228.75 6 12 re f* +.960784 .960784 .862745 rg +n 306 228.75 60 12 re f* +.960784 .960784 .862745 rg +n 366 228.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 216.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 216.75 78 12 re f* +.960784 .960784 .862745 rg +n 162 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 216.75 78 12 re f* +.960784 .960784 .862745 rg +n 48 204.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 204.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 204.75 60 12 re f* +.960784 .960784 .862745 rg +n 144 204.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 204.75 60 12 re f* +.960784 .960784 .862745 rg +n 48 192.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 192.75 60 12 re f* +.960784 .960784 .862745 rg +n 144 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 192.75 60 12 re f* +.960784 .960784 .862745 rg +n 48 180.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 180.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 180.75 60 12 re f* +.960784 .960784 .862745 rg +n 144 180.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 180.75 60 12 re f* +.960784 .960784 .862745 rg +n 24 156.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 156.75 48 12 re f* +.960784 .960784 .862745 rg +n 96 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 162 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 204 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 228 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 240 156.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 144.75 18 12 re f* +.960784 .960784 .862745 rg +n 66 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 132.75 42 12 re f* +.960784 .960784 .862745 rg +n 120 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 132.75 24 12 re f* +.960784 .960784 .862745 rg +n 156 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 132.75 42 12 re f* +.960784 .960784 .862745 rg +n 48 120.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 120.75 84 12 re f* +.960784 .960784 .862745 rg +n 174 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 192 120.75 258 12 re f* +.960784 .960784 .862745 rg +n 72 108.75 42 12 re f* +.960784 .960784 .862745 rg +n 120 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 108.75 24 12 re f* +.960784 .960784 .862745 rg +n 156 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 108.75 42 12 re f* +.960784 .960784 .862745 rg +n 210 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 222 108.75 54 12 re f* +.960784 .960784 .862745 rg +n 276 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 282 108.75 30 12 re f* +.960784 .960784 .862745 rg +n 312 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 318 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 324 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 78 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 108 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 126 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 180 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 186 96.75 48 12 re f* +.960784 .960784 .862745 rg +n 234 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 246 96.75 42 12 re f* +.960784 .960784 .862745 rg +n 288 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 294 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 318 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 72.75 72 12 re f* +.960784 .960784 .862745 rg +n 144 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 138 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 174 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 186 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 210 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 222 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 234 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 246 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 120 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 186 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 210 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 24.75 48 12 re f* +.960784 .960784 .862745 rg +n 264 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 .75 36 12 re f* +.960784 .960784 .862745 rg +n 138 .75 24 12 re f* +.960784 .960784 .862745 rg +n 162 .75 6 12 re f* +.960784 .960784 .862745 rg +n 168 .75 60 12 re f* +.960784 .960784 .862745 rg +n 228 .75 6 12 re f* +.960784 .960784 .862745 rg +n 234 .75 36 12 re f* +.960784 .960784 .862745 rg +n 270 .75 6 12 re f* +BT 1 0 0 1 0 350 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (Async) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( A decorator converting blocking functions into asynchronous) Tj T* ( functions, by using threads or processes. Examples:) Tj T* T* ( async_with_threads = Async\(threading.Thread\)) Tj T* ( async_with_processes = Async\(multiprocessing.Process\)) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_success) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg (,) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (on_failure) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_closing) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (except) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf .823529 .254902 .227451 rg (AttributeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# instantiate the counter at the first call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (counter) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (itertools) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (count) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (name) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg (') Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (-) Tj /F3 10 Tf .733333 .4 .533333 rg (%s) Tj /F4 10 Tf .729412 .129412 .129412 rg (') Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (%) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__name__) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (counter) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (next) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (func_wrapper) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (except) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_failure) Tj 0 0 0 rg (\() Tj 0 0 0 rg (sys) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (exc_info) Tj 0 0 0 rg (\(\)\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_success) Tj 0 0 0 rg (\() Tj 0 0 0 rg (result) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ET +Q +Q +Q +Q +Q + +endstream +endobj +92 0 obj +<< /Length 17364 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 691.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 72 re B* +Q +q +.960784 .960784 .862745 rg +n 72 48.75 42 12 re f* +.960784 .960784 .862745 rg +n 114 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 60 12 re f* +.960784 .960784 .862745 rg +n 186 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 24.75 78 12 re f* +.960784 .960784 .862745 rg +n 210 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 240 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 24.75 72 12 re f* +.960784 .960784 .862745 rg +n 324 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 336 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 360 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 84 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 .75 36 12 re f* +.960784 .960784 .862745 rg +n 90 .75 36 12 re f* +BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (finally) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (on_closing) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (thread) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (threadfactory) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (None) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func_wrapper) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (name) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (thread) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (start) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (thread) 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 .865984 Tw 12 TL /F1 10 Tf 0 0 0 rg (The decorated function returns the current execution thread, which can be stored and checked later, for) Tj T* 0 Tw (instance to verify that the thread ) Tj /F4 10 Tf 0 0 0 rg (.isAlive\(\)) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 617.8236 cm +q +0 0 0 rg +BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .691654 Tw (Here is an example of usage. Suppose one wants to write some data to an external resource which can) Tj T* 0 Tw .21683 Tw (be accessed by a single user at once \(for instance a printer\). Then the access to the writing function must) Tj T* 0 Tw (be locked. Here is a minimalistic example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 464.6236 cm +q +q 1 0 0 1 0 0 cm q 1 0 0 1 6.6 6.6 cm q -.662745 .662745 .662745 RG -.5 w +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 144 re B* +Q +q +.960784 .960784 .862745 rg +n 0 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 120.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 120.75 54 12 re f* +.960784 .960784 .862745 rg +n 126 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 120.75 30 12 re f* +.960784 .960784 .862745 rg +n 162 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 120.75 54 12 re f* +.960784 .960784 .862745 rg +n 222 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 228 120.75 36 12 re f* +.960784 .960784 .862745 rg +n 264 120.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 48 12 re f* +.960784 .960784 .862745 rg +n 78 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 108 96.75 342 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 108 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 48.75 240 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 78 36.75 54 12 re f* +.960784 .960784 .862745 rg +n 132 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 162 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 132 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 24.75 222 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 48 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 192 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 264 12 re f* +BT 1 0 0 1 0 122 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (async) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (decorator) Tj 0 0 0 rg (\() Tj 0 0 0 rg (Async) Tj 0 0 0 rg (\() Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ([]) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# for simplicity the written data are stored into a list.) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@async) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (write) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# append data to the datalist by locking) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Lock) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# emulate some long running operation) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (append) Tj 0 0 0 rg (\() Tj 0 0 0 rg (data) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# other operations not requiring a lock here) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 432.6236 cm +q +BT 1 0 0 1 0 14 Tm .905868 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each call to ) Tj /F4 10 Tf 0 0 0 rg (write ) Tj /F1 10 Tf 0 0 0 rg (will create a new writer thread, but there will be no synchronization problems since) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (write ) Tj /F1 10 Tf 0 0 0 rg (is locked.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 267.4236 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 156 re B* +Q +q +.960784 .960784 .862745 rg +n 0 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 132.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 132.75 42 12 re f* +.960784 .960784 .862745 rg +n 102 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 120.75 36 12 re f* +.960784 .960784 .862745 rg +n 42 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 120.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 120.75 42 12 re f* +.960784 .960784 .862745 rg +n 144 120.75 18 12 re f* +.960784 .960784 .862745 rg +n 162 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 96.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 96.75 342 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 72.75 42 12 re f* +.960784 .960784 .862745 rg +n 102 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 42 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 60.75 42 12 re f* +.960784 .960784 .862745 rg +n 144 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 162 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 36.75 204 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 48 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 42 12 re f* +.960784 .960784 .862745 rg +n 48 .75 6 12 re f* +.960784 .960784 .862745 rg +n 60 .75 42 12 re f* +.960784 .960784 .862745 rg +n 102 .75 6 12 re f* +BT 1 0 0 1 0 134 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data1") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (.) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait a bit, so we are sure data2 is written after data1) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (write) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ("data2") Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj 0 0 0 rg (\() Tj 0 0 0 rg (write) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait for the writers to complete) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (datalist) Tj 0 0 0 rg T* 0 0 0 rg ([) Tj .729412 .129412 .129412 rg ('data1') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('data2') Tj 0 0 0 rg (]) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 234.4236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (contextmanager) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 204.4236 cm +q +BT 1 0 0 1 0 14 Tm 2.685984 Tw 12 TL /F1 10 Tf 0 0 0 rg (For a long time Python had in its standard library a ) Tj /F4 10 Tf 0 0 0 rg (contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator, able to convert) Tj T* 0 Tw (generator functions into ) Tj /F4 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (factories. For instance if you write) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 111.2236 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.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 54 60.75 60 12 re f* +.960784 .960784 .862745 rg +n 120 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 162 60.75 84 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 90 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 72 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 36 12 re f* +.960784 .960784 .862745 rg +n 162 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 204 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 120 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 30 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 84 .75 30 12 re f* +.960784 .960784 .862745 rg +n 114 .75 6 12 re f* +BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (contextlib) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (contextmanager) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@contextmanager) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (before_after) Tj 0 0 0 rg (\() Tj 0 0 0 rg (before) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (after) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (before) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (yield) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 0 0 rg (after) Tj 0 0 0 rg (\)) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 79.22362 cm +q +BT 1 0 0 1 0 14 Tm .150888 Tw 12 TL /F1 10 Tf 0 0 0 rg (then ) Tj /F4 10 Tf 0 0 0 rg (before_after ) Tj /F1 10 Tf 0 0 0 rg (is a factory function returning ) Tj /F4 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects which can be) Tj T* 0 Tw (used with the ) Tj /F4 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (statement:) Tj T* ET +Q +Q + +endstream +endobj +93 0 obj +<< /Length 13803 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 655.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 108 re B* +Q +q +.960784 .960784 .862745 rg +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 84.75 72 12 re f* +.960784 .960784 .862745 rg +n 126 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 84.75 48 12 re f* +.960784 .960784 .862745 rg +n 180 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 192 84.75 42 12 re f* +.960784 .960784 .862745 rg +n 234 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 72.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 42 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 60 12 re f* +.960784 .960784 .862745 rg +n 108 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 60.75 138 12 re f* +.960784 .960784 .862745 rg +n 252 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 258 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 54 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 0 .75 30 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (ba) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (before_after) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ('BEFORE') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('AFTER') Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (type) Tj 0 0 0 rg (\() Tj 0 0 0 rg (ba) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (') Tj /F3 10 Tf 0 0 1 rg (contextlib) Tj /F4 10 Tf .4 .4 .4 rg (.) Tj 0 0 0 rg (GeneratorContextManager) Tj .729412 .129412 .129412 rg (') Tj (>) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (ba) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('hello') Tj 0 0 0 rg T* 0 0 0 rg (BEFORE) Tj 0 0 0 rg T* 0 0 0 rg (hello) Tj 0 0 0 rg T* 0 0 0 rg (AFTER) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 611.8236 cm +q +BT 1 0 0 1 0 26 Tm .462488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Basically, it is as if the content of the ) Tj /F4 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (block was executed in the place of the ) Tj /F4 10 Tf 0 0 0 rg (yield ) Tj /F1 10 Tf 0 0 0 rg (expression in) Tj T* 0 Tw 2.691797 Tw (the generator function. In Python 3.2 ) Tj /F4 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects were enhanced with a) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (__call__ ) Tj /F1 10 Tf 0 0 0 rg (method, so that they can be used as decorators as in this example:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 494.6236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 108 re B* +Q +q .960784 .960784 .862745 rg -n -6 -6 468.6898 144 re B* +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 60.75 42 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 0 .75 30 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@ba) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (hello) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('hello') Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (hello) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg T* 0 0 0 rg (BEFORE) Tj 0 0 0 rg T* 0 0 0 rg (hello) Tj 0 0 0 rg T* 0 0 0 rg (AFTER) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 366.6236 cm +q +BT 1 0 0 1 0 110 Tm .20561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf 0 0 0 rg (ba ) Tj /F1 10 Tf 0 0 0 rg (decorator is basically inserting a ) Tj /F4 10 Tf 0 0 0 rg (with) Tj ( ) Tj (ba: ) Tj /F1 10 Tf 0 0 0 rg (block inside the function. However there two issues:) Tj T* 0 Tw 1.402126 Tw (the first is that ) Tj /F4 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects are callable only in Python 3.2, so the previous) Tj T* 0 Tw .356905 Tw (example will break in older versions of Python; the second is that ) Tj /F4 10 Tf 0 0 0 rg (GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (objects) Tj T* 0 Tw .57561 Tw (do not preserve the signature of the decorated functions: the decorated ) Tj /F4 10 Tf 0 0 0 rg (hello ) Tj /F1 10 Tf 0 0 0 rg (function here will have a) Tj T* 0 Tw 3.990814 Tw (generic signature ) Tj /F4 10 Tf 0 0 0 rg (hello\(*args,) Tj ( ) Tj (**kwargs\) ) Tj /F1 10 Tf 0 0 0 rg (but will break when called with more than zero) Tj T* 0 Tw 7.708314 Tw (arguments. For such reasons the decorator module, starting with release 3.4, offers a) Tj T* 0 Tw .616647 Tw /F4 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator that solves both problems and works even in Python 2.5. The) Tj T* 0 Tw .34998 Tw (usage is the same and factories decorated with ) Tj /F4 10 Tf 0 0 0 rg (decorator.contextmanager ) Tj /F1 10 Tf 0 0 0 rg (will returns instances of) Tj T* 0 Tw 4.152823 Tw /F4 10 Tf 0 0 0 rg (ContextManager) Tj /F1 10 Tf 0 0 0 rg (, a subclass of ) Tj /F4 10 Tf 0 0 0 rg (contextlib.GeneratorContextManager ) Tj /F1 10 Tf 0 0 0 rg (with a ) Tj /F4 10 Tf 0 0 0 rg (__call__) Tj T* 0 Tw /F1 10 Tf 0 0 0 rg (method acting as a signature-preserving decorator.) Tj T* ET +Q Q q -BT 1 0 0 1 0 122 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (async) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (decorator) Tj (\() Tj (Async) Tj (\() Tj (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Thread) Tj (\)\)) Tj T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (datalist) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj ([]) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# for simplicity the written data are stored into a list.) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@async) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (write) Tj 0 0 0 rg (\() Tj (data) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# append data to the datalist by locking) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (threading) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (Lock) Tj (\(\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# emulate some long running operation) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj (datalist) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (append) Tj (\() Tj (data) Tj (\)) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# other operations not requiring a lock here) Tj T* ET +1 0 0 1 62.69291 336.6236 cm +q +BT 1 0 0 1 0 14 Tm 2.756905 Tw 12 TL /F2 10 Tf 0 0 0 rg (Disclaimer) Tj /F1 10 Tf (: the ) Tj /F4 10 Tf 0 0 0 rg (contextmanager ) Tj /F1 10 Tf 0 0 0 rg (decorator is an ) Tj /F5 10 Tf (experimental ) Tj /F1 10 Tf (feature: it may go away in future) Tj T* 0 Tw (versions of the decorator module. Use it at your own risk.) Tj T* ET +Q Q +q +1 0 0 1 62.69291 303.6236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (The ) Tj /F3 17.5 Tf 0 0 0 rg (FunctionMaker ) Tj /F2 17.5 Tf 0 0 0 rg (class) Tj T* ET Q Q +q +1 0 0 1 62.69291 237.6236 cm +q +BT 1 0 0 1 0 50 Tm 2.241412 Tw 12 TL /F1 10 Tf 0 0 0 rg (You may wonder about how the functionality of the ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module is implemented. The basic) Tj T* 0 Tw 1.545868 Tw (building block is a ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (class which is able to generate on the fly functions with a given) Tj T* 0 Tw .047485 Tw (name and signature from a function template passed as a string. Generally speaking, you should not need) Tj T* 0 Tw 1.164983 Tw (to resort to ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (when writing ordinary decorators, but it is handy in some circumstances.) Tj T* 0 Tw (You will see an example shortly, in the implementation of a cool decorator utility \() Tj /F4 10 Tf 0 0 0 rg (decorator_apply) Tj /F1 10 Tf 0 0 0 rg (\).) Tj T* ET Q Q q -1 0 0 1 62.69291 444.6236 cm +1 0 0 1 62.69291 195.6236 cm q -BT 1 0 0 1 0 14 Tm .905868 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each call to ) Tj /F4 10 Tf (write ) Tj /F1 10 Tf (will create a new writer thread, but there will be no synchronization problems since) Tj T* 0 Tw /F4 10 Tf (write ) Tj /F1 10 Tf (is locked.) Tj T* ET +BT 1 0 0 1 0 26 Tm .414597 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (provides a ) Tj /F4 10 Tf 0 0 0 rg (.create ) Tj /F1 10 Tf 0 0 0 rg (classmethod which takes as input the name, signature, and body) Tj T* 0 Tw .632927 Tw (of the function we want to generate as well as the execution environment were the function is generated) Tj T* 0 Tw (by ) Tj /F4 10 Tf 0 0 0 rg (exec) Tj /F1 10 Tf 0 0 0 rg (. Here is an example:) Tj T* ET Q Q q -1 0 0 1 62.69291 279.4236 cm +1 0 0 1 62.69291 102.4236 cm q q 1 0 0 1 0 0 cm @@ -2793,29 +4264,146 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 156 re B* +n -6 -6 468.6898 84 re B* Q q -BT 1 0 0 1 0 134 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (write) Tj (\() Tj .729412 .129412 .129412 rg ("data1") Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj (\() Tj (write) Tj .4 .4 .4 rg (-) Tj (1) Tj 0 0 0 rg (,) Tj ( ) Tj (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (.) Tj (1) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait a bit, so we are sure data2 is written after data1) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (write) Tj (\() Tj .729412 .129412 .129412 rg ("data2") Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (Thread) Tj (\() Tj (write) Tj .4 .4 .4 rg (-) Tj (2) Tj 0 0 0 rg (,) Tj ( ) Tj (started) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg (\)) Tj .4 .4 .4 rg (>) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (time) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (sleep) Tj (\() Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# wait for the writers to complete) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (datalist) Tj T* ([) Tj .729412 .129412 .129412 rg ('data1') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('data2') Tj 0 0 0 rg (]) Tj T* ET +.960784 .960784 .862745 rg +n 0 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 114 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 126 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 144 60.75 222 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 84 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 108 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 78 12 re f* +.960784 .960784 .862745 rg +n 132 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 174 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 240 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 24.75 54 12 re f* +.960784 .960784 .862745 rg +n 306 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 318 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 342 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 348 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 354 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 360 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 366 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 6 12 re f* +.960784 .960784 .862745 rg +n 12 .75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 6 12 re f* +.960784 .960784 .862745 rg +n 30 .75 6 12 re f* +.960784 .960784 .862745 rg +n 42 .75 12 12 re f* +BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 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 ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# a function with a generic signature) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kw) Tj 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj 0 0 0 rg (\() Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\)\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* 0 0 0 rg (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj 0 0 0 rg ( ) Tj 0 0 0 rg ({}) Tj T* ET +Q Q Q Q Q + +endstream +endobj +94 0 obj +<< /Length 13724 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 62.69291 741.0236 cm +q +BT 1 0 0 1 0 14 Tm .226654 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is important to notice that the function body is interpolated before being executed, so be careful with the) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (% ) Tj /F1 10 Tf 0 0 0 rg (sign!) Tj T* ET +Q Q q -1 0 0 1 62.69291 246.4236 cm +1 0 0 1 62.69291 699.0236 cm q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (contextmanager) Tj T* ET +BT 1 0 0 1 0 26 Tm 1.995433 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (also accepts keyword arguments and such arguments are attached to the) Tj T* 0 Tw 1.64686 Tw (resulting function. This is useful if you want to set some function attributes, for instance the docstring) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (__doc__) Tj /F1 10 Tf 0 0 0 rg (.) Tj T* ET Q Q q -1 0 0 1 62.69291 216.4236 cm +1 0 0 1 62.69291 657.0236 cm q -BT 1 0 0 1 0 14 Tm 2.685984 Tw 12 TL /F1 10 Tf 0 0 0 rg (For a long time Python had in its standard library a ) Tj /F4 10 Tf (contextmanager ) Tj /F1 10 Tf (decorator, able to convert) Tj T* 0 Tw (generator functions into ) Tj /F4 10 Tf (GeneratorContextManager ) Tj /F1 10 Tf (factories. For instance if you write) Tj T* ET +BT 1 0 0 1 0 26 Tm .605318 Tw 12 TL /F1 10 Tf 0 0 0 rg (For debugging/introspection purposes it may be useful to see the source code of the generated function;) Tj T* 0 Tw 2.246235 Tw (to do that, just pass the flag ) Tj /F4 10 Tf 0 0 0 rg (addsource=True ) Tj /F1 10 Tf 0 0 0 rg (and a ) Tj /F4 10 Tf 0 0 0 rg (__source__ ) Tj /F1 10 Tf 0 0 0 rg (attribute will be added to the) Tj T* 0 Tw (generated function:) Tj T* ET Q Q q -1 0 0 1 62.69291 123.2236 cm +1 0 0 1 62.69291 563.8236 cm q q 1 0 0 1 0 0 cm @@ -2828,29 +4416,132 @@ q n -6 -6 468.6898 84 re B* Q q -BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (from) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (contextlib) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (import) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (contextmanager) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@contextmanager) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (before_after) Tj 0 0 0 rg (\() Tj (before) Tj (,) Tj ( ) Tj (after) Tj (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg (\() Tj (before) Tj (\)) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (yield) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg (\() Tj (after) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 60.75 78 12 re f* +.960784 .960784 .862745 rg +n 132 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 174 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 48.75 60 12 re f* +.960784 .960784 .862745 rg +n 108 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 48.75 54 12 re f* +.960784 .960784 .862745 rg +n 174 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 186 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 210 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 222 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 228 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 234 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 252 48.75 54 12 re f* +.960784 .960784 .862745 rg +n 306 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 312 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 336 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 36.75 60 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 36 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 54 12 re f* +.960784 .960784 .862745 rg +n 60 .75 6 12 re f* +BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj 0 0 0 rg (\() Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj 0 0 0 rg (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (addsource) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f1) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__source__) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (a) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (b) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET +Q +Q +Q +Q +Q +q +1 0 0 1 62.69291 423.8236 cm +q +BT 1 0 0 1 0 122 Tm .870651 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (can take as first argument a string, as in the examples before, or a function.) Tj T* 0 Tw .224985 Tw (This is the most common usage, since typically you want to decorate a pre-existing function. A framework) Tj T* 0 Tw 1.606136 Tw (author may want to use directly ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (instead of ) Tj /F4 10 Tf 0 0 0 rg (decorator) Tj /F1 10 Tf 0 0 0 rg (, since it gives you) Tj T* 0 Tw 1.36686 Tw (direct access to the body of the generated function. For instance, suppose you want to instrument the) Tj T* 0 Tw .372209 Tw /F4 10 Tf 0 0 0 rg (__init__ ) Tj /F1 10 Tf 0 0 0 rg (methods of a set of classes, by preserving their signature \(such use case is not made up; this) Tj T* 0 Tw .673828 Tw (is done in SQAlchemy and in other frameworks\). When the first argument of ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker.create) Tj T* 0 Tw 3.405814 Tw /F1 10 Tf 0 0 0 rg (is a function, a ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (object is instantiated internally, with attributes ) Tj /F4 10 Tf 0 0 0 rg (args) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (varargs) Tj /F1 10 Tf 0 0 0 rg (,) Tj T* 0 Tw 5.509982 Tw /F4 10 Tf 0 0 0 rg (keywords ) Tj /F1 10 Tf 0 0 0 rg (and ) Tj /F4 10 Tf 0 0 0 rg (defaults ) Tj /F1 10 Tf 0 0 0 rg (which are the the return values of the standard library function) Tj T* 0 Tw .561318 Tw /F4 10 Tf 0 0 0 rg (inspect.getargspec) Tj /F1 10 Tf 0 0 0 rg (. For each argument in the ) Tj /F4 10 Tf 0 0 0 rg (args ) Tj /F1 10 Tf 0 0 0 rg (\(which is a list of strings containing the names) Tj T* 0 Tw 1.599985 Tw (of the mandatory arguments\) an attribute ) Tj /F4 10 Tf 0 0 0 rg (arg0) Tj /F1 10 Tf 0 0 0 rg (, ) Tj /F4 10 Tf 0 0 0 rg (arg1) Tj /F1 10 Tf 0 0 0 rg (, ..., ) Tj /F4 10 Tf 0 0 0 rg (argN ) Tj /F1 10 Tf 0 0 0 rg (is also generated. Finally, there is a) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (signature ) Tj /F1 10 Tf 0 0 0 rg (attribute, a string with the signature of the original function.) Tj T* ET Q Q +q +1 0 0 1 62.69291 345.8236 cm +q +BT 1 0 0 1 0 62 Tm 4.63311 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that while I do not have plans to change or remove the functionality provided in the) Tj T* 0 Tw 1.00936 Tw /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (class, I do not guarantee that it will stay unchanged forever. For instance, right now I) Tj T* 0 Tw .791318 Tw (am using the traditional string interpolation syntax for function templates, but Python 2.6 and Python 3.0) Tj T* 0 Tw .712093 Tw (provide a newer interpolation syntax and I may use the new syntax in the future. On the other hand, the) Tj T* 0 Tw .639985 Tw (functionality provided by ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (has been there from version 0.1 and it is guaranteed to stay there) Tj T* 0 Tw (forever.) Tj T* ET Q Q +q +1 0 0 1 62.69291 312.8236 cm +q +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Getting the source code) Tj T* ET +Q Q q -1 0 0 1 62.69291 91.22362 cm +1 0 0 1 62.69291 234.8236 cm q -BT 1 0 0 1 0 14 Tm .150888 Tw 12 TL /F1 10 Tf 0 0 0 rg (then ) Tj /F4 10 Tf (before_after ) Tj /F1 10 Tf (is a factory function returning ) Tj /F4 10 Tf (GeneratorContextManager ) Tj /F1 10 Tf (objects which can be) Tj T* 0 Tw (used with the ) Tj /F4 10 Tf (with ) Tj /F1 10 Tf (statement:) Tj T* ET +BT 1 0 0 1 0 62 Tm 5.045529 Tw 12 TL /F1 10 Tf 0 0 0 rg (Internally ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf 0 0 0 rg (uses ) Tj /F4 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (to generate the decorated function. Therefore) Tj T* 0 Tw 2.542126 Tw /F4 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (will not work for decorated functions. That means that the usual '??' trick in) Tj T* 0 Tw 26.45775 Tw (IPython will give you the \(right on the spot\) message) Tj T* 0 Tw .261647 Tw /F4 10 Tf 0 0 0 rg (Dynamically) Tj ( ) Tj (generated) Tj ( ) Tj (function.) Tj ( ) Tj (No) Tj ( ) Tj (source) Tj ( ) Tj (code available) Tj /F1 10 Tf 0 0 0 rg (. In the past I have considered) Tj T* 0 Tw .945366 Tw (this acceptable, since ) Tj /F4 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (does not really work even with regular decorators. In that) Tj T* 0 Tw (case ) Tj /F4 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (gives you the wrapper source code which is probably not what you want:) Tj T* ET Q Q - -endstream -endobj -% 'R93': class PDFStream -93 0 obj -% page stream -<< /Length 7180 >> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 655.8236 cm +1 0 0 1 62.69291 165.6236 cm q q 1 0 0 1 0 0 cm @@ -2860,23 +4551,67 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 108 re B* +n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (ba) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (before_after) Tj (\() Tj .729412 .129412 .129412 rg ('BEFORE') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('AFTER') Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (type) Tj 0 0 0 rg (\() Tj (ba) Tj (\)) Tj T* .4 .4 .4 rg (<) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (') Tj /F3 10 Tf 0 0 1 rg (contextlib) Tj /F4 10 Tf .4 .4 .4 rg (.) Tj 0 0 0 rg (GeneratorContextManager) Tj .729412 .129412 .129412 rg (') Tj (>) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (with) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (ba) Tj (:) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('hello') Tj 0 0 0 rg T* (BEFORE) Tj T* (hello) Tj T* (AFTER) Tj T* ET -Q -Q +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 72 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 42 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 162 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 174 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 186 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 42 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (identity_dec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (wrapper) 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 /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (wrapper) Tj T* ET Q Q Q -q -1 0 0 1 62.69291 611.8236 cm -q -BT 1 0 0 1 0 26 Tm .462488 Tw 12 TL /F1 10 Tf 0 0 0 rg (Basically, it is as if the content of the ) Tj /F4 10 Tf (with ) Tj /F1 10 Tf (block was executed in the place of the ) Tj /F4 10 Tf (yield ) Tj /F1 10 Tf (expression in) Tj T* 0 Tw 2.691797 Tw (the generator function. In Python 3.2 ) Tj /F4 10 Tf (GeneratorContextManager ) Tj /F1 10 Tf (objects were enhanced with a) Tj T* 0 Tw /F4 10 Tf (__call__ ) Tj /F1 10 Tf (method, so that they can be used as decorators as in this example:) Tj T* ET Q Q q -1 0 0 1 62.69291 494.6236 cm +1 0 0 1 62.69291 84.42362 cm q q 1 0 0 1 0 0 cm @@ -2886,41 +4621,122 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 108 re B* +n -6 -6 468.6898 72 re B* Q q -BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@ba) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (hello) Tj 0 0 0 rg (\(\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('hello') Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (hello) Tj (\(\)) Tj T* (BEFORE) Tj T* (hello) Tj T* (AFTER) Tj T* ET +.960784 .960784 .862745 rg +n 0 48.75 78 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 66 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 42 12 re f* +.960784 .960784 .862745 rg +n 102 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 12.75 42 12 re f* +.960784 .960784 .862745 rg +n 210 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 42 12 re f* +.960784 .960784 .862745 rg +n 90 .75 6 12 re f* +.960784 .960784 .862745 rg +n 96 .75 6 12 re f* +.960784 .960784 .862745 rg +n 102 .75 24 12 re f* +.960784 .960784 .862745 rg +n 126 .75 6 12 re f* +.960784 .960784 .862745 rg +n 138 .75 12 12 re f* +.960784 .960784 .862745 rg +n 150 .75 12 12 re f* +.960784 .960784 .862745 rg +n 162 .75 12 12 re f* +BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf .666667 .133333 1 rg (@identity_dec) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (example) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (inspect) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (getsource) Tj 0 0 0 rg (\() Tj 0 0 0 rg (example) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (wrapper) 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* ET Q Q Q Q Q + +endstream +endobj +95 0 obj +<< /Length 13714 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 366.6236 cm +1 0 0 1 62.69291 727.8236 cm q -BT 1 0 0 1 0 110 Tm .20561 Tw 12 TL /F1 10 Tf 0 0 0 rg (The ) Tj /F4 10 Tf (ba ) Tj /F1 10 Tf (decorator is basically inserting a ) Tj /F4 10 Tf (with) Tj ( ) Tj (ba: ) Tj /F1 10 Tf (block inside the function. However there two issues:) Tj T* 0 Tw 1.402126 Tw (the first is that ) Tj /F4 10 Tf (GeneratorContextManager ) Tj /F1 10 Tf (objects are callable only in Python 3.2, so the previous) Tj T* 0 Tw .356905 Tw (example will break in older versions of Python; the second is that ) Tj /F4 10 Tf (GeneratorContextManager ) Tj /F1 10 Tf (objects) Tj T* 0 Tw .57561 Tw (do not preserve the signature of the decorated functions: the decorated ) Tj /F4 10 Tf (hello ) Tj /F1 10 Tf (function here will have a) Tj T* 0 Tw 3.990814 Tw (generic signature ) Tj /F4 10 Tf (hello\(*args,) Tj ( ) Tj (**kwargs\) ) Tj /F1 10 Tf (but will break when called with more than zero) Tj T* 0 Tw 7.708314 Tw (arguments. For such reasons the decorator module, starting with release 3.4, offers a) Tj T* 0 Tw .616647 Tw /F4 10 Tf (decorator.contextmanager ) Tj /F1 10 Tf (decorator that solves both problems and works even in Python 2.5. The) Tj T* 0 Tw .34998 Tw (usage is the same and factories decorated with ) Tj /F4 10 Tf (decorator.contextmanager ) Tj /F1 10 Tf (will returns instances of) Tj T* 0 Tw 4.152823 Tw /F4 10 Tf (ContextManager) Tj /F1 10 Tf (, a subclass of ) Tj /F4 10 Tf (contextlib.GeneratorContextManager ) Tj /F1 10 Tf (with a ) Tj /F4 10 Tf (__call__) Tj T* 0 Tw /F1 10 Tf (method acting as a signature-preserving decorator.) Tj T* ET +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 48 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 174 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 186 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 54 12 re f* +.960784 .960784 .862745 rg +n 60 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET Q -q -1 0 0 1 62.69291 333.6236 cm -q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (The ) Tj /F3 17.5 Tf (FunctionMaker ) Tj /F2 17.5 Tf (class) Tj T* ET Q Q -q -1 0 0 1 62.69291 267.6236 cm -q -BT 1 0 0 1 0 50 Tm 2.241412 Tw 12 TL /F1 10 Tf 0 0 0 rg (You may wonder about how the functionality of the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module is implemented. The basic) Tj T* 0 Tw 1.545868 Tw (building block is a ) Tj /F4 10 Tf (FunctionMaker ) Tj /F1 10 Tf (class which is able to generate on the fly functions with a given) Tj T* 0 Tw .047485 Tw (name and signature from a function template passed as a string. Generally speaking, you should not need) Tj T* 0 Tw 1.164983 Tw (to resort to ) Tj /F4 10 Tf (FunctionMaker ) Tj /F1 10 Tf (when writing ordinary decorators, but it is handy in some circumstances.) Tj T* 0 Tw (You will see an example shortly, in the implementation of a cool decorator utility \() Tj /F4 10 Tf (decorator_apply) Tj /F1 10 Tf (\).) Tj T* ET Q Q q -1 0 0 1 62.69291 225.6236 cm +1 0 0 1 62.69291 671.8236 cm q -BT 1 0 0 1 0 26 Tm .414597 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf (provides a ) Tj /F4 10 Tf (.create ) Tj /F1 10 Tf (classmethod which takes as input the name, signature, and body) Tj T* 0 Tw .632927 Tw (of the function we want to generate as well as the execution environment were the function is generated) Tj T* 0 Tw (by ) Tj /F4 10 Tf (exec) Tj /F1 10 Tf (. Here is an example:) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.471235 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(see bug report ) Tj 0 0 .501961 rg (1764286 ) Tj 0 0 0 rg (for an explanation of what is happening\). Unfortunately the bug is still there,) Tj T* 0 Tw 1.541235 Tw (even in Python 2.7 and 3.1. There is however a workaround. The decorator module adds an attribute) Tj T* 0 Tw .103984 Tw /F4 10 Tf 0 0 0 rg (.__wrapped__ ) Tj /F1 10 Tf 0 0 0 rg (to the decorated function, containing a reference to the original function. The easy way to) Tj T* 0 Tw (get the source code is to call ) Tj /F4 10 Tf 0 0 0 rg (inspect.getsource ) Tj /F1 10 Tf 0 0 0 rg (on the undecorated function:) Tj T* ET Q Q q -1 0 0 1 62.69291 132.4236 cm +1 0 0 1 62.69291 554.6236 cm q q 1 0 0 1 0 0 cm @@ -2930,44 +4746,117 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 84 re B* +n -6 -6 468.6898 108 re B* Q q -BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# a function with a generic signature) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (args) Tj (,) Tj ( ) Tj (kw) Tj T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f1) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj (\() Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj (\)\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f1) Tj (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj T* (\() Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (\)) Tj ( ) Tj ({}) Tj T* ET -Q -Q +.960784 .960784 .862745 rg +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 84.75 42 12 re f* +.960784 .960784 .862745 rg +n 102 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 84.75 54 12 re f* +.960784 .960784 .862745 rg +n 162 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 84.75 54 12 re f* +.960784 .960784 .862745 rg +n 222 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 228 84.75 66 12 re f* +.960784 .960784 .862745 rg +n 294 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 90 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 60.75 54 12 re f* +.960784 .960784 .862745 rg +n 78 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 120 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 144 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 66 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 156 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 186 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 54 12 re f* +.960784 .960784 .862745 rg +n 60 .75 6 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (inspect) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (getsource) Tj 0 0 0 rg (\() Tj 0 0 0 rg (factorial) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__wrapped__) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .666667 .133333 1 rg (@tail_recursive) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (factorial) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (acc) Tj .4 .4 .4 rg (=) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("The good old factorial") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (acc) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (factorial) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (acc) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET Q Q Q -q -1 0 0 1 62.69291 100.4236 cm -q -BT 1 0 0 1 0 14 Tm .226654 Tw 12 TL /F1 10 Tf 0 0 0 rg (It is important to notice that the function body is interpolated before being executed, so be careful with the) Tj T* 0 Tw /F4 10 Tf (% ) Tj /F1 10 Tf (sign!) Tj T* ET Q Q - -endstream -endobj -% 'R94': class PDFStream -94 0 obj -% page stream -<< /Length 7802 >> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 729.0236 cm +1 0 0 1 62.69291 521.6236 cm q -BT 1 0 0 1 0 26 Tm 1.995433 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf (also accepts keyword arguments and such arguments are attached to the) Tj T* 0 Tw 1.64686 Tw (resulting function. This is useful if you want to set some function attributes, for instance the docstring) Tj T* 0 Tw /F4 10 Tf (__doc__) Tj /F1 10 Tf (.) Tj T* ET +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Dealing with third party decorators) Tj T* ET Q Q q -1 0 0 1 62.69291 687.0236 cm +1 0 0 1 62.69291 467.6236 cm q -BT 1 0 0 1 0 26 Tm .605318 Tw 12 TL /F1 10 Tf 0 0 0 rg (For debugging/introspection purposes it may be useful to see the source code of the generated function;) Tj T* 0 Tw 2.246235 Tw (to do that, just pass the flag ) Tj /F4 10 Tf (addsource=True ) Tj /F1 10 Tf (and a ) Tj /F4 10 Tf (__source__ ) Tj /F1 10 Tf (attribute will be added to the) Tj T* 0 Tw (generated function:) Tj T* ET +BT 1 0 0 1 0 38 Tm .321654 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes you find on the net some cool decorator that you would like to include in your code. However,) Tj T* 0 Tw .50061 Tw (more often than not the cool decorator is not signature-preserving. Therefore you may want an easy way) Tj T* 0 Tw 1.814597 Tw (to upgrade third party decorators to signature-preserving decorators without having to rewrite them in) Tj T* 0 Tw (terms of ) Tj /F4 10 Tf 0 0 0 rg (decorator) Tj /F1 10 Tf 0 0 0 rg (. You can use a ) Tj /F4 10 Tf 0 0 0 rg (FunctionMaker ) Tj /F1 10 Tf 0 0 0 rg (to implement that functionality as follows:) Tj T* ET Q Q q -1 0 0 1 62.69291 593.8236 cm +1 0 0 1 62.69291 350.4236 cm q q 1 0 0 1 0 0 cm @@ -2977,41 +4866,103 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 84 re B* +n -6 -6 468.6898 108 re B* Q q -BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f1) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj (\() Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('f1\(a, b\)') Tj 0 0 0 rg (,) Tj ( ) Tj .729412 .129412 .129412 rg ('f\(a, b\)') Tj 0 0 0 rg (,) Tj ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj (f) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (f) Tj (\),) Tj ( ) Tj (addsource) Tj .4 .4 .4 rg (=) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f1) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__source__) Tj T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f1) Tj 0 0 0 rg (\() Tj (a) Tj (,) Tj ( ) Tj (b) Tj (\):) Tj T* ( ) Tj (f) Tj (\() Tj (a) Tj (,) Tj ( ) Tj (b) Tj (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET -Q -Q +.960784 .960784 .862745 rg +n 0 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 90 12 re f* +.960784 .960784 .862745 rg +n 114 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 138 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 174 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 378 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 264 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 42 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 78 12 re f* +.960784 .960784 .862745 rg +n 144 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 150 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 186 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 12.75 108 12 re f* +.960784 .960784 .862745 rg +n 192 12.75 78 12 re f* +.960784 .960784 .862745 rg +n 270 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 282 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 54 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 138 .75 18 12 re f* +.960784 .960784 .862745 rg +n 156 .75 6 12 re f* +.960784 .960784 .862745 rg +n 162 .75 24 12 re f* +.960784 .960784 .862745 rg +n 186 .75 18 12 re f* +.960784 .960784 .862745 rg +n 210 .75 66 12 re f* +.960784 .960784 .862745 rg +n 276 .75 6 12 re f* +.960784 .960784 .862745 rg +n 282 .75 24 12 re f* +.960784 .960784 .862745 rg +n 306 .75 6 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (decorator_apply) Tj 0 0 0 rg (\() Tj 0 0 0 rg (dec) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( Decorate a function by preserving the signature even if dec) Tj T* ( is not a signature-preserving decorator.) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj 0 0 0 rg (\() Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .729412 .129412 .129412 rg ('return decorated\() Tj /F3 10 Tf .733333 .4 .533333 rg (%\(signature\)s) Tj /F4 10 Tf .729412 .129412 .129412 rg (\)') Tj 0 0 0 rg (,) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj 0 0 0 rg (decorated) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (dec) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj 0 0 0 rg (\)\),) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (__wrapped__) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q -q -1 0 0 1 62.69291 453.8236 cm -q -BT 1 0 0 1 0 122 Tm .870651 Tw 12 TL /F4 10 Tf 0 0 0 rg (FunctionMaker.create ) Tj /F1 10 Tf (can take as first argument a string, as in the examples before, or a function.) Tj T* 0 Tw .224985 Tw (This is the most common usage, since typically you want to decorate a pre-existing function. A framework) Tj T* 0 Tw 1.606136 Tw (author may want to use directly ) Tj /F4 10 Tf (FunctionMaker.create ) Tj /F1 10 Tf (instead of ) Tj /F4 10 Tf (decorator) Tj /F1 10 Tf (, since it gives you) Tj T* 0 Tw 1.36686 Tw (direct access to the body of the generated function. For instance, suppose you want to instrument the) Tj T* 0 Tw .372209 Tw /F4 10 Tf (__init__ ) Tj /F1 10 Tf (methods of a set of classes, by preserving their signature \(such use case is not made up; this) Tj T* 0 Tw .673828 Tw (is done in SQAlchemy and in other frameworks\). When the first argument of ) Tj /F4 10 Tf (FunctionMaker.create) Tj T* 0 Tw 3.405814 Tw /F1 10 Tf (is a function, a ) Tj /F4 10 Tf (FunctionMaker ) Tj /F1 10 Tf (object is instantiated internally, with attributes ) Tj /F4 10 Tf (args) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (varargs) Tj /F1 10 Tf (,) Tj T* 0 Tw 5.509982 Tw /F4 10 Tf (keywords ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (defaults ) Tj /F1 10 Tf (which are the the return values of the standard library function) Tj T* 0 Tw .561318 Tw /F4 10 Tf (inspect.getargspec) Tj /F1 10 Tf (. For each argument in the ) Tj /F4 10 Tf (args ) Tj /F1 10 Tf (\(which is a list of strings containing the names) Tj T* 0 Tw 1.599985 Tw (of the mandatory arguments\) an attribute ) Tj /F4 10 Tf (arg0) Tj /F1 10 Tf (, ) Tj /F4 10 Tf (arg1) Tj /F1 10 Tf (, ..., ) Tj /F4 10 Tf (argN ) Tj /F1 10 Tf (is also generated. Finally, there is a) Tj T* 0 Tw /F4 10 Tf (signature ) Tj /F1 10 Tf (attribute, a string with the signature of the original function.) Tj T* ET Q Q q -1 0 0 1 62.69291 375.8236 cm +1 0 0 1 62.69291 318.4236 cm q -BT 1 0 0 1 0 62 Tm 4.63311 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that while I do not have plans to change or remove the functionality provided in the) Tj T* 0 Tw 1.00936 Tw /F4 10 Tf (FunctionMaker ) Tj /F1 10 Tf (class, I do not guarantee that it will stay unchanged forever. For instance, right now I) Tj T* 0 Tw .791318 Tw (am using the traditional string interpolation syntax for function templates, but Python 2.6 and Python 3.0) Tj T* 0 Tw .712093 Tw (provide a newer interpolation syntax and I may use the new syntax in the future. On the other hand, the) Tj T* 0 Tw .639985 Tw (functionality provided by ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (has been there from version 0.1 and it is guaranteed to stay there) Tj T* 0 Tw (forever.) Tj T* ET +BT 1 0 0 1 0 14 Tm .698314 Tw 12 TL /F4 10 Tf 0 0 0 rg (decorator_apply ) Tj /F1 10 Tf 0 0 0 rg (sets the attribute ) Tj /F4 10 Tf 0 0 0 rg (.__wrapped__ ) Tj /F1 10 Tf 0 0 0 rg (of the generated function to the original function,) Tj T* 0 Tw (so that you can get the right source code.) Tj T* ET Q Q q -1 0 0 1 62.69291 342.8236 cm +1 0 0 1 62.69291 276.4236 cm q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Getting the source code) Tj T* ET +BT 1 0 0 1 0 26 Tm .13104 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that I am not providing this functionality in the ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module directly since I think it is best to) Tj T* 0 Tw 2.070751 Tw (rewrite the decorator rather than adding an additional level of indirection. However, practicality beats) Tj T* 0 Tw (purity, so you can add ) Tj /F4 10 Tf 0 0 0 rg (decorator_apply ) Tj /F1 10 Tf 0 0 0 rg (to your toolbox and use it if you need to.) Tj T* ET Q Q q -1 0 0 1 62.69291 264.8236 cm +1 0 0 1 62.69291 222.4236 cm q -BT 1 0 0 1 0 62 Tm 5.045529 Tw 12 TL /F1 10 Tf 0 0 0 rg (Internally ) Tj /F4 10 Tf (FunctionMaker.create ) Tj /F1 10 Tf (uses ) Tj /F4 10 Tf (exec ) Tj /F1 10 Tf (to generate the decorated function. Therefore) Tj T* 0 Tw 2.542126 Tw /F4 10 Tf (inspect.getsource ) Tj /F1 10 Tf (will not work for decorated functions. That means that the usual '??' trick in) Tj T* 0 Tw 26.45775 Tw (IPython will give you the \(right on the spot\) message) Tj T* 0 Tw .261647 Tw /F4 10 Tf (Dynamically) Tj ( ) Tj (generated) Tj ( ) Tj (function.) Tj ( ) Tj (No) Tj ( ) Tj (source) Tj ( ) Tj (code available) Tj /F1 10 Tf (. In the past I have considered) Tj T* 0 Tw .945366 Tw (this acceptable, since ) Tj /F4 10 Tf (inspect.getsource ) Tj /F1 10 Tf (does not really work even with regular decorators. In that) Tj T* 0 Tw (case ) Tj /F4 10 Tf (inspect.getsource ) Tj /F1 10 Tf (gives you the wrapper source code which is probably not what you want:) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.74881 Tw 12 TL /F1 10 Tf 0 0 0 rg (In order to give an example of usage of ) Tj /F4 10 Tf 0 0 0 rg (decorator_apply) Tj /F1 10 Tf 0 0 0 rg (, I will show a pretty slick decorator that) Tj T* 0 Tw 1.276651 Tw (converts a tail-recursive function in an iterative function. I have shamelessly stolen the basic idea from) Tj T* 0 Tw 43.62829 Tw (Kay Schluehr's recipe in the Python Cookbook,) Tj T* 0 Tw 0 0 .501961 rg (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj 0 0 0 rg (.) Tj T* ET Q Q q -1 0 0 1 62.69291 195.6236 cm +1 0 0 1 62.69291 81.22362 cm q q 1 0 0 1 0 0 cm @@ -3021,30 +4972,64 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 60 re B* -Q -q -BT 1 0 0 1 0 38 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (identity_dec) Tj 0 0 0 rg (\() Tj (func) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (wrapper) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (wrapper) Tj T* ET -Q -Q -Q -Q +n -6 -6 468.6898 132 re B* Q q -1 0 0 1 62.69291 90.42362 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 96 re B* -Q -q -BT 1 0 0 1 0 74 Tm 12 TL /F4 10 Tf .666667 .133333 1 rg (@identity_dec) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (example) Tj 0 0 0 rg (\(\):) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (inspect) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (getsource) Tj (\() Tj (example) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (wrapper) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET +n 0 108.75 30 12 re f* +.960784 .960784 .862745 rg +n 36 108.75 78 12 re f* +.960784 .960784 .862745 rg +n 114 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 108.75 36 12 re f* +.960784 .960784 .862745 rg +n 156 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 84.75 354 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 396 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 276 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 42 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 48 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 162 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 108 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 .75 24 12 re f* +.960784 .960784 .862745 rg +n 72 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 54 12 re f* +.960784 .960784 .862745 rg +n 138 .75 6 12 re f* +.960784 .960784 .862745 rg +n 150 .75 24 12 re f* +BT 1 0 0 1 0 110 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (TailRecursive) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( tail_recursive decorator based on Kay Schluehr's recipe) Tj T* ( http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj T* ( with improvements by me and George Sakkis.) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ET Q Q Q @@ -3053,20 +5038,12 @@ Q endstream endobj -% 'R95': class PDFStream -95 0 obj -% page stream -<< /Length 7279 >> +96 0 obj +<< /Length 16920 >> 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 -q -BT 1 0 0 1 0 38 Tm 1.471235 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(see bug report ) Tj 0 0 .501961 rg (1764286 ) Tj 0 0 0 rg (for an explanation of what is happening\). Unfortunately the bug is still there,) Tj T* 0 Tw 1.541235 Tw (even in Python 2.7 and 3.1. There is however a workaround. The decorator module adds an attribute) Tj T* 0 Tw .103984 Tw /F4 10 Tf (.__wrapped__ ) Tj /F1 10 Tf (to the decorated function, containing a reference to the original function. The easy way to) Tj T* 0 Tw (get the source code is to call ) Tj /F4 10 Tf (inspect.getsource ) Tj /F1 10 Tf (on the undecorated function:) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 611.8236 cm +1 0 0 1 62.69291 523.8236 cm q q 1 0 0 1 0 0 cm @@ -3076,123 +5053,204 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 96 re B* -Q -q -BT 1 0 0 1 0 74 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (inspect) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (getsource) Tj (\() Tj (factorial) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (__wrapped__) Tj (\)) Tj T* .666667 .133333 1 rg (@tail_recursive) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (factorial) Tj 0 0 0 rg (\() Tj (n) Tj (,) Tj ( ) Tj (acc) Tj .4 .4 .4 rg (=) Tj (1) Tj 0 0 0 rg (\):) Tj T* ( ) Tj .729412 .129412 .129412 rg ("The good old factorial") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (n) Tj ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (acc) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (factorial) Tj (\() Tj (n) Tj .4 .4 .4 rg (-) Tj (1) Tj 0 0 0 rg (,) Tj ( ) Tj (n) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (acc) Tj (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (BLANKLINE) Tj .4 .4 .4 rg (>) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 578.8236 cm -q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Dealing with third party decorators) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 524.8236 cm -q -BT 1 0 0 1 0 38 Tm .321654 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sometimes you find on the net some cool decorator that you would like to include in your code. However,) Tj T* 0 Tw .50061 Tw (more often than not the cool decorator is not signature-preserving. Therefore you may want an easy way) Tj T* 0 Tw 1.814597 Tw (to upgrade third party decorators to signature-preserving decorators without having to rewrite them in) Tj T* 0 Tw (terms of ) Tj /F4 10 Tf (decorator) Tj /F1 10 Tf (. You can use a ) Tj /F4 10 Tf (FunctionMaker ) Tj /F1 10 Tf (to implement that functionality as follows:) Tj T* ET -Q +n -6 -6 468.6898 240 re B* Q q -1 0 0 1 62.69291 407.6236 cm -q -q -1 0 0 1 0 0 cm -q -1 0 0 1 6.6 6.6 cm -q -.662745 .662745 .662745 RG -.5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 108 re B* -Q -q -BT 1 0 0 1 0 86 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (decorator_apply) Tj 0 0 0 rg (\() Tj (dec) Tj (,) Tj ( ) Tj (func) Tj (\):) Tj T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( Decorate a function by preserving the signature even if dec) Tj T* ( is not a signature-preserving decorator.) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (FunctionMaker) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (create) Tj (\() Tj T* ( ) Tj (func) Tj (,) Tj ( ) Tj .729412 .129412 .129412 rg ('return decorated\() Tj /F3 10 Tf .733333 .4 .533333 rg (%\(signature\)s) Tj /F4 10 Tf .729412 .129412 .129412 rg (\)') Tj 0 0 0 rg (,) Tj T* ( ) Tj 0 .501961 0 rg (dict) Tj 0 0 0 rg (\() Tj (decorated) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (dec) Tj (\() Tj (func) Tj (\)\),) Tj ( ) Tj (__wrapped__) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg (func) Tj (\)) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 375.6236 cm -q -BT 1 0 0 1 0 14 Tm .698314 Tw 12 TL /F4 10 Tf 0 0 0 rg (decorator_apply ) Tj /F1 10 Tf (sets the attribute ) Tj /F4 10 Tf (.__wrapped__ ) Tj /F1 10 Tf (of the generated function to the original function,) Tj T* 0 Tw (so that you can get the right source code.) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 333.6236 cm -q -BT 1 0 0 1 0 26 Tm .13104 Tw 12 TL /F1 10 Tf 0 0 0 rg (Notice that I am not providing this functionality in the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module directly since I think it is best to) Tj T* 0 Tw 2.070751 Tw (rewrite the decorator rather than adding an additional level of indirection. However, practicality beats) Tj T* 0 Tw (purity, so you can add ) Tj /F4 10 Tf (decorator_apply ) Tj /F1 10 Tf (to your toolbox and use it if you need to.) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 279.6236 cm -q -BT 1 0 0 1 0 38 Tm 1.74881 Tw 12 TL /F1 10 Tf 0 0 0 rg (In order to give an example of usage of ) Tj /F4 10 Tf (decorator_apply) Tj /F1 10 Tf (, I will show a pretty slick decorator that) Tj T* 0 Tw 1.276651 Tw (converts a tail-recursive function in an iterative function. I have shamelessly stolen the basic idea from) Tj T* 0 Tw 43.62829 Tw (Kay Schluehr's recipe in the Python Cookbook,) Tj T* 0 Tw 0 0 .501961 rg (http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj 0 0 0 rg (.) Tj T* ET -Q -Q -q -1 0 0 1 62.69291 78.42362 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 48 216.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 216.75 48 12 re f* +.960784 .960784 .862745 rg +n 132 216.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 216.75 36 12 re f* +.960784 .960784 .862745 rg +n 180 216.75 12 12 re f* +.960784 .960784 .862745 rg +n 204 216.75 60 12 re f* +.960784 .960784 .862745 rg +n 24 192.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 192.75 48 12 re f* +.960784 .960784 .862745 rg +n 96 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 192.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 192.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 192.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 192.75 12 12 re f* +.960784 .960784 .862745 rg +n 192 192.75 18 12 re f* +.960784 .960784 .862745 rg +n 210 192.75 12 12 re f* +.960784 .960784 .862745 rg +n 48 180.75 48 12 re f* +.960784 .960784 .862745 rg +n 102 180.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 180.75 24 12 re f* +.960784 .960784 .862745 rg +n 138 180.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 180.75 48 12 re f* +.960784 .960784 .862745 rg +n 48 168.75 12 12 re f* +.960784 .960784 .862745 rg +n 66 168.75 24 12 re f* +.960784 .960784 .862745 rg +n 90 168.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 168.75 54 12 re f* +.960784 .960784 .862745 rg +n 150 168.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 102 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 138 156.75 6 12 re f* +.960784 .960784 .862745 rg +n 144 156.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 144.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 144.75 54 12 re f* +.960784 .960784 .862745 rg +n 162 144.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 144.75 30 12 re f* +.960784 .960784 .862745 rg +n 72 132.75 18 12 re f* +.960784 .960784 .862745 rg +n 90 132.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 120.75 30 12 re f* +.960784 .960784 .862745 rg +n 132 120.75 24 12 re f* +.960784 .960784 .862745 rg +n 156 120.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 108.75 36 12 re f* +.960784 .960784 .862745 rg +n 162 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 174 108.75 24 12 re f* +.960784 .960784 .862745 rg +n 198 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 210 108.75 24 12 re f* +.960784 .960784 .862745 rg +n 234 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 246 108.75 12 12 re f* +.960784 .960784 .862745 rg +n 258 108.75 18 12 re f* +.960784 .960784 .862745 rg +n 276 108.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 138 96.75 36 12 re f* +.960784 .960784 .862745 rg +n 180 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 198 96.75 48 12 re f* +.960784 .960784 .862745 rg +n 246 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 264 96.75 108 12 re f* +.960784 .960784 .862745 rg +n 144 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 84.75 18 12 re f* +.960784 .960784 .862745 rg +n 204 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 240 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 246 84.75 42 12 re f* +.960784 .960784 .862745 rg +n 120 72.75 24 12 re f* .960784 .960784 .862745 rg -n -6 -6 468.6898 192 re B* -Q -q -BT 1 0 0 1 0 170 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (TailRecursive) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj T* ( ) Tj /F6 10 Tf .729412 .129412 .129412 rg (""") Tj T* ( tail_recursive decorator based on Kay Schluehr's recipe) Tj T* ( http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/496691) Tj T* ( with improvements by me and George Sakkis.) Tj T* ( """) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__init__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj ( ) Tj (func) Tj (\):) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\(\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# sentinel) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj (\):) Tj T* ( ) Tj (CONTINUE) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj (:) Tj T* ET -Q -Q -Q -Q -Q - -endstream -endobj -% 'R96': class PDFStream -96 0 obj -% page stream -<< /Length 7146 >> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 62.69291 583.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 144 72.75 6 12 re f* .960784 .960784 .862745 rg -n -6 -6 468.6898 180 re B* -Q -q -BT 1 0 0 1 0 158 Tm 12 TL /F4 10 Tf 0 0 0 rg ( ) Tj (func) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (False) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (while) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (:) Tj T* ( ) Tj (result) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (func) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj (\)) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (result) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (is) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (CONTINUE) Tj (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# update arguments) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj (args) Tj (,) Tj ( ) Tj (kwd) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# last call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (result) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (finally) Tj /F4 10 Tf 0 0 0 rg (:) Tj T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# return the arguments of the tail call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (args) Tj (,) Tj ( ) Tj (kwd) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (CONTINUE) Tj T* ET +n 162 72.75 66 12 re f* +.960784 .960784 .862745 rg +n 144 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 186 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 42 12 re f* +.960784 .960784 .862745 rg +n 114 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 120 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 54 12 re f* +.960784 .960784 .862745 rg +n 186 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 24.75 234 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 12.75 42 12 re f* +.960784 .960784 .862745 rg +n 150 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 162 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 186 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 72 .75 36 12 re f* +.960784 .960784 .862745 rg +n 114 .75 48 12 re f* +BT 1 0 0 1 0 218 Tm 12 TL /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\(\)) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# sentinel) Tj /F4 10 Tf 0 0 0 rg T* T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (__call__) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (func) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (False) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (try) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (while) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (is) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# update arguments) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# last call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (result) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (finally) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (firstcall) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 .501961 0 rg (True) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (else) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# return the arguments of the tail call) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj 0 .501961 0 rg (self) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (argskwd) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (args) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (kwd) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (CONTINUE) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 563.8236 cm +1 0 0 1 62.69291 503.8236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here the decorator is implemented as a class returning callable objects.) Tj T* ET Q Q q -1 0 0 1 62.69291 518.6236 cm +1 0 0 1 62.69291 458.6236 cm q q 1 0 0 1 0 0 cm @@ -3205,21 +5263,45 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (tail_recursive) Tj 0 0 0 rg (\() Tj (func) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (decorator_apply) Tj (\() Tj (TailRecursive) Tj (,) Tj ( ) Tj (func) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 84 12 re f* +.960784 .960784 .862745 rg +n 108 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 138 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 90 12 re f* +.960784 .960784 .862745 rg +n 156 .75 6 12 re f* +.960784 .960784 .862745 rg +n 162 .75 78 12 re f* +.960784 .960784 .862745 rg +n 240 .75 6 12 re f* +.960784 .960784 .862745 rg +n 252 .75 24 12 re f* +.960784 .960784 .862745 rg +n 276 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (tail_recursive) Tj 0 0 0 rg (\() Tj 0 0 0 rg (func) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (decorator_apply) Tj 0 0 0 rg (\() Tj 0 0 0 rg (TailRecursive) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (func) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 498.6236 cm +1 0 0 1 62.69291 438.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is how you apply the upgraded decorator to the good old factorial:) Tj T* ET Q Q q -1 0 0 1 62.69291 417.4236 cm +1 0 0 1 62.69291 345.4236 cm q q 1 0 0 1 0 0 cm @@ -3229,17 +5311,75 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 72 re B* +n -6 -6 468.6898 84 re B* Q q -BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf .666667 .133333 1 rg (@tail_recursive) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (factorial) Tj 0 0 0 rg (\() Tj (n) Tj (,) Tj ( ) Tj (acc) Tj .4 .4 .4 rg (=) Tj (1) Tj 0 0 0 rg (\):) Tj T* ( ) Tj .729412 .129412 .129412 rg ("The good old factorial") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (n) Tj ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (acc) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (factorial) Tj (\() Tj (n) Tj .4 .4 .4 rg (-) Tj (1) Tj 0 0 0 rg (,) Tj ( ) Tj (n) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (acc) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 60.75 90 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 54 12 re f* +.960784 .960784 .862745 rg +n 78 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 120 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 144 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 54 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 6 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 138 .75 6 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +.960784 .960784 .862745 rg +n 156 .75 6 12 re f* +.960784 .960784 .862745 rg +n 162 .75 6 12 re f* +.960784 .960784 .862745 rg +n 168 .75 18 12 re f* +.960784 .960784 .862745 rg +n 186 .75 6 12 re f* +BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf .666667 .133333 1 rg (@tail_recursive) Tj 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (factorial) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (acc) Tj .4 .4 .4 rg (=) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj .729412 .129412 .129412 rg ("The good old factorial") Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (acc) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (factorial) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (acc) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 372.2236 cm +1 0 0 1 62.69291 300.2236 cm q q 1 0 0 1 0 0 cm @@ -3252,20 +5392,38 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (factorial) Tj (\() Tj .4 .4 .4 rg (4) Tj 0 0 0 rg (\)) Tj T* .4 .4 .4 rg (24) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 54 12 re f* +.960784 .960784 .862745 rg +n 114 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 12 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (factorial) Tj 0 0 0 rg (\() Tj .4 .4 .4 rg (4) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (24) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 316.2236 cm +1 0 0 1 62.69291 244.2236 cm q -BT 1 0 0 1 0 38 Tm .188935 Tw 12 TL /F1 10 Tf 0 0 0 rg (This decorator is pretty impressive, and should give you some food for your mind ;\) Notice that there is no) Tj T* 0 Tw 1.339983 Tw (recursion limit now, and you can easily compute ) Tj /F4 10 Tf (factorial\(1001\) ) Tj /F1 10 Tf (or larger without filling the stack) Tj T* 0 Tw .909431 Tw (frame. Notice also that the decorator will not work on functions which are not tail recursive, such as the) Tj T* 0 Tw (following) Tj T* ET +BT 1 0 0 1 0 38 Tm .188935 Tw 12 TL /F1 10 Tf 0 0 0 rg (This decorator is pretty impressive, and should give you some food for your mind ;\) Notice that there is no) Tj T* 0 Tw 1.339983 Tw (recursion limit now, and you can easily compute ) Tj /F4 10 Tf 0 0 0 rg (factorial\(1001\) ) Tj /F1 10 Tf 0 0 0 rg (or larger without filling the stack) Tj T* 0 Tw .909431 Tw (frame. Notice also that the decorator will not work on functions which are not tail recursive, such as the) Tj T* 0 Tw (following) Tj T* ET Q Q q -1 0 0 1 62.69291 259.0236 cm +1 0 0 1 62.69291 175.0236 cm q q 1 0 0 1 0 0 cm @@ -3275,37 +5433,88 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 48 re B* +n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 26 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (fact) Tj 0 0 0 rg (\() Tj (n) Tj (\):) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# this is not tail-recursive) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (n) Tj ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (n) Tj ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg ( ) Tj (fact) Tj (\() Tj (n) Tj .4 .4 .4 rg (-) Tj (1) Tj 0 0 0 rg (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 48 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 84 36.75 168 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 42 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 90 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 6 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 90 .75 24 12 re f* +.960784 .960784 .862745 rg +n 114 .75 6 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 6 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 138 .75 6 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (fact) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# this is not tail-recursive) Tj /F4 10 Tf 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (if) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (==) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (:) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (n) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (*) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (fact) Tj 0 0 0 rg (\() Tj 0 0 0 rg (n) Tj .4 .4 .4 rg (-) Tj .4 .4 .4 rg (1) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 227.0236 cm +1 0 0 1 62.69291 143.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .541098 Tw (\(reminder: a function is tail recursive if it either returns a value without making a recursive call, or returns) Tj T* 0 Tw (directly the result of a recursive call\).) Tj T* ET Q Q q -1 0 0 1 62.69291 194.0236 cm +1 0 0 1 62.69291 110.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 164.0236 cm +1 0 0 1 62.69291 80.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 +97 0 obj +<< /Length 10417 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 82.82362 cm +1 0 0 1 62.69291 547.8236 cm q q 1 0 0 1 0 0 cm @@ -3315,27 +5524,24 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 72 re B* +n -6 -6 468.6898 216 re B* Q q 0 0 0 rg -BT 1 0 0 1 0 50 Tm /F4 10 Tf 12 TL ($ cat performance.sh) Tj T* (python -m timeit -s ") Tj T* (from decorator import decorator) Tj T* T* (@decorator) Tj T* ET +BT 1 0 0 1 0 194 Tm /F4 10 Tf 12 TL ($ cat performance.sh) Tj T* (python -m timeit -s ") Tj T* (from decorator import decorator) Tj T* T* (@decorator) Tj T* (def do_nothing\(func, *args, **kw\):) Tj T* ( return func\(*args, **kw\)) Tj T* T* (@do_nothing) Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* T* (python -m timeit -s ") Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* ET Q Q Q Q Q - -endstream -endobj -% 'R97': class PDFStream -97 0 obj -% page stream -<< /Length 6291 >> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 607.8236 cm +1 0 0 1 62.69291 515.8236 cm +q +BT 1 0 0 1 0 14 Tm .266235 Tw 12 TL /F1 10 Tf 0 0 0 rg (On my MacBook, using the ) Tj /F4 10 Tf 0 0 0 rg (do_nothing ) Tj /F1 10 Tf 0 0 0 rg (decorator instead of the plain function is more than three times) Tj T* 0 Tw (slower:) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 458.6236 cm q q 1 0 0 1 0 0 cm @@ -3345,24 +5551,31 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 156 re B* +n -6 -6 468.6898 48 re B* Q q 0 0 0 rg -BT 1 0 0 1 0 134 Tm /F4 10 Tf 12 TL (def do_nothing\(func, *args, **kw\):) Tj T* ( return func\(*args, **kw\)) Tj T* T* (@do_nothing) Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* T* (python -m timeit -s ") Tj T* (def f\(\):) Tj T* ( pass) Tj T* (" "f\(\)") Tj T* ET +BT 1 0 0 1 0 26 Tm /F4 10 Tf 12 TL ($ bash performance.sh) Tj T* (1000000 loops, best of 3: 0.995 usec per loop) Tj T* (1000000 loops, best of 3: 0.273 usec per loop) Tj T* ET +Q +Q Q Q Q +q +1 0 0 1 62.69291 414.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 /F4 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 575.8236 cm +1 0 0 1 62.69291 384.6236 cm q -BT 1 0 0 1 0 14 Tm .266235 Tw 12 TL /F1 10 Tf 0 0 0 rg (On my MacBook, using the ) Tj /F4 10 Tf (do_nothing ) Tj /F1 10 Tf (decorator instead of the plain function is more than three times) Tj T* 0 Tw (slower:) Tj T* ET +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 518.6236 cm +1 0 0 1 62.69291 327.4236 cm q q 1 0 0 1 0 0 cm @@ -3375,28 +5588,44 @@ q n -6 -6 468.6898 48 re B* Q q -0 0 0 rg -BT 1 0 0 1 0 26 Tm /F4 10 Tf 12 TL ($ bash performance.sh) Tj T* (1000000 loops, best of 3: 0.995 usec per loop) Tj T* (1000000 loops, best of 3: 0.273 usec per loop) Tj T* ET -Q -Q +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 48 .75 6 12 re f* +.960784 .960784 .862745 rg +n 54 .75 6 12 re f* +.960784 .960784 .862745 rg +n 60 .75 6 12 re f* +BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj .4 .4 .4 rg (/) Tj .4 .4 .4 rg (0) Tj T* ET Q Q Q -q -1 0 0 1 62.69291 474.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 /F4 10 Tf (f ) Tj /F1 10 Tf (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 444.6236 cm +1 0 0 1 62.69291 295.4236 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 +BT 1 0 0 1 0 14 Tm .583318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Calling ) Tj /F4 10 Tf 0 0 0 rg (f\(\) ) Tj /F1 10 Tf 0 0 0 rg (will give you a ) Tj /F4 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 387.4236 cm +1 0 0 1 62.69291 166.2236 cm q q 1 0 0 1 0 0 cm @@ -3406,70 +5635,180 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 48 re B* -Q -q -BT 1 0 0 1 0 26 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (1) Tj (/) Tj (0) Tj T* ET -Q -Q -Q -Q -Q -q -1 0 0 1 62.69291 355.4236 cm -q -BT 1 0 0 1 0 14 Tm .583318 Tw 12 TL /F1 10 Tf 0 0 0 rg (Calling ) Tj /F4 10 Tf (f\(\) ) Tj /F1 10 Tf (will give you a ) Tj /F4 10 Tf (ZeroDivisionError) Tj /F1 10 Tf (, 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 226.2236 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 -6 -6 468.6898 120 re B* +Q +q +.960784 .960784 .862745 rg +n 0 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 96.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 96.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 84.75 54 12 re f* +.960784 .960784 .862745 rg +n 60 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 84.75 36 12 re f* +.960784 .960784 .862745 rg +n 138 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 84.75 24 12 re f* +.960784 .960784 .862745 rg +n 192 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 12 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 30 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 60 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 60.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 114 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 120 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 132 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 162 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 168 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 180 60.75 12 12 re f* +.960784 .960784 .862745 rg +n 198 60.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 60 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 120 12 re f* +.960784 .960784 .862745 rg +n 192 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 216 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 246 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 264 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 282 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 42 36.75 36 12 re f* +.960784 .960784 .862745 rg +n 84 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 90 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 126 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 138 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 150 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 162 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 120 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 198 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 204 24.75 6 12 re f* .960784 .960784 .862745 rg -n -6 -6 468.6898 120 re B* -Q -q -BT 1 0 0 1 0 98 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f) Tj (\(\)) Tj T* (Traceback) Tj ( ) Tj (\() Tj (most) Tj ( ) Tj (recent) Tj ( ) Tj (call) Tj ( ) Tj (last) Tj (\):) Tj T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* ( ) Tj (File) Tj ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (string) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj ( ) Tj (line) Tj ( ) Tj .4 .4 .4 rg (2) Tj 0 0 0 rg (,) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj T* ( ) Tj (File) Tj ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[18]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj ( ) Tj (line) Tj ( ) Tj .4 .4 .4 rg (4) Tj 0 0 0 rg (,) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (trace) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj (\() Tj .4 .4 .4 rg (*) Tj 0 0 0 rg (args) Tj (,) Tj ( ) Tj .4 .4 .4 rg (**) Tj 0 0 0 rg (kw) Tj (\)) Tj T* ( ) Tj (File) Tj ( ) Tj .729412 .129412 .129412 rg (") Tj (<) Tj (doctest __main__[47]) Tj (>) Tj (") Tj 0 0 0 rg (,) Tj ( ) Tj (line) Tj ( ) Tj .4 .4 .4 rg (3) Tj 0 0 0 rg (,) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj T* ( ) Tj .4 .4 .4 rg (1) Tj (/) Tj (0) Tj 0 0 0 rg T* /F3 10 Tf .823529 .254902 .227451 rg (ZeroDivisionError) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj (integer) Tj ( ) Tj (division) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (or) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (modulo) Tj ( ) Tj (by) Tj ( ) Tj (zero) Tj T* ET -Q -Q +n 216 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 246 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 252 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 264 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 282 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 42 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 48 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 102 12 re f* +.960784 .960784 .862745 rg +n 102 .75 6 12 re f* +.960784 .960784 .862745 rg +n 114 .75 42 12 re f* +.960784 .960784 .862745 rg +n 162 .75 48 12 re f* +.960784 .960784 .862745 rg +n 216 .75 12 12 re f* +.960784 .960784 .862745 rg +n 234 .75 36 12 re f* +.960784 .960784 .862745 rg +n 276 .75 12 12 re f* +.960784 .960784 .862745 rg +n 294 .75 24 12 re f* +BT 1 0 0 1 0 98 Tm 12 TL /F4 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 /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 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__[18]) 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 /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 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__[47]) 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 /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 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* /F3 10 Tf .823529 .254902 .227451 rg (ZeroDivisionError) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (integer) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (division) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (or) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (modulo) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (by) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (zero) Tj T* ET Q Q Q -q -1 0 0 1 62.69291 158.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 /F4 10 Tf (trace) Tj /F1 10 Tf (, which calls ) Tj /F4 10 Tf (f\(*args,) Tj ( ) Tj (**kw\)) Tj /F1 10 Tf (, and a reference to) Tj T* 0 Tw .076457 Tw /F4 10 Tf (File) Tj ( ) Tj (") Tj (<) Tj (string) Tj (>) Tj (",) Tj ( ) Tj (line) Tj ( ) Tj (2,) Tj ( ) Tj (in) Tj ( ) Tj (f) Tj /F1 10 Tf (. This latter reference is due to the fact that internally the decorator) Tj T* 0 Tw 2.053318 Tw (module uses ) Tj /F4 10 Tf (exec ) Tj /F1 10 Tf (to generate the decorated function. Notice that ) Tj /F4 10 Tf (exec ) Tj /F1 10 Tf (is ) Tj /F5 10 Tf (not ) Tj /F1 10 Tf (responsibile for the) Tj T* 0 Tw 1.507485 Tw (performance penalty, since is the called ) Tj /F5 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 80.22362 cm +1 0 0 1 62.69291 98.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 /F4 10 Tf (exec) Tj /F1 10 Tf (. 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.1 it is impossible to change the function signature) Tj T* 0 Tw .931751 Tw (directly, therefore the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module is still useful. Actually, this is one of the main reasons why I) Tj T* 0 Tw (keep maintaining the module and releasing new versions.) Tj T* ET +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 /F4 10 Tf 0 0 0 rg (trace) Tj /F1 10 Tf 0 0 0 rg (, which calls ) Tj /F4 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 /F4 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 /F4 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (to generate the decorated function. Notice that ) Tj /F4 10 Tf 0 0 0 rg (exec ) Tj /F1 10 Tf 0 0 0 rg (is ) Tj /F5 10 Tf (not ) Tj /F1 10 Tf (responsibile for the) Tj T* 0 Tw 1.507485 Tw (performance penalty, since is the called ) Tj /F5 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 endstream endobj -% 'R98': class PDFStream 98 0 obj -% page stream -<< /Length 8028 >> +<< /Length 17481 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 62.69291 705.0236 cm +1 0 0 1 62.69291 693.0236 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 /F4 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.1 it is impossible to change the function signature) Tj T* 0 Tw .931751 Tw (directly, therefore the ) Tj /F4 10 Tf 0 0 0 rg (decorator ) Tj /F1 10 Tf 0 0 0 rg (module is still useful. Actually, this is one of the main reasons why I) Tj T* 0 Tw (keep maintaining the module and releasing new versions.) Tj T* ET +Q +Q +q +1 0 0 1 62.69291 627.0236 cm q -BT 1 0 0 1 0 50 Tm 1.043828 Tw 12 TL /F1 10 Tf 0 0 0 rg (In the present implementation, decorators generated by ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (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 .591235 Tw (the ) Tj /F4 10 Tf (inspect ) Tj /F1 10 Tf (module in the standard library. Moreover, notice that you can decorate a method, but only) Tj T* 0 Tw 2.693516 Tw (before if becomes a bound or unbound method, i.e. inside the class. Here is an example of valid) Tj T* 0 Tw (decoration:) Tj T* ET +BT 1 0 0 1 0 50 Tm 1.043828 Tw 12 TL /F1 10 Tf 0 0 0 rg (In the present implementation, decorators generated by ) Tj /F4 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 .591235 Tw (the ) Tj /F4 10 Tf 0 0 0 rg (inspect ) Tj /F1 10 Tf 0 0 0 rg (module in the standard library. Moreover, notice that you can decorate a method, but only) Tj T* 0 Tw 2.693516 Tw (before if becomes a bound or unbound method, i.e. inside the class. Here is an example of valid) Tj T* 0 Tw (decoration:) Tj T* ET Q Q q -1 0 0 1 62.69291 635.8236 cm +1 0 0 1 62.69291 557.8236 cm q q 1 0 0 1 0 0 cm @@ -3482,21 +5821,57 @@ q n -6 -6 468.6898 60 re B* Q q -BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (C) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (meth) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 36.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 18 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 78 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 102 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 132 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 .75 18 12 re f* +.960784 .960784 .862745 rg +n 78 .75 24 12 re f* +BT 1 0 0 1 0 38 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (C) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (meth) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 615.8236 cm +1 0 0 1 62.69291 537.8236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Here is an example of invalid decoration, when the decorator in called too late:) Tj T* ET Q Q q -1 0 0 1 62.69291 498.6236 cm +1 0 0 1 62.69291 420.6236 cm q q 1 0 0 1 0 0 cm @@ -3509,21 +5884,121 @@ q n -6 -6 468.6898 108 re B* Q q -BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (C) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (meth) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\):) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (trace) Tj (\() Tj (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) Tj (\)) Tj T* (Traceback) Tj ( ) Tj (\() Tj (most) Tj ( ) Tj (recent) Tj ( ) Tj (call) Tj ( ) Tj (last) Tj (\):) Tj T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F3 10 Tf .823529 .254902 .227451 rg (TypeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj (You) Tj ( ) Tj (are) Tj ( ) Tj (decorating) Tj ( ) Tj (a) Tj ( ) Tj (non) Tj ( ) Tj (function) Tj (:) Tj ( ) Tj .4 .4 .4 rg (<) Tj 0 0 0 rg (unbound) Tj ( ) Tj (method) Tj ( ) Tj (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) Tj .4 .4 .4 rg (>) Tj T* ET +.960784 .960784 .862745 rg +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 30 12 re f* +.960784 .960784 .862745 rg +n 60 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 84.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 84.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 54 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 78 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 102 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 108 72.75 24 12 re f* +.960784 .960784 .862745 rg +n 132 72.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 78 60.75 24 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 54 12 re f* +.960784 .960784 .862745 rg +n 60 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 138 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 24.75 24 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 .75 54 12 re f* +.960784 .960784 .862745 rg +n 54 .75 6 12 re f* +.960784 .960784 .862745 rg +n 66 .75 18 12 re f* +.960784 .960784 .862745 rg +n 90 .75 18 12 re f* +.960784 .960784 .862745 rg +n 114 .75 60 12 re f* +.960784 .960784 .862745 rg +n 180 .75 6 12 re f* +.960784 .960784 .862745 rg +n 192 .75 18 12 re f* +.960784 .960784 .862745 rg +n 216 .75 48 12 re f* +.960784 .960784 .862745 rg +n 264 .75 6 12 re f* +.960784 .960784 .862745 rg +n 276 .75 6 12 re f* +.960784 .960784 .862745 rg +n 282 .75 42 12 re f* +.960784 .960784 .862745 rg +n 330 .75 36 12 re f* +.960784 .960784 .862745 rg +n 372 .75 6 12 re f* +.960784 .960784 .862745 rg +n 378 .75 6 12 re f* +.960784 .960784 .862745 rg +n 384 .75 24 12 re f* +.960784 .960784 .862745 rg +n 408 .75 6 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (class) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F3 10 Tf 0 0 1 rg (C) Tj /F4 10 Tf 0 0 0 rg (\() Tj 0 .501961 0 rg (object) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (meth) Tj 0 0 0 rg (\() Tj 0 .501961 0 rg (self) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) 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* /F3 10 Tf .823529 .254902 .227451 rg (TypeError) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (You) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (are) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (decorating) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (a) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (non) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (function) Tj 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (<) Tj 0 0 0 rg (unbound) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (method) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) Tj .4 .4 .4 rg (>) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 478.6236 cm +1 0 0 1 62.69291 400.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The solution is to extract the inner function from the unbound method:) Tj T* ET Q Q q -1 0 0 1 62.69291 433.4236 cm +1 0 0 1 62.69291 355.4236 cm q q 1 0 0 1 0 0 cm @@ -3536,20 +6011,58 @@ q n -6 -6 468.6898 36 re B* Q q -BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (trace) Tj (\() Tj (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (im_func) Tj (\)) Tj T* .4 .4 .4 rg (<) Tj 0 0 0 rg (function) Tj ( ) Tj (meth) Tj ( ) Tj (at) Tj ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (...) Tj (>) Tj T* ET +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 54 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 102 12.75 42 12 re f* +.960784 .960784 .862745 rg +n 144 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 48 12 re f* +.960784 .960784 .862745 rg +n 60 .75 24 12 re f* +.960784 .960784 .862745 rg +n 90 .75 12 12 re f* +.960784 .960784 .862745 rg +n 108 .75 6 12 re f* +.960784 .960784 .862745 rg +n 114 .75 6 12 re f* +.960784 .960784 .862745 rg +n 120 .75 18 12 re f* +.960784 .960784 .862745 rg +n 138 .75 6 12 re f* +BT 1 0 0 1 0 14 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (trace) Tj 0 0 0 rg (\() Tj 0 0 0 rg (C) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (meth) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (im_func) Tj 0 0 0 rg (\)) Tj 0 0 0 rg T* .4 .4 .4 rg (<) Tj 0 0 0 rg (function) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (meth) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (at) Tj 0 0 0 rg ( ) Tj .4 .4 .4 rg (0) Tj 0 0 0 rg (x) Tj .4 .4 .4 rg (...) Tj (>) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 401.4236 cm +1 0 0 1 62.69291 323.4236 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 /F4 10 Tf (_call_ ) Tj /F1 10 Tf (or) Tj T* 0 Tw /F4 10 Tf (_func_ ) Tj /F1 10 Tf (you will get a ) Tj /F4 10 Tf (NameError) Tj /F1 10 Tf (:) Tj T* ET +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 /F4 10 Tf 0 0 0 rg (_call_ ) Tj /F1 10 Tf 0 0 0 rg (or) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (_func_ ) Tj /F1 10 Tf 0 0 0 rg (you will get a ) Tj /F4 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 284.2236 cm +1 0 0 1 62.69291 206.2236 cm q q 1 0 0 1 0 0 cm @@ -3562,20 +6075,98 @@ q n -6 -6 468.6898 108 re B* Q q -BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj (_func_) Tj (\):) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (f) Tj T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* (Traceback) Tj ( ) Tj (\() Tj (most) Tj ( ) Tj (recent) Tj ( ) Tj (call) Tj ( ) Tj (last) Tj (\):) Tj T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F3 10 Tf .823529 .254902 .227451 rg (NameError) Tj /F4 10 Tf 0 0 0 rg (:) Tj ( ) Tj (_func_) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (is) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (overridden) Tj ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj (_func_) Tj (\):) Tj T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj (_call_) Tj (\() Tj (_func_) Tj (,) Tj ( ) Tj (_func_) Tj (\)) Tj T* ET +.960784 .960784 .862745 rg +n 0 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 84.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 84.75 36 12 re f* +.960784 .960784 .862745 rg +n 0 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 72.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 60 72.75 36 12 re f* +.960784 .960784 .862745 rg +n 96 72.75 12 12 re f* +.960784 .960784 .862745 rg +n 114 72.75 30 12 re f* +.960784 .960784 .862745 rg +n 150 72.75 6 12 re f* +.960784 .960784 .862745 rg +n 0 60.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 48.75 54 12 re f* +.960784 .960784 .862745 rg +n 60 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 96 48.75 36 12 re f* +.960784 .960784 .862745 rg +n 138 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 168 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 192 48.75 12 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 18 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 54 12 re f* +.960784 .960784 .862745 rg +n 54 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 66 24.75 36 12 re f* +.960784 .960784 .862745 rg +n 108 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 60 12 re f* +.960784 .960784 .862745 rg +n 192 24.75 12 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 18 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 36 12 re f* +.960784 .960784 .862745 rg +n 72 12.75 12 12 re f* +.960784 .960784 .862745 rg +n 24 .75 36 12 re f* +.960784 .960784 .862745 rg +n 66 .75 36 12 re f* +.960784 .960784 .862745 rg +n 102 .75 6 12 re f* +.960784 .960784 .862745 rg +n 108 .75 36 12 re f* +.960784 .960784 .862745 rg +n 144 .75 6 12 re f* +.960784 .960784 .862745 rg +n 156 .75 36 12 re f* +.960784 .960784 .862745 rg +n 192 .75 6 12 re f* +BT 1 0 0 1 0 86 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj .666667 .133333 1 rg (@trace) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (print) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (f) Tj 0 0 0 rg T* .4 .4 .4 rg (...) Tj 0 0 0 rg T* 0 0 0 rg (Traceback) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (\() Tj 0 0 0 rg (most) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (recent) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (call) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (last) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj .4 .4 .4 rg (...) Tj 0 0 0 rg T* /F3 10 Tf .823529 .254902 .227451 rg (NameError) Tj /F4 10 Tf 0 0 0 rg (:) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (is) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (overridden) Tj 0 0 0 rg ( ) Tj /F3 10 Tf .666667 .133333 1 rg (in) Tj /F4 10 Tf 0 0 0 rg T* /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\):) Tj 0 0 0 rg T* ( ) Tj /F3 10 Tf 0 .501961 0 rg (return) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 0 rg (_call_) Tj 0 0 0 rg (\() Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (,) Tj 0 0 0 rg ( ) Tj 0 0 0 rg (_func_) Tj 0 0 0 rg (\)) Tj T* ET Q Q Q Q Q q -1 0 0 1 62.69291 240.2236 cm +1 0 0 1 62.69291 162.2236 cm q -BT 1 0 0 1 0 26 Tm .194651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally, the implementation is such that the decorated function attribute ) Tj /F4 10 Tf (.func_globals ) Tj /F1 10 Tf (is a ) Tj /F5 10 Tf (copy ) Tj /F1 10 Tf (of the) Tj T* 0 Tw 2.966136 Tw (original function attribute. Moreover the decorated function contains a ) Tj /F5 10 Tf (copy ) Tj /F1 10 Tf (of the original function) Tj T* 0 Tw (dictionary \() Tj /F4 10 Tf (vars\(decorated_f\)) Tj ( ) Tj (is) Tj ( ) Tj (not) Tj ( ) Tj (vars\(f\)) Tj /F1 10 Tf (\):) Tj T* ET +BT 1 0 0 1 0 26 Tm .194651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally, the implementation is such that the decorated function attribute ) Tj /F4 10 Tf 0 0 0 rg (.func_globals ) Tj /F1 10 Tf 0 0 0 rg (is a ) Tj /F5 10 Tf (copy ) Tj /F1 10 Tf (of the) Tj T* 0 Tw .864651 Tw (original function attribute. On the other hand the function attribute dictionary of the decorated function is) Tj T* 0 Tw (just a reference to the original function dictionary, i.e. ) Tj /F4 10 Tf 0 0 0 rg (vars\(decorated_f\)) Tj ( ) Tj (is) Tj ( ) Tj (vars\(f\)) Tj /F1 10 Tf 0 0 0 rg (:) Tj T* ET Q Q q -1 0 0 1 62.69291 87.02362 cm +1 0 0 1 62.69291 81.02362 cm q q 1 0 0 1 0 0 cm @@ -3585,10 +6176,82 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .862745 rg -n -6 -6 468.6898 144 re B* +n -6 -6 468.6898 72 re B* Q q -BT 1 0 0 1 0 122 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original function) Tj /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj ( ) 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 /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj ( ) 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 /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (traced_f) Tj ( ) Tj .4 .4 .4 rg (=) Tj 0 0 0 rg ( ) Tj (trace) Tj (\() Tj (f) Tj (\)) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the decorated function) Tj /F4 10 Tf 0 0 0 rg T* T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr1) Tj T* .729412 .129412 .129412 rg ('something') Tj 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (traced_f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj ( ) 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 /F4 10 Tf 0 0 0 rg T* .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj (f) Tj .4 .4 .4 rg (.) Tj 0 0 0 rg (attr2) Tj ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original attribute did not change) Tj /F4 10 Tf 0 0 0 rg T* .729412 .129412 .129412 rg ('something else') Tj T* ET +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 48 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 54 48.75 18 12 re f* +.960784 .960784 .862745 rg +n 78 48.75 24 12 re f* +.960784 .960784 .862745 rg +n 108 48.75 138 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 36.75 30 12 re f* +.960784 .960784 .862745 rg +n 72 36.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 36.75 66 12 re f* +.960784 .960784 .862745 rg +n 156 36.75 132 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 84 24.75 96 12 re f* +.960784 .960784 .862745 rg +n 186 24.75 162 12 re f* +.960784 .960784 .862745 rg +n 0 .75 6 12 re f* +.960784 .960784 .862745 rg +n 6 .75 6 12 re f* +.960784 .960784 .862745 rg +n 12 .75 6 12 re f* +.960784 .960784 .862745 rg +n 24 .75 48 12 re f* +.960784 .960784 .862745 rg +n 78 .75 6 12 re f* +.960784 .960784 .862745 rg +n 90 .75 30 12 re f* +.960784 .960784 .862745 rg +n 120 .75 6 12 re f* +.960784 .960784 .862745 rg +n 126 .75 6 12 re f* +.960784 .960784 .862745 rg +n 132 .75 6 12 re f* +.960784 .960784 .862745 rg +n 144 .75 144 12 re f* +BT 1 0 0 1 0 50 Tm 12 TL /F4 10 Tf .4 .4 .4 rg (>) Tj (>) Tj (>) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (def) Tj /F4 10 Tf 0 0 0 rg ( ) Tj 0 0 1 rg (f) Tj 0 0 0 rg (\(\):) Tj 0 0 0 rg ( ) Tj /F3 10 Tf 0 .501961 0 rg (pass) Tj /F4 10 Tf 0 0 0 rg ( ) Tj /F6 10 Tf .25098 .501961 .501961 rg (# the original function) Tj /F4 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 /F4 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 /F4 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 /F4 10 Tf 0 0 0 rg T* ET Q Q Q @@ -3597,73 +6260,121 @@ Q endstream endobj -% 'R99': class PDFStream 99 0 obj -% page stream -<< /Length 6552 >> +<< /Length 6515 >> 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 679.8236 cm q -BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Compatibility notes) Tj T* ET -Q -Q q -1 0 0 1 62.69291 678.0236 cm +1 0 0 1 0 0 cm q -BT 1 0 0 1 0 50 Tm 1.404985 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 3.3 is the first version of the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module to fully support Python 3, including ) Tj 0 0 .501961 rg (function) Tj T* 0 Tw .07881 Tw (annotations) Tj 0 0 0 rg (. Version 3.2 was the first version to support Python 3 via the ) Tj /F4 10 Tf (2to3 ) Tj /F1 10 Tf (conversion tool invoked in) Tj T* 0 Tw .373555 Tw (the build process by the ) Tj 0 0 .501961 rg (distribute ) Tj 0 0 0 rg (project, the Python 3-compatible replacement of easy_install. The hard) Tj T* 0 Tw .326235 Tw (work \(for me\) has been converting the documentation and the doctests. This has been possible only after) Tj T* 0 Tw (that ) Tj 0 0 .501961 rg (docutils ) Tj 0 0 0 rg (and ) Tj 0 0 .501961 rg (pygments ) Tj 0 0 0 rg (have been ported to Python 3.) Tj T* ET -Q -Q +1 0 0 1 6.6 6.6 cm q -1 0 0 1 62.69291 600.0236 cm +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .862745 rg +n -6 -6 468.6898 84 re B* +Q q -BT 1 0 0 1 0 62 Tm .793984 Tw 12 TL /F1 10 Tf 0 0 0 rg (Version 3 of the ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (module do not contain any backward incompatible change, apart from the) Tj T* 0 Tw 3.63498 Tw (removal of the functions ) Tj /F4 10 Tf (get_info ) Tj /F1 10 Tf (and ) Tj /F4 10 Tf (new_wrapper) Tj /F1 10 Tf (, which have been deprecated for years.) Tj T* 0 Tw .293672 Tw /F4 10 Tf (get_info ) Tj /F1 10 Tf (has been removed since it was little used and since it had to be changed anyway to work with) Tj T* 0 Tw 2.298555 Tw (Python 3.0; ) Tj /F4 10 Tf (new_wrapper ) Tj /F1 10 Tf (has been removed since it was useless: its major use case \(converting) Tj T* 0 Tw 7.136976 Tw (signature changing decorators to signature preserving decorators\) has been subsumed by) Tj T* 0 Tw /F4 10 Tf (decorator_apply) Tj /F1 10 Tf (, whereas the other use case can be managed with the ) Tj /F4 10 Tf (FunctionMaker) Tj /F1 10 Tf (.) Tj T* ET +.960784 .960784 .862745 rg +n 0 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 48.75 48 12 re f* +.960784 .960784 .862745 rg +n 72 48.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 48.75 30 12 re f* +.960784 .960784 .862745 rg +n 0 36.75 66 12 re f* +.960784 .960784 .862745 rg +n 0 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 24.75 48 12 re f* +.960784 .960784 .862745 rg +n 72 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 78 24.75 30 12 re f* +.960784 .960784 .862745 rg +n 114 24.75 6 12 re f* +.960784 .960784 .862745 rg +n 126 24.75 126 12 re f* +.960784 .960784 .862745 rg +n 264 24.75 84 12 re f* +.960784 .960784 .862745 rg +n 0 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 6 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 12 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 24 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 30 12.75 6 12 re f* +.960784 .960784 .862745 rg +n 36 12.75 30 12 re f* +.960784 .960784 .862745 rg +n 78 12.75 210 12 re f* +.960784 .960784 .862745 rg +n 0 .75 126 12 re f* +BT 1 0 0 1 0 62 Tm 12 TL /F4 10 Tf 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 (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 /F4 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 change) Tj /F4 10 Tf 0 0 0 rg T* .729412 .129412 .129412 rg ('something different') Tj T* ET +Q +Q +Q Q Q q -1 0 0 1 62.69291 558.0236 cm +1 0 0 1 62.69291 646.8236 cm q -BT 1 0 0 1 0 26 Tm 1.329213 Tw 12 TL /F1 10 Tf 0 0 0 rg (There are a few changes in the documentation: I removed the ) Tj /F4 10 Tf (decorator_factory ) Tj /F1 10 Tf (example, which) Tj T* 0 Tw 2.562927 Tw (was confusing some of my users, and I removed the part about exotic signatures in the Python 3) Tj T* 0 Tw (documentation, since Python 3 does not support them.) Tj T* ET +BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (Compatibility notes) Tj T* ET Q Q q -1 0 0 1 62.69291 492.0236 cm +1 0 0 1 62.69291 592.8236 cm q -BT 1 0 0 1 0 50 Tm .942651 Tw 12 TL /F1 10 Tf 0 0 0 rg (Finally ) Tj /F4 10 Tf (decorator ) Tj /F1 10 Tf (cannot be used as a class decorator and the ) Tj 0 0 .501961 rg (functionality introduced in version 2.3) Tj T* 0 Tw .241163 Tw 0 0 0 rg (has been removed. That means that in order to define decorator factories with classes you need to define) Tj T* 0 Tw 1.122126 Tw (the ) Tj /F4 10 Tf (__call__ ) Tj /F1 10 Tf (method explicitly \(no magic anymore\). All these changes should not cause any trouble,) Tj T* 0 Tw .601163 Tw (since they were all rarely used features. Should you have any trouble, you can always downgrade to the) Tj T* 0 Tw (2.3 version.) Tj T* ET +BT 1 0 0 1 0 38 Tm 1.831984 Tw 12 TL /F1 10 Tf 0 0 0 rg (This version fully supports Python 3, including ) Tj 0 0 .501961 rg (function annotations) Tj 0 0 0 rg (. Moreover it is the first version to) Tj T* 0 Tw 4.83748 Tw (support generic callers, i.e. callable objects with the right signature, not necessarily functions.) Tj T* 0 Tw .70436 Tw /F4 10 Tf 0 0 0 rg (contextmanager ) Tj /F1 10 Tf 0 0 0 rg (will not work in Python 2.4. The decorated function dictionary is now the same of the) Tj T* 0 Tw (original function dictionary, wheread in past versions they were different objects.) Tj T* ET Q Q q -1 0 0 1 62.69291 426.0236 cm +1 0 0 1 62.69291 526.8236 cm q -BT 1 0 0 1 0 50 Tm .196098 Tw 12 TL /F1 10 Tf 0 0 0 rg (The examples shown here have been tested with Python 2.6. Python 2.4 is also supported - of course the) Tj T* 0 Tw 1.649398 Tw (examples requiring the ) Tj /F4 10 Tf (with ) Tj /F1 10 Tf (statement will not work there. Python 2.5 works fine, but if you run the) Tj T* 0 Tw 1.41784 Tw (examples in the interactive interpreter you will notice a few differences since ) Tj /F4 10 Tf (getargspec ) Tj /F1 10 Tf (returns an) Tj T* 0 Tw .909982 Tw /F4 10 Tf (ArgSpec ) Tj /F1 10 Tf (namedtuple instead of a regular tuple. That means that running the file ) Tj /F4 10 Tf (documentation.py) Tj T* 0 Tw /F1 10 Tf (under Python 2.5 will print a few errors, but they are not serious.) Tj T* ET +BT 1 0 0 1 0 50 Tm .936654 Tw 12 TL /F1 10 Tf 0 0 0 rg (The examples shown here have been tested with Python 2.7 and 3.4. Python 2.4 is also supported - of) Tj T* 0 Tw .734104 Tw (course the examples requiring the ) Tj /F4 10 Tf 0 0 0 rg (with ) Tj /F1 10 Tf 0 0 0 rg (statement will not work there. Python 2.5 works fine, but if you) Tj T* 0 Tw 2.409983 Tw (run the examples in the interactive interpreter you will notice a few differences since ) Tj /F4 10 Tf 0 0 0 rg (getargspec) Tj T* 0 Tw 4.486412 Tw /F1 10 Tf 0 0 0 rg (returns an ) Tj /F4 10 Tf 0 0 0 rg (ArgSpec ) Tj /F1 10 Tf 0 0 0 rg (namedtuple instead of a regular tuple. That means that running the file) Tj T* 0 Tw /F4 10 Tf 0 0 0 rg (documentation.py ) Tj /F1 10 Tf 0 0 0 rg (under Python 2.5 will print a few errors, but they are not serious.) Tj T* ET Q Q q -1 0 0 1 62.69291 393.0236 cm +1 0 0 1 62.69291 493.8236 cm q BT 1 0 0 1 0 3.5 Tm 21 TL /F2 17.5 Tf 0 0 0 rg (LICENCE) Tj T* ET Q Q q -1 0 0 1 62.69291 375.0236 cm +1 0 0 1 62.69291 475.8236 cm q 0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Copyright \(c\) 2005-2012, Michele Simionato All rights reserved.) Tj T* ET +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 345.0236 cm +1 0 0 1 62.69291 445.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 339.0236 cm +1 0 0 1 62.69291 440.4661 cm Q q -1 0 0 1 62.69291 291.0236 cm +1 0 0 1 62.69291 392.4661 cm 0 0 0 rg BT /F1 10 Tf 12 TL ET BT 1 0 0 1 0 2 Tm T* ET @@ -3678,17 +6389,17 @@ q Q Q q -1 0 0 1 62.69291 291.0236 cm +1 0 0 1 62.69291 392.4661 cm Q q -1 0 0 1 62.69291 165.0236 cm +1 0 0 1 62.69291 266.4661 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 135.0236 cm +1 0 0 1 62.69291 236.4661 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 @@ -3697,256 +6408,179 @@ Q endstream endobj -% 'R100': class PDFPageLabels 100 0 obj -% Document Root -<< /Nums [ 0 - 101 0 R - 1 - 102 0 R - 2 - 103 0 R - 3 - 104 0 R - 4 - 105 0 R - 5 - 106 0 R - 6 - 107 0 R - 7 - 108 0 R - 8 - 109 0 R - 9 - 110 0 R - 10 - 111 0 R - 11 - 112 0 R - 12 - 113 0 R - 13 - 114 0 R - 14 - 115 0 R ] >> -endobj -% 'R101': class PDFPageLabel +<< /Nums [ 0 101 0 R 1 102 0 R 2 103 0 R 3 104 0 R 4 105 0 R + 5 106 0 R 6 107 0 R 7 108 0 R 8 109 0 R 9 110 0 R + 10 111 0 R 11 112 0 R 12 113 0 R 13 114 0 R 14 115 0 R ] >> +endobj 101 0 obj -% None -<< /S /D - /St 1 >> +<< /S /D /St 1 >> endobj -% 'R102': class PDFPageLabel 102 0 obj -% None -<< /S /D - /St 2 >> +<< /S /D /St 2 >> endobj -% 'R103': class PDFPageLabel 103 0 obj -% None -<< /S /D - /St 3 >> +<< /S /D /St 3 >> endobj -% 'R104': class PDFPageLabel 104 0 obj -% None -<< /S /D - /St 4 >> +<< /S /D /St 4 >> endobj -% 'R105': class PDFPageLabel 105 0 obj -% None -<< /S /D - /St 5 >> +<< /S /D /St 5 >> endobj -% 'R106': class PDFPageLabel 106 0 obj -% None -<< /S /D - /St 6 >> +<< /S /D /St 6 >> endobj -% 'R107': class PDFPageLabel 107 0 obj -% None -<< /S /D - /St 7 >> +<< /S /D /St 7 >> endobj -% 'R108': class PDFPageLabel 108 0 obj -% None -<< /S /D - /St 8 >> +<< /S /D /St 8 >> endobj -% 'R109': class PDFPageLabel 109 0 obj -% None -<< /S /D - /St 9 >> +<< /S /D /St 9 >> endobj -% 'R110': class PDFPageLabel 110 0 obj -% None -<< /S /D - /St 10 >> +<< /S /D /St 10 >> endobj -% 'R111': class PDFPageLabel 111 0 obj -% None -<< /S /D - /St 11 >> +<< /S /D /St 11 >> endobj -% 'R112': class PDFPageLabel 112 0 obj -% None -<< /S /D - /St 12 >> +<< /S /D /St 12 >> endobj -% 'R113': class PDFPageLabel 113 0 obj -% None -<< /S /D - /St 13 >> +<< /S /D /St 13 >> endobj -% 'R114': class PDFPageLabel 114 0 obj -% None -<< /S /D - /St 14 >> +<< /S /D /St 14 >> endobj -% 'R115': class PDFPageLabel 115 0 obj -% None -<< /S /D - /St 15 >> +<< /S /D /St 15 >> endobj xref 0 116 0000000000 65535 f -0000000113 00000 n +0000000075 00000 n +0000000161 00000 n 0000000271 00000 n -0000000436 00000 n -0000000611 00000 n -0000000794 00000 n -0000001046 00000 n -0000001295 00000 n -0000001469 00000 n -0000001710 00000 n -0000001951 00000 n -0000002193 00000 n -0000002435 00000 n -0000002677 00000 n -0000002919 00000 n -0000003162 00000 n -0000003405 00000 n -0000003648 00000 n -0000003891 00000 n -0000004133 00000 n -0000004375 00000 n -0000004618 00000 n -0000004861 00000 n -0000005104 00000 n -0000005347 00000 n -0000005590 00000 n -0000005833 00000 n -0000006076 00000 n -0000006319 00000 n -0000006562 00000 n -0000006805 00000 n -0000007048 00000 n -0000007291 00000 n -0000007534 00000 n -0000007777 00000 n -0000008020 00000 n -0000008263 00000 n -0000008506 00000 n -0000008733 00000 n -0000009311 00000 n -0000009506 00000 n -0000009762 00000 n -0000009953 00000 n -0000010213 00000 n -0000010523 00000 n -0000010803 00000 n -0000011083 00000 n -0000011363 00000 n -0000011643 00000 n -0000011923 00000 n -0000012203 00000 n -0000012484 00000 n -0000012779 00000 n -0000013034 00000 n -0000013302 00000 n -0000013613 00000 n -0000013908 00000 n -0000014153 00000 n -0000014455 00000 n -0000014750 00000 n -0000015010 00000 n -0000015270 00000 n -0000015528 00000 n -0000015780 00000 n -0000016020 00000 n -0000016327 00000 n -0000016674 00000 n -0000016834 00000 n -0000017119 00000 n -0000017245 00000 n -0000017418 00000 n -0000017605 00000 n -0000017805 00000 n -0000017993 00000 n -0000018186 00000 n -0000018385 00000 n -0000018569 00000 n -0000018750 00000 n -0000018940 00000 n -0000019140 00000 n -0000019340 00000 n -0000019552 00000 n -0000019752 00000 n -0000019948 00000 n -0000020100 00000 n -0000020335 00000 n -0000029480 00000 n -0000037125 00000 n -0000045281 00000 n -0000052495 00000 n -0000061446 00000 n -0000068701 00000 n -0000076181 00000 n -0000083501 00000 n -0000090780 00000 n -0000098681 00000 n -0000106059 00000 n -0000113304 00000 n -0000119694 00000 n -0000127821 00000 n -0000134477 00000 n -0000134774 00000 n -0000134853 00000 n -0000134932 00000 n -0000135011 00000 n -0000135090 00000 n -0000135169 00000 n -0000135248 00000 n -0000135327 00000 n -0000135406 00000 n -0000135485 00000 n -0000135565 00000 n -0000135645 00000 n -0000135725 00000 n -0000135805 00000 n -0000135885 00000 n +0000000386 00000 n +0000000499 00000 n +0000000688 00000 n +0000000886 00000 n +0000000994 00000 n +0000001165 00000 n +0000001336 00000 n +0000001508 00000 n +0000001680 00000 n +0000001852 00000 n +0000002024 00000 n +0000002196 00000 n +0000002368 00000 n +0000002540 00000 n +0000002712 00000 n +0000002884 00000 n +0000003056 00000 n +0000003228 00000 n +0000003400 00000 n +0000003572 00000 n +0000003744 00000 n +0000003916 00000 n +0000004088 00000 n +0000004260 00000 n +0000004432 00000 n +0000004604 00000 n +0000004776 00000 n +0000004948 00000 n +0000005120 00000 n +0000005292 00000 n +0000005464 00000 n +0000005636 00000 n +0000005808 00000 n +0000005980 00000 n +0000006152 00000 n +0000006324 00000 n +0000006496 00000 n +0000006668 00000 n +0000006840 00000 n +0000007012 00000 n +0000007501 00000 n +0000007620 00000 n +0000007825 00000 n +0000007942 00000 n +0000008169 00000 n +0000008405 00000 n +0000008615 00000 n +0000008825 00000 n +0000009035 00000 n +0000009245 00000 n +0000009455 00000 n +0000009665 00000 n +0000009875 00000 n +0000010085 00000 n +0000010276 00000 n +0000010494 00000 n +0000010730 00000 n +0000010940 00000 n +0000011150 00000 n +0000011345 00000 n +0000011574 00000 n +0000011770 00000 n +0000011999 00000 n +0000012109 00000 n +0000012357 00000 n +0000012435 00000 n +0000012552 00000 n +0000012681 00000 n +0000012823 00000 n +0000012953 00000 n +0000013088 00000 n +0000013230 00000 n +0000013356 00000 n +0000013479 00000 n +0000013611 00000 n +0000013752 00000 n +0000013893 00000 n +0000014046 00000 n +0000014187 00000 n +0000014324 00000 n +0000014436 00000 n +0000014603 00000 n +0000023769 00000 n +0000036376 00000 n +0000053623 00000 n +0000069507 00000 n +0000091890 00000 n +0000110195 00000 n +0000126839 00000 n +0000144261 00000 n +0000158122 00000 n +0000171904 00000 n +0000185676 00000 n +0000202654 00000 n +0000213129 00000 n +0000230668 00000 n +0000237240 00000 n +0000237439 00000 n +0000237477 00000 n +0000237515 00000 n +0000237553 00000 n +0000237591 00000 n +0000237629 00000 n +0000237667 00000 n +0000237705 00000 n +0000237743 00000 n +0000237781 00000 n +0000237820 00000 n +0000237859 00000 n +0000237898 00000 n +0000237937 00000 n +0000237976 00000 n trailer << /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(%\2119\\+X\235\026\270\000 \364\017F\214k) (%\2119\\+X\235\026\270\000 \364\017F\214k)] - - /Info 67 0 R - /Root 66 0 R - /Size 116 >> + % ReportLab generated PDF document -- digest (http://www.reportlab.com) + [(\222\367\264\017\265\014D\323N7\214\254\213\217\0272) (\222\367\264\017\265\014D\323N7\214\254\213\217\0272)] + /Info 67 0 R /Root 66 0 R /Size 116 >> startxref -135934 +238015 %%EOF -- cgit v1.2.1