summaryrefslogtreecommitdiffstats
path: root/doc/images/overview.png
blob: f1189c920826b93f35043ec60ea9cec89e0e4806 (plain)
ofshex dumpascii
0000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 eb 00 00 02 5a 08 06 00 00 00 0f 8d 6f .PNG........IHDR.......Z.......o
0020 ec 00 00 20 00 49 44 41 54 78 9c ec 9d 77 58 14 57 1f 85 af 15 7b 2c 89 e6 8b 89 46 63 49 51 13 .....IDATx...wX.W....{,....FcIQ.
0040 35 48 34 46 0d 1a 0b d6 28 51 31 1a 8c 0d 6b 2c b1 c4 20 a2 46 c5 de 7b 2f d8 7b 6c d8 15 50 51 5H4F....(Q1...k,....F..{/.{l..PQ
0060 d6 de 5b 8c b1 c6 06 22 a3 b1 9e ef 8f cb 6c 81 65 29 02 33 30 e7 7d 9e f3 c8 94 9d bd b3 b8 fb ..[...."......l.e).30.}.........
0080 ee bd 77 7e 83 00 21 84 10 42 74 8d d0 ba 01 84 10 42 08 71 0c 65 4d 08 21 84 e8 1c ca 9a 10 42 ..w~..!..Bt......B.q.eM.!......B
00a0 08 d1 39 94 35 21 84 10 a2 73 28 6b 42 08 21 44 e7 50 d6 84 10 42 88 ce a1 ac 09 21 84 10 9d 43 ..9.5!...s(kB.!D.P...B.....!...C
00c0 59 13 42 08 21 3a 87 b2 26 84 10 42 74 0e 65 4d 08 21 84 e8 1c ca 9a 10 42 08 d1 39 94 35 21 84 Y.B.!:..&..Bt.eM.!......B..9.5!.
00e0 10 a2 73 28 6b 42 08 21 44 e7 50 d6 84 10 42 88 ce a1 ac 09 21 84 10 9d 43 59 13 42 08 21 3a 87 ..s(kB.!D.P...B.....!...CY.B.!:.
0100 b2 26 84 10 42 74 0e 65 4d 08 21 84 e8 1c ca 9a 10 42 08 d1 39 94 35 21 84 10 a2 73 28 6b 42 08 .&..Bt.eM.!......B..9.5!...s(kB.
0120 21 44 e7 50 d6 84 10 42 88 ce a1 ac 09 21 84 10 9d a3 4b 59 fb fb fb 63 c4 88 11 18 34 68 90 39 !D.P...B.....!....KY...c....4h.9
0140 de de de f0 f0 f0 80 9b 9b 1b be fb ee 3b 54 ab 56 0d 75 eb d6 45 c7 8e 1d cd fb dc b9 73 07 00 .............;T.V.u..E.......s..
0160 30 63 c6 0c 9b c7 72 3b b7 a7 b6 ed 13 27 4e c4 ea d5 ab 11 1a 1a fa 46 ef 25 42 48 da 40 57 b2 0c....r;.....'N........F.%BH.@W.
0180 7e fe fc 39 0a 17 2e 8c e6 cd 9b c3 d7 d7 17 7d fa f4 41 b3 66 cd d0 bb 77 6f 78 7a 7a a2 68 d1 ~..9...........}..A.f...woxzz.h.
01a0 a2 f8 fc f3 cf 51 b9 72 65 7c f5 d5 57 70 71 71 41 b1 62 c5 e0 e9 e9 89 df 7f ff 1d 7f fd f5 17 .....Q.re|..WpqqA.b.............
01c0 14 45 c1 c4 89 13 f1 fb ef bf c7 08 b7 73 7b 6a d9 de bf 7f 7f 34 6a d4 08 ee ee ee 28 5e bc 38 .E...........s{j.....4j.....(^.8
01e0 c6 8c 19 a3 f5 db 93 10 a2 21 ba 92 75 e5 ca 95 b1 6f df 3e dc bb 77 0f f7 ee dd 43 ab 56 ad 50 .........!..u....o.>..w....C.V.P
0200 af 5e 3d 5c bb 76 cd 61 aa 56 ad 8a 6d db b6 41 51 14 86 49 73 39 71 e2 04 ba 77 ef 8e 17 2f 5e .^=\.v.a.V..m..AQ..Is9q...w.../^
0220 68 fd 16 25 84 68 84 6e 64 7d e8 d0 21 94 2f 5f de 2c ea ea d5 ab c3 cf cf 2f 4e 51 5f bb 76 0d h..%.h.nd}..!./_.,......./NQ_.v.
0240 43 87 0e 45 fb f6 ed 35 ff 50 65 98 e4 ce a8 51 a3 70 fe fc 79 ad df ae 84 90 14 46 37 b2 5e bf C..E...5.Pe....Q.p..y......F7.^.
0260 7e 3d ea d6 ad 8b 7b f7 ee a1 5c b9 72 58 b1 62 45 bc 44 7d ed da 35 cc 9e 3d 1b 75 eb d6 d5 fc ~=....{...\.rX.bE.D}..5..=.u....
0280 83 94 89 99 fb f7 ef c3 d9 d9 19 6f bf fd 36 b2 66 cd 0a 67 67 67 84 84 84 98 b7 cf 9e 3d 1b 65 ...........o..6.f..ggg.......=.e
02a0 cb 96 35 6f 0b 0d 0d 4d f6 36 3d 78 f0 00 42 08 9c 3c 79 32 59 9f c7 cb cb 0b 4d 9a 34 49 f2 e3 ..5o...M.6=x..B..<y2Y.....M.4I..
02c0 b6 6e dd 1a fb f7 ef d7 fa 2d 4b 08 49 41 74 27 6b 2f 2f 2f 8c 1c 39 32 de a2 a6 ac 53 47 9a 37 .n.......-K.IAt'k///..92....SG.7
02e0 6f 8e 4f 3f fd d4 ee b6 6b d7 ae c5 ba 2d 39 92 52 b2 f6 f7 f7 c7 8c 19 33 92 fc b8 11 11 11 f8 o.O?....k....-9.R.......3.......
0300 fa eb af b5 7e cb 12 42 52 10 dd c9 fa fa f5 eb 09 12 35 65 9d 3a 62 44 59 27 67 86 0d 1b 86 be ....~..BR.........5e.:bDY'g.....
0320 7d fb 6a fd b6 25 84 a4 10 ba 92 75 95 2a 55 70 ea d4 29 5c bb 76 0d db b6 6d 43 89 12 25 f0 e9 }.j..%.....u.*Up..)\.v...mC..%..
0340 a7 9f da 8d 97 97 17 65 9d 8a 92 50 59 4f 9a 34 09 15 2a 54 80 ab ab 2b 5c 5c 5c e0 e9 e9 89 4b .......e...PYO.4..*T...+\\\....K
0360 97 2e 99 b7 9b 4c 26 7c f7 dd 77 70 71 71 41 95 2a 55 50 bf 7e 7d 9c 3e 7d da bc 3d 7b f6 ec 10 .....L&|..wpqqA.*UP.~}.>}..={...
0380 42 a0 51 a3 46 18 3f 7e 3c de 7b ef 3d f3 b2 3d 59 c7 f5 7c d6 69 d9 b2 25 9c 9c 9c 90 3f 7f 7e B.Q.F.?~<.{.=..=Y..|.i..%....?.~
03a0 78 7a 7a 42 51 14 84 84 84 e0 f3 cf 3f 47 ce 9c 39 d1 b3 67 4f 74 ef de 1d 85 0b 17 46 be 7c f9 xzzBQ.......?G..9..gOt......F.|.
03c0 6c 1e eb a8 dd 93 26 4d c2 3b ef bc 83 1c 39 72 c0 d9 d9 19 11 11 11 50 14 05 8d 1b 37 36 3f 8f l.....&M.;....9r.......P....76?.
03e0 a2 28 a8 51 a3 06 b2 66 cd 8a 74 e9 d2 69 fd b6 25 84 a4 10 ba 92 75 fa f4 e9 71 e1 c2 05 5c bb .(.Q...f..t..i..%.....u...q...\.
0400 76 0d 1e 1e 1e 10 42 c4 9a cc 99 33 53 d6 a9 28 09 91 f5 be 7d fb 90 23 47 0e dc bc 79 13 8a a2 v.....B....3S..(....}..#G...y...
0420 20 2c 2c 0c 5f 7e f9 25 36 6e dc 08 45 51 70 e5 ca 15 e4 cb 97 0f 63 c6 8c 31 3f 66 e0 c0 81 28 .,,._~.%6n..EQp.......c..1?f...(
0440 58 b0 20 ee de bd 6b 5e d7 a8 51 23 14 2c 58 10 83 06 0d c2 ed db b7 31 6b d6 2c 34 6a d4 08 8a X.....k^..Q#.,X........1k.,4j...
0460 a2 e0 e6 cd 9b 78 fc f8 71 bc 9e cf 5e 5a b6 6c 19 e3 7c 66 cf 9e 8d de bd 7b 9b 97 c7 8e 1d 6b .....x..q...^Z.l..|f.....{.....k
0480 23 eb f8 b4 7b fc f8 f1 c8 99 33 27 1e 3e 7c 08 45 91 a3 00 39 72 e4 c0 3b ef bc 63 96 f7 ed db #...{.....3'.>|.E...9r..;..c....
04a0 b7 e1 e2 e2 82 2d 5b b6 e0 f2 e5 cb 5a bf 75 09 21 29 80 6e 64 3d 61 c2 04 bc fb ee bb 66 01 07 .....-[.....Z.u.!).nd=a......f..
04c0 04 04 a0 78 f1 e2 76 7b d5 9f 7c f2 09 3a 74 e8 40 59 a7 a2 24 44 d6 fe fe fe c8 9c 39 33 0e 1c ...x..v{..|..:t.@Y..$D......93..
04e0 38 60 5e 77 ec d8 31 fc f3 cf 3f 50 14 05 7d fb f6 45 ce 9c 39 cd b2 55 05 26 84 c0 94 29 53 cc 8`^w..1...?P..}..E..9..U.&...)S.
0500 eb 1a 35 6a 84 62 c5 8a 99 97 1f 3d 7a 64 ae 65 b6 4e 5c cf 67 2f bb 76 ed 82 10 02 bb 76 ed 32 ..5j.b.....=zd.e.N\.g/.v.....v.2
0520 af ab 5c b9 b2 4d ef 3e ba ac e3 d3 ee 2b 57 ae 20 5d ba 74 58 b5 6a 15 14 45 c1 ca 95 2b d1 a0 ..\..M.>.....+W..].tX.j..E...+..
0540 41 03 08 21 10 10 10 00 45 51 30 77 ee 5c f8 fa fa 42 51 14 bc 7e fd 5a eb b7 2e 21 24 05 d0 8d A..!....EQ0w.\...BQ..~.Z...!$...
0560 ac 07 0d 1a 84 7c f9 f2 25 78 be 9a b2 4e 1d f1 f0 f0 c0 c7 1f 7f 6c 77 db d5 ab 57 51 aa 54 29 .....|..%x...N........lw...WQ.T)
0580 f3 f2 83 07 0f 50 a3 46 0d a4 4b 97 0e 15 2a 54 80 9f 9f 1f ae 5e bd 6a de 5e b3 66 4d f3 d5 e3 .....P.F..K...*T.....^.j.^.fM...
05a0 d6 79 ff fd f7 31 60 c0 00 f3 7e 8d 1a 35 82 9b 9b 5b 9c 6d 8b eb f9 62 cb a7 9f 7e 8a 96 2d 5b .y...1`...~..5...[.m...b...~..-[
05c0 42 51 14 1c 3d 7a 14 d5 ab 57 b7 d9 1e 5d d6 f1 6d b7 8b 8b 8b f9 b8 3f fe f8 23 0e 1e 3c 88 e2 BQ..=z...W...]..m......?..#..<..
05e0 c5 8b a3 4b 97 2e 50 14 05 0d 1b 36 c4 91 23 47 b0 67 cf 1e cc 9f 3f 5f eb b7 2e 21 24 05 d0 8d ...K..P....6..#G.g....?_...!$...
0600 ac fb f7 ef 8f fc f9 f3 53 d6 69 34 5e 5e 5e c8 9f 3f bf dd 6d 47 8e 1c 41 a5 4a 95 62 ac 3f 78 ........S.i4^^^..?..mG..A.J.b.?x
0620 f0 20 7e fd f5 57 bc f7 de 7b c8 99 33 27 76 ec d8 61 96 de fb ef bf 1f e7 73 36 6a d4 c8 3c ec ..~..W...{..3'v..a.......s6j..<.
0640 1d 9f c4 f6 7c b1 65 d4 a8 51 c8 96 2d 1b 6e dd ba 85 6e dd ba c1 df df df 66 bb 3d 59 c7 a7 dd ....|.e..Q..-.n...n......f.=Y...
0660 c3 86 0d 43 be 7c f9 f0 e0 c1 03 94 2b 57 0e 8a a2 a0 57 af 5e f8 e0 83 0f 70 f7 ee 5d 94 2d 5b ...C.|......+W....W.^....p..].-[
0680 16 8a 22 7b d8 3f fe f8 a3 d6 6f 5d 42 48 0a 40 59 33 29 92 c9 93 27 43 08 81 13 27 4e c4 d8 36 .."{.?....o]BH.@Y3)...'C...'N..6
06a0 65 ca 14 9b 9b da 98 4c 26 98 4c 26 f3 f2 83 07 0f 50 a2 44 09 b4 6a d5 0a 8a a2 a0 5f bf 7e c8 e......L&.L&.....P.D..j....._.~.
06c0 98 31 a3 79 8e 59 cd d0 a1 43 b1 7d fb 76 f3 72 7c 65 1d d7 f3 c5 96 eb d7 af 23 4b 96 2c 18 31 .1.y.Y...C.}.v.r|e........#K.,.1
06e0 62 04 3e f9 e4 13 84 87 87 db 6c 8f 2e eb f8 b6 fb cc 99 33 10 42 e0 d7 5f 7f 45 f7 ee dd a1 28 b.>.......l........3.B.._.E....(
0700 72 5e 5d 5d d7 a7 4f 1f 28 0a 65 4d 88 91 d0 8d ac 67 cd 9a 65 33 67 9d 90 f0 0e 66 fa cf 8d 1b r^]]..O.(.eM.....g..e3g....f....
0720 37 90 3f 7f 7e 7c f1 c5 17 d8 bb 77 2f 1e 3e 7c 88 f0 f0 70 ac 5f bf 1e ef bd f7 9e cd 7c f1 c4 7.?.~|.....w/.>|...p._.......|..
0740 89 13 d1 a8 51 23 f3 dc ee fd fb f7 f1 d1 47 1f 61 f8 f0 e1 50 14 05 7f fd f5 17 de 79 e7 1d f3 ....Q#........G.a...P.......y...
0760 b0 b0 a2 28 d8 b3 67 0f 0a 17 2e 8c 1b 37 6e 98 d7 c5 57 d6 71 3d 9f a3 34 6f de 1c 59 b3 66 45 ...(..g......7n...W.q=..4o..Y.fE
0780 af 5e bd 62 6c 8b 2e eb f8 b6 5b 51 14 94 2e 5d 1a 19 33 66 b4 99 13 7f ff fd f7 91 31 63 46 04 .^.bl.....[Q...]..3f........1cF.
07a0 07 07 43 51 28 6b 42 8c 84 6e 64 0d 00 95 2a 55 c2 c6 8d 1b 13 2c eb ca 95 2b c7 39 64 c9 68 9f ..CQ(kB..nd...*U.....,...+.9d.h.
07c0 63 c7 8e a1 71 e3 c6 c8 9f 3f 3f 32 65 ca 84 dc b9 73 a3 6a d5 aa d8 b4 69 93 cd 7e a1 a1 a1 68 c...q....??2e....s.j....i..~...h
07e0 d2 a4 89 b9 94 aa 7c f9 f2 e8 db b7 af f9 6a 68 45 91 73 c4 b5 6b d7 c6 67 9f 7d 06 57 57 57 d4 ......|.......jhE.s..k..g.}.WWW.
0800 a9 53 c7 a6 77 ec e6 e6 86 bc 79 f3 22 6f de bc 31 ee 9a 16 3d f1 79 be d8 12 10 10 80 74 e9 d2 .S..w.....y."o..1...=.y......t..
0820 e1 d4 a9 53 36 eb d5 d2 ad 8c 19 33 c2 d9 d9 19 47 8f 1e 8d 57 bb d5 f8 f8 f8 a0 40 81 02 88 8c ...S6......3....G...W......@....
0840 8c 34 af eb dc b9 33 0a 15 2a 64 5e a6 ac 09 31 0e ba 91 f5 fd fb f7 11 12 12 82 22 45 8a a0 71 .4....3..*d^...1..........."E..q
0860 e3 c6 f0 f6 f6 46 cf 9e 3d 1d a6 7b f7 ee a8 53 a7 0e 82 82 82 34 17 11 c3 a4 74 28 6b 42 8c 83 .....F..=..{...S.....4....t(kB..
0880 6e 64 bd 7e fd 7a d4 af 5f 1f 8a a2 60 de bc 79 18 3c 78 b0 dd 3f 23 68 9d 09 13 26 d8 ed 95 30 nd.~.z.._...`..y.<x..?#h...&...0
08a0 8c 11 72 fc f8 71 6c db b6 4d eb b7 2e 21 24 05 d0 a5 ac 19 86 89 5f 58 67 4d 88 31 a0 ac 19 26 ..r..ql..M...!$......._XgM.1...&
08c0 95 26 28 28 08 0b 16 2c d0 fa ad 4b 08 49 01 28 6b 86 49 a5 e1 9c 35 21 c6 81 b2 66 98 54 1a ca .&((...,...K.I.(k.I...5!...f.T..
08e0 9a 10 e3 a0 1b 59 07 07 07 a3 5f bf 7e 9a 7f 00 32 4c 6a 09 65 4d 88 71 d0 8d ac 01 e0 e9 d3 a7 .....Y...._.~...2Lj.eM.q........
0900 9a 7f 00 32 4c 6a 09 65 4d 88 71 d0 8d ac ef df bf cf 32 2c 86 49 40 28 6b 42 8c 83 6e 64 cd 39 ...2Lj.eM.q.......2,.I@(kB..nd.9
0920 6b 86 49 58 58 67 4d 88 71 a0 ac 19 26 15 87 75 d6 84 18 03 ca 9a 61 52 69 58 67 4d 88 71 a0 ac k.IXXgM.q...&..u......aRiXgM.q..
0940 19 26 95 86 73 d6 84 18 07 ca 9a 61 52 69 28 6b 42 8c 83 6e 64 cd 3a 6b 86 49 58 28 6b 42 8c 83 .&..s......aRi(kB..nd.:k.IX(kB..
0960 6e 64 0d b0 ce 9a 61 12 12 ca 9a 10 e3 a0 1b 59 b3 ce 9a 61 12 16 ca 9a 10 e3 a0 1b 59 73 ce 9a nd....a........Y...a........Ys..
0980 61 12 16 d6 59 13 62 1c 28 6b 86 49 c5 61 9d 35 21 c6 80 b2 66 98 54 1a d6 59 13 62 1c 28 6b 86 a...Y.b.(k.I.a.5!...f.T..Y.b.(k.
09a0 49 a5 e1 9c 35 21 c6 81 b2 66 98 54 1a ca 9a 10 e3 a0 1b 59 b3 ce 9a 61 12 16 ca 9a 10 e3 a0 1b I...5!...f.T.......Y...a........
09c0 59 03 ac b3 66 98 84 84 b2 26 c4 38 e8 46 d6 ac b3 66 98 84 85 b2 26 c4 38 e8 46 d6 9c b3 66 98 Y...f....&.8.F...f....&.8.F...f.
09e0 84 85 75 d6 84 18 07 ca 9a b1 24 32 12 77 6f 5e c3 df e7 8e e1 ea d9 a3 f8 fb dc 31 dc b8 72 16 ..u.......$2.wo^...........1..r.
0a00 e1 0f ef 6b df 36 c6 6e 58 67 4d 88 31 a0 ac 19 9c 3e b8 03 3b 16 8d c6 4a bf 8e 58 3b ba 0b b6 ...k.6.nXgM.1....>..;...J..X;...
0a20 4d eb 8b 0d a3 bc b0 7e 64 7b ac 1f d5 01 cb 86 b4 c6 4a bf 0e d8 b5 68 14 4e 06 6f c5 bf 37 ae M......~d{........J....h.N.o..7.
0a40 6a de 66 86 75 d6 84 18 09 ca da c0 39 b5 7f 2b 96 0d 6d 8b 80 49 dd b1 77 7c 5b 84 4e ef 08 d3 j.f.u.......9..+..m..I..w|[.N...
0a60 8c 4e 76 13 32 d5 0b 7b c6 fd 8c 4d 23 5a 63 d5 b0 36 d8 38 b1 17 b6 4c eb 8f c0 e5 13 70 e6 e0 .Nv.2..{...M#Zc..6.8...L.....p..
0a80 36 cd cf c5 88 e1 9c 35 21 c6 81 b2 36 62 22 23 b1 65 a6 0f b6 8d ef e4 50 d0 8e 72 70 72 07 ec 6......5!...6b"#.e......P..rpr..
0aa0 1d df 16 db 46 79 62 eb e8 36 58 31 ac 1d ce 87 ee d6 fe dc 0c 14 ca 9a 10 e3 a0 1b 59 b3 ce 3a ....Fyb..6X1................Y..:
0ac0 e5 b2 61 7c 0f 04 4e 6c 97 28 49 3b ea 79 af f7 fb 19 47 b7 2f d3 fc fc 8c 12 ca 9a 10 e3 a0 1b ..a|..Nl.(I;.y....G./...........
0ae0 59 03 ac b3 4e f6 44 46 62 dd b8 1e 89 ee 4d c7 27 01 a3 7e c6 81 b5 33 b5 3f 57 03 84 b2 26 c4 Y...N.DFb.....M.'..~...3.?W...&.
0b00 38 e8 46 d6 ac b3 4e fe 6c 99 e9 8b 7d 13 da be 91 8c 97 fb 34 c5 f6 51 9e 0e f7 d9 36 a6 1d 4e 8.F...N.l...}.......4..Q....6..N
0b20 06 fe a9 f9 f9 a6 f5 50 d6 84 18 07 dd c8 9a 73 d6 c9 9b d3 07 b6 63 c7 c4 2e 89 ef 31 8f fc 09 .......P.......s......c.....1...
0b40 cb 06 36 c3 ce 89 1d b1 6d 7c 7b 6c 1d f1 53 ac fb 86 4e ef 88 a5 83 3d 35 3f e7 b4 1e d6 59 13 ..6.....m|{l..S...N....=5?....Y.
0b60 62 1c 28 6b 83 64 c9 20 c7 bd e1 d8 25 ed 89 25 3e 4d 71 76 d5 40 bc 38 36 1b 38 35 1f 38 39 17 b.(k.d......%..%>Mqv.@.86.85.89.
0b80 97 d7 0f c2 86 e1 ad b0 7f b2 fd b9 ef 2d a3 da e0 44 e0 66 cd cf 3b ad 87 75 d6 84 18 03 ca da .............-...D.f..;..u......
0ba0 00 39 11 b8 09 5b c7 24 ec 82 b2 e0 49 ed b0 76 68 4b 98 16 f7 c3 ab 93 f3 81 d3 0b 81 53 0b a4 .9...[.$....I..vhK...........S..
0bc0 ac 4f cd 03 4e ce c5 b3 d0 69 d8 3e ae 3d 82 27 b5 8f f1 f8 03 93 db 63 cb 0c 6f cd cf 3d 2d 87 .O..N....i.>.=.'.......c..o..=-.
0be0 75 d6 84 18 07 ca da 00 d9 3a d3 07 fb 27 c7 14 6a 6c d9 3e aa 35 36 8e 6a 83 c7 21 d3 81 33 8b u........:...'..jl.>.56.j..!..3.
0c00 80 33 0b a5 ac 4f 47 c9 fa a4 94 35 4e cc 01 4e cc c2 e6 51 ad 71 70 4a 87 18 c7 59 31 b4 0d 1e .3...OG....5N..N...Q.qpJ...Y1...
0c20 dc bd ad f9 f9 a7 d5 70 ce 9a 10 e3 40 59 a7 f1 dc f9 e7 0a 56 0f 8f ff 45 65 1b fd 3c 71 72 a5 .......p....@Y......V...Ee..<qr.
0c40 0f 70 d6 1f 38 bb 38 2a aa b0 17 00 a7 e7 47 f5 ac e7 00 27 66 03 27 66 01 c7 67 60 d5 60 0f 1c .p..8.8*......G....'f.'f..g`.`..
0c60 9a e6 65 7b ac d1 5e b8 74 fc 80 e6 af 41 5a 0d 65 4d 88 71 d0 8d ac 59 67 9d 3c 39 7b 68 17 02 ..e{..^.t....AZ.eM.q...Yg.<9{h..
0c80 46 c7 4f d6 1b fc 3c 71 73 d7 38 e0 dc 12 e0 9c 7f 94 b0 fd a5 ac cf 2e 02 ce 2c 88 ea 5d ab 3d F.O...<qs.8...............,..].=
0ca0 eb d9 c0 f1 99 c0 f1 19 b8 b1 e5 0f 6c 18 d6 d2 76 de 7a a4 27 8e ed 59 af f9 6b 90 56 43 59 13 ............l...v.z.'..Y..k.VCY.
0cc0 62 1c 74 23 6b 80 75 d6 c9 91 e0 35 d3 b1 63 74 eb 38 45 bd 75 6c 3b 3c 3e 3c 33 4a d4 4b ac 84 b.t#k.u....5..ct.8E.ul;<><3J.K..
0ce0 1d d5 bb 56 87 c3 cf cc 07 4e cf 03 4e cd 05 4e 5a 7a d6 38 36 0d 7b 26 77 40 a0 55 69 d8 b6 91 ...V.....N..N..NZz.86.{&w@.Ui...
0d00 9e 38 bc 65 89 e6 af 41 5a 0d 65 4d 88 71 d0 8d ac 59 67 9d 3c d9 3e 6f 28 f6 8e 77 dc b3 5e 33 .8.e...AZ.eM.q...Yg.<.>o(..w..^3
0d20 b4 25 c2 0f 4e 07 ce 2f b5 ca 12 99 73 fe c0 39 ab a1 f0 33 0b a2 c9 7a a6 59 d6 d7 36 fa 62 e3 .%..N../....s..9...3...z.Y..6.b.
0d40 70 4b ef 7a e7 98 d6 d8 bf 76 96 e6 af 41 5a 0d 65 4d 88 71 d0 8d ac 39 67 9d 3c d9 b9 60 38 82 pK.z.....v...AZ.eM.q...9g.<..`8.
0d60 27 c5 7e 25 f8 96 51 3f e3 6e e0 24 29 e6 0b 4b 81 0b cb a2 fe b5 92 b6 b9 87 6d af 67 3d 13 38 '.~%..Q?.n.$)..K..........m.g=.8
0d80 3e 1d 38 36 15 38 32 19 eb 86 b5 34 5f 6c b6 7d b4 27 f6 af 9b ad f9 6b 90 56 c3 3a 6b 42 8c 03 >.86.82....4_l.}.'.....k.V.:kB..
0da0 65 9d c6 b3 65 86 8f cd d0 b4 75 76 8c 6d 83 33 6b 7c a3 89 3a 5a ce 2f 05 ce ab bd 6b eb 9e f5 e...e.....uv.m.3k|..:Z./....k...
0dc0 1c e0 e4 ac 28 59 4f 03 8e 4d 01 8e 4c c6 b5 0d 3e d8 ea d7 4a 0e ad 8f f8 09 47 76 ac d6 fc 35 ....(YO..M..L...>...J.....Gv...5
0de0 48 cb 61 9d 35 21 c6 80 b2 4e e3 d9 b3 74 3c 76 8d fd 39 86 a8 f7 4f 6e 8f 0d 23 3c 65 af f9 fc H.a.5!...N...t<v..9...On..#<e...
0e00 92 28 39 2f 07 2e 5a 27 aa 97 7d 7e 89 1d 59 cf 8e 92 f5 0c e0 f8 54 e0 e8 14 e0 c8 24 c0 34 01 .(9/..Z'..}~..Y.......T.....$.4.
0e20 bb 26 b4 46 f0 a4 76 08 18 d5 1a 67 42 76 6a fe 1a a4 d5 b0 ce 9a 10 e3 40 59 a7 f1 9c 0a de 8a .&.F..v....gBvj.........@Y......
0e40 6d 63 da c4 2c d1 1a d6 02 f7 b6 f4 02 4e cf 91 42 be b8 0c b8 b8 02 b8 b4 02 b8 b4 52 fe 7b 71 mc..,........N..B...........R.{q
0e60 b9 ad ac cf a9 c3 e0 73 a3 64 ad ce 57 4f 05 8e 4e 06 8e 4c 04 42 c7 23 7c db ef d8 f8 47 53 ac .......s.d..WO..N..L.B.#|....GS.
0e80 1b da 0a d7 2f 9f d1 fc 35 48 ab e1 9c 35 21 c6 81 b2 4e e3 b9 7d ed 12 d6 f8 d9 de 10 65 cf b8 ..../...5H...5!...N..}.......e..
0ea0 36 38 34 e3 67 60 ff ef 40 88 2f 70 76 be 14 f3 a5 15 c0 e5 95 96 5c 52 65 ed 0f 9c 5f 0c 9c 5d 684.g`..@./pv.........\Re..._..]
0ec0 00 9c 99 17 25 eb 68 43 e0 47 65 af 1a a1 63 81 a0 01 b8 38 a3 09 96 0d fa 11 91 91 8f 35 7f 0d ....%.hC.Ge...c....8.........5..
0ee0 d2 6a 28 6b 42 8c 83 6e 64 cd 3a eb e4 cb c6 c9 7d 70 70 8a 45 d8 5b 46 fc 88 07 9b 7b 00 07 bc .j(kB..nd.:.....}pp.E.[F....{...
0f00 81 90 81 c0 e1 3f 80 33 73 a5 a0 af ac 92 51 65 7d 71 29 70 c1 1f 38 b7 28 4a d6 73 81 d3 6a af .....?.3s.....Qe}q)p..8.(J.s..j.
0f20 7a 7a d4 10 f8 64 e0 c8 04 20 74 1c 70 78 0c b0 a7 0f 94 95 1e 78 78 66 87 e6 e7 9e 96 43 59 13 zz...d....t.px.......xxf.....CY.
0f40 62 1c 74 23 6b 80 75 d6 c9 95 63 7b d6 63 eb 28 39 14 1e 34 a9 1d b6 8d 6a 01 04 f5 03 0e fc 1e b.t#k.u...c{.c.(9..4....j.......
0f60 25 eb 21 80 69 38 70 7a ba 45 d8 97 57 02 97 96 01 17 96 44 f5 aa 17 ca 1e f8 e9 39 b2 57 7d 72 %.!.i8pz.E..W......D.......9.W}r
0f80 7a 54 af 7a 72 d4 5c f5 78 20 74 0c 70 78 14 b0 ad 23 c2 e7 d7 45 e4 43 de 6a 34 39 43 59 13 62 zT.zr.\.x.t.px...#...E.C.j49CY.b
0fa0 1c 74 23 6b d6 59 27 5f 22 1e 85 63 c3 84 1e f2 af 68 8d 68 85 f3 8b da 01 41 7d e5 30 f8 41 1f .t#k.Y'_"..c.....h.h.....A}.0.A.
0fc0 e0 f0 60 c0 34 0c 38 3a 02 38 31 0e 38 37 d7 22 ea 0b 51 73 d5 aa a8 4f cf 06 4e ce 00 4e 44 0d ..`.4.8:.81.87."..Qs...O..N..ND.
0fe0 7f 1f 9b 04 1c 19 2f 87 bf 0f 8f 06 f6 f6 c5 cb 0d 2d 11 be b2 ad e6 e7 9d d6 43 59 13 62 1c 74 ....../..........-........CY.b.t
1000 23 6b ce 59 27 6f fe b9 78 12 eb 47 b4 c7 e6 e1 2d 70 7f 6d 07 20 b0 0f 10 fc 1b 70 60 80 9c b7 #k.Y'o..x..G....-p.m.......p`...
1020 3e 3c 44 0a fb 88 9f 94 f6 d1 51 c0 a9 a9 c0 b9 f9 52 d4 67 e6 02 a7 67 59 44 7d 5c 15 f5 04 c0 ><D.......Q......R.g...gYD}\....
1040 34 16 38 34 12 d8 db 17 d8 d6 01 cf 56 fd 80 88 50 7f cd cf 39 ad 87 75 d6 84 18 07 ca da 40 f9 4.84........V...P...9..u......@.
1060 e7 c2 71 6c 1e d7 09 ca 8a 1f 80 7d bf da f6 ae 0f f9 4a 61 87 fe 01 84 0e 95 ff 1e 1e 02 1c 1a ..ql.......}......Ja............
1080 0c 1c 1e 0a 98 46 02 47 46 03 47 c6 01 47 c6 00 a1 a3 80 c3 7e 40 f0 40 20 b0 1f b0 a3 0b b0 dd .....F.GF.G..G......~@.@........
10a0 0b 08 68 8f b0 39 b5 11 f9 f8 51 ac ed 18 3c 78 30 72 e7 ce 8d cf 3e fb 0c 0b 16 2c 30 af 2f 58 ..h..9....Q...<x0r....>....,0./X
10c0 b0 20 d6 ac 59 63 5e fe fe fb ef 51 b0 60 41 cc 9c 39 d3 ee 71 1e 3d 7a 84 22 45 8a e0 cc 99 33 ....Yc^....Q.`A..9..q.=z."E....3
10e0 9a bf b6 5a 85 75 d6 84 18 03 ca da 60 b9 77 fb 3a c2 fd 9b e2 d5 f6 ce c0 be de 72 ee 7a ff ef ...Z.u......`.w.:..........r.z..
1100 51 3d ec 81 b2 97 7d 68 90 4c 88 af 5c 77 70 80 bc 18 2d b8 bf dc 3f b0 37 b0 b7 17 b0 a7 07 b0 Q=....}h.L..\wp...-...?.7.......
1120 bb 1b b0 b3 0b b0 a3 13 b0 ad 03 9e ae 68 82 88 83 71 df b5 ac 45 8b 16 f8 f9 e7 9f cd cb a7 4e .............h...q...E.........N
1140 9d 42 ba 74 e9 d0 bd 7b 77 f3 ba d0 d0 50 0c 1c 38 d0 e1 71 16 2d 5a 84 b0 b0 30 28 8a ac 3b 2e .B.t...{w....P..8..q.-Z...0(..;.
1160 54 a8 90 e6 af 71 4a 85 75 d6 84 18 07 ca da 80 89 b8 72 00 8f 97 36 01 f6 f6 8c 12 76 5f 29 e2 T....qJ.u.........r...6.....v_).
1180 fd bf 4b 29 1f 18 60 15 6f 60 7f 7f 39 64 1e d4 37 9a a8 7f 01 76 75 95 a2 de ee 85 57 9b 5a 23 ..K)..`.o`..9d..7....vu.....W.Z#
11a0 cc bf 69 bc da 30 7d fa 74 14 2b 56 cc 66 b9 61 c3 86 28 5f be bc 79 dd 84 09 13 b0 7d fb f6 04 ..i..0}.t.+V.f.a..(_..y.....}...
11c0 c9 cb 48 b2 e6 9c 35 21 c6 81 b2 36 68 1e 87 cc c6 93 e5 4d 80 3d 3d e5 90 78 60 9f 28 69 ff 16 ..H...5!...6h......M.==..x`.(i..
11e0 2d fd a2 24 dd 47 ee 17 43 d4 9d 81 ed 1d 81 6d ed 11 b1 a0 1e 22 ff bd 1a af e7 3f 7d fa 34 84 -..$.G..C......m.....".....?}.4.
1200 10 b8 72 e5 0a 14 45 c1 4f 3f fd 84 a0 a0 20 64 c8 90 01 77 ee dc 81 a2 28 68 d9 b2 25 c2 c2 c2 ..r...E.O?.....d...w....(h..%...
1220 e0 eb eb 8b dc b9 73 a3 7d fb f6 68 dc b8 31 f2 e6 cd 8b 6f bf fd 16 5d bb 76 45 9e 3c 79 b0 7a ......s.}..h..1....o...].vE.<y.z
1240 f5 6a 5c ba 74 09 df 7c f3 0d b2 66 cd 8a 7a f5 ea a1 65 cb 96 50 14 05 91 91 91 18 34 68 10 ea .j\.t..|...f..z...e..P......4h..
1260 d7 af 8f 26 4d 9a a0 4b 97 2e 08 0f 0f c7 9d 3b 77 50 a4 48 11 08 21 30 67 ce 1c 94 2a 55 0a 42 ...&M..K.......;wP.H..!0g...*U.B
1280 08 ec d8 91 7a ca cd 28 6b 42 8c 83 6e 64 cd 3a 6b 0d 72 70 1a 9e ac 74 07 f6 74 8f ea 65 ff 2a ....z..(kB..nd.:k.rp...t..t..e.*
12a0 7b da 81 bd a5 9c 03 7b cb 65 b3 a4 7b ca 7d 77 75 03 76 5a 8b ba 03 22 16 37 44 e4 dd 2b 09 7a {......{.e..{.}wu.vZ...".7D..+.z
12c0 fe 82 05 0b 9a e7 ac dd dd dd a1 28 0a f2 e7 cf 8f 75 eb d6 41 51 14 34 6f de dc bc 6f af 5e bd ...........(.....u..AQ.4o...o.^.
12e0 50 a8 50 21 5c bc 78 11 ff fe fb 2f 5a b7 6e 0d 45 51 e0 ec ec 8c d5 ab e5 fd c7 ed f5 ac a7 4d P.P!\.x..../Z.n.EQ.............M
1300 9b 86 f2 e5 cb 23 22 22 02 8a a2 a0 71 e3 c6 18 3a 74 28 14 45 c1 83 07 0f 20 84 30 0f b5 0f 1f .....#""....q...:t(.E......0....
1320 3e 1c 41 41 41 da ff 5e e2 19 ca 9a 10 e3 a0 1b 59 03 ac b3 d6 22 11 db 07 e2 c9 f2 c6 72 ee 79 >.AAA..^........Y....".......r.y
1340 77 77 d9 6b de d3 43 ca 7b 4f 4f cb f2 ee ee 72 9f 5d 5d 2d 73 d4 db bd f0 72 63 2b 84 cf fa 16 ww.k..C.{OO....r.]]-s....rc+....
1360 8f af 1e 4e f0 73 37 6f de 1c ed da b5 c3 d9 b3 67 d1 ab 57 2f 28 8a bc a8 ac 67 cf 9e 38 71 e2 ...N.s7o........g..W/(....g..8q.
1380 04 bc bd bd cd fb f6 ea d5 0b 3f fe f8 63 8c 63 c4 25 eb 4a 95 2a e1 8f 3f fe 30 2f cf 9f 3f 1f ..........?..c.c.%.J.*..?.0/..?.
13a0 a5 4a 95 82 a2 58 64 7d f6 ec 59 cd 7f 0f 89 09 65 4d 88 71 d0 8d ac 59 67 ad 4d 22 fe 32 e1 f1 .J...Xd}..Y.....eM.q...Yg.M".2..
13c0 c2 fa 08 9b f1 0d 9e ad 69 2e 65 bc ab 5b b4 44 09 7a 67 e7 28 49 77 c4 eb ad ed f0 64 49 7d 44 ........i.e..[.D.zg.(Iw.....dI}D
13e0 cc 71 45 d8 9c 9a 0e af fe 8e 2d 53 a6 4c c1 c7 1f 7f 8c 59 b3 66 99 7b d3 63 c7 8e 85 b3 b3 33 .qE.......-S.L.....Y.f.{.c.....3
1400 a6 4d 9b 86 ad 5b b7 9a f7 ed d5 ab 97 cd c5 67 6a e2 92 75 e1 c2 85 e1 ec ec 0c 77 77 77 b8 bb .M...[.........gj..u.......www..
1420 bb a3 76 ed da 70 76 76 86 a2 58 64 fd ef bf ff 6a fe 7b 48 4c 28 6b 42 8c 83 6e 64 cd 39 6b 6d ..v..pvv..Xd....j.{HL(kB..nd.9km
1440 f2 f8 da 11 44 2c 69 02 6c 6b 8f 27 4b 1a e0 d1 ec 6a 50 96 d4 c7 f3 3f 5b e1 d5 96 36 c0 36 2f ....D,i.lk.'K....jP....?[...6.6/
1460 b3 9c 5f 6e f4 c4 b3 35 cd f0 78 41 2d 44 cc ad 8e ff 56 fd 00 ec e8 84 b0 79 6e 89 92 f5 f1 e3 .._n...5..xA-D....V......yn.....
1480 c7 21 84 80 9b 9b 9b 79 9e fa d0 a1 43 c8 98 31 23 7e f8 e1 07 3c 78 f0 c0 bc 6f 62 65 fd f5 d7 .!.....y....C..1#~...<x...obe...
14a0 5f 63 cc 98 31 36 eb 6e dc b8 01 45 49 fd b2 66 9d 35 21 c6 81 b2 36 70 1e 45 44 c2 6b ce 09 1c _c..16.n...EI..f.5!...6p.ED.k...
14c0 5f f8 4b 54 cf b9 0b 5e 6f f3 c2 b3 35 1e 50 fc eb 21 62 6e 75 84 cf ac 82 88 f9 df e1 d1 ac 6a _.KT...^o...5.P..!bnu..........j
14e0 88 98 57 03 ca b2 46 78 fe a7 a7 4d cf 7b d9 8c 91 e8 be 38 71 43 c9 ef be fb 2e be fc f2 4b f3 ..W...Fx...M.{.....8qC........K.
1500 72 64 64 24 f2 e5 cb 87 6f be f9 c6 66 bf f8 c8 fa d8 b1 63 c8 9f 3f 3f 14 45 81 b7 b7 37 ce 9e rdd$....o...f......c..??.E...7..
1520 3d 8b e9 d3 a7 a3 5a b5 6a 78 fc 58 fe 41 91 80 80 00 f3 fc 78 6a 97 b5 a2 b0 ce 9a 10 a3 40 59 =.....Z.jx.X.A......xj........@Y
1540 1b 38 4b 82 af a3 eb ca 1b 18 3a 77 63 d4 9c 74 77 79 01 99 39 72 be fa d5 ae ae 96 b9 6b 9b f4 .8K.......:wc..twy..9r.......k..
1560 c4 d3 dd 7d d0 7d e6 3e 74 59 72 15 41 67 13 2e 3d 77 77 f7 18 12 ae 5f bf be cd c5 86 8b 16 2d ...}.}.>tYr.Ag..=ww...._.......-
1580 42 89 12 25 50 bc 78 71 f4 ec d9 d3 bc be 7b f7 ee c8 9b 37 2f 2a 56 ac 88 c0 c0 40 44 46 46 a2 B..%P.xq......{....7/*V....@DFF.
15a0 66 cd 9a 70 73 73 83 bb bb 3b 1e 3f 7e 8c c8 c8 48 0c 19 32 04 b5 6b d7 86 87 87 07 9a 36 6d 8a f..pss...;.?~...H..2..k......6m.
15c0 6b d7 ae 41 51 14 34 68 d0 00 42 08 d4 af 5f 1f c1 c1 c1 9a ff 3e 12 1a d6 59 13 62 1c 28 6b 83 k..AQ.4h..B..._......>...Y.b.(k.
15e0 e6 f2 e5 cb e8 b2 e0 24 06 04 3e c3 80 6d 77 31 7a f1 a6 a8 ab c1 63 4b 6f 4b 02 2d f9 7d c1 5e .......$..>..mw1z.....cKoK.-.}.^
1600 f4 d9 fc 08 bf 6e 78 88 3e cb 2e 6a 7e 5e 46 0a e7 ac 09 31 0e 94 b5 81 f2 30 ec 31 36 07 ec c0 .....nx.>..j~^F....1.....0.16...
1620 e0 85 bb d1 73 ee 7e 78 2d bd 8a 81 07 5e 62 e0 81 97 e8 bd e9 0e a6 2e db 88 eb 3b 86 ca bb 94 ....s.~x-....^b............;....
1640 45 4f b0 1a 59 7f 7d 64 f3 44 78 2f 0a 46 df ad 11 f8 2d 20 12 fd 36 47 e0 a7 19 a7 30 70 c1 3e EO..Y.}d.Dx/.F....-...6G....0p.>
1660 6c de b5 1f 77 ee 27 7c 0e 9b 49 58 28 6b 42 8c 83 6e 64 cd 3a eb e4 4b 64 a4 82 25 6b b7 62 c0 l...w.'|..IX(kB..nd.:..Kd..%k.b.
1680 82 bd 18 b0 f1 6f 4c 38 fc 18 e3 0e 84 a3 f3 aa eb f0 3d f4 0a be 87 5f 63 e0 c1 97 e8 15 10 86 .....oL8..........=...._c.......
16a0 36 73 4f a3 db ec 83 58 b0 7c 19 fe 5c 3b 1f 27 02 26 e2 da ce 91 38 b0 71 1a 56 ac 5a 82 31 fe 6sO....X.|..\;.'.&....8.q.V.Z.1.
16c0 9b d1 71 ce 11 78 f9 5f 42 bf 9d 91 f8 7d d7 13 fc b6 2d 12 fd b6 44 a0 f5 dc 8b e8 b3 ee 2e 7a ..q..x._B....}....-...D........z
16e0 2c bb 82 0e d3 43 30 67 cd 2e fc 7d 23 f5 ce 07 eb 3d 94 35 21 c6 41 37 b2 06 58 67 9d 1c 09 0c ,....C0g...}#....=.5!.A7..Xg....
1700 0c 42 cf 39 c1 18 ba fd 3a e6 9f 7b 8e f9 e7 65 e6 9e 7d 86 9f 17 5c 80 6f c8 2b f8 1e 7a 85 81 .B.9....:..{...e..}...\.o.+..z..
1720 07 5f c2 27 e8 39 bc f7 fe 87 5f 37 85 a1 d3 ca 5b f8 79 ee 45 b4 9a 71 12 7d 96 9e 40 cb 99 a7 ._.'.9...._7....[.y.E..q.}..@...
1740 e0 b5 fc 1a 7a 6c 79 88 fe fb 9e c2 27 58 ee ab ca ba e7 ba fb 68 3b ff 12 06 06 3c c2 80 2d e1 ....zly.....'X.......h;....<..-.
1760 f8 7d 53 38 ba 2d bf 85 6e 33 0f 60 de 9a d4 73 57 b0 d4 14 ca 9a 10 e3 a0 1b 59 b3 ce 3a e9 33 .}S8.-..n3.`...sW.........Y..:.3
1780 75 d9 56 f8 ae 3d 8b f9 e7 9f 63 c1 85 17 58 78 e1 05 16 5e 7c 81 45 17 e5 bf 03 b7 df 41 a7 55 u.V..=....c...Xx...^|.E......A.U
17a0 37 e1 b3 ff 05 7c 82 9f 63 c0 be 67 f0 de fd 14 fd 77 28 f8 2d 20 12 6d e6 5f c2 a8 e0 70 4c 39 7....|..c..g.....w(.-..m._...pL9
17c0 f2 14 3e 5b ff 45 c7 15 d7 2d fb 06 3e 83 f7 9e a7 e8 bf e3 09 7e 0b 88 84 e7 dc 8b e8 bb fe 2e ..>[.E...-..>........~..........
17e0 7c 03 1e c1 67 4b 38 bc 37 85 a3 ff 9f 61 e8 b7 21 0c bf f8 5f c1 6f b3 f7 e0 d2 c5 f3 9a bf 26 |...gK8.7....a..!..._.o........&
1800 69 29 94 35 21 c6 41 37 b2 e6 9c 75 d2 66 c4 92 dd 18 b5 e7 36 16 9c 7f 2e 05 7d e9 05 16 5f 7e i).5!.A7...u.f......6.....}..._~
1820 01 ff cb 2f e0 7f f9 25 fc 2f bf c4 e2 cb 2f 30 20 e0 36 ba ad fb 17 de 7b ff 83 f7 9e a7 f8 7d .../...%./..../0..6.....{......}
1840 e7 13 f4 df 16 89 8e 4b af e3 f7 cd b7 30 fd d8 7f 98 7a f4 29 26 9b 9e a2 eb 8a bf d1 73 d3 c3 .......K.....0....z.)&.......s..
1860 18 fb b6 5b 74 15 fd fe fc 17 83 77 44 c0 77 db 23 f8 6c 7d 04 ef cd e1 e8 bf 51 ca ba cf ba 87 ...[t......wD.w.#.l}......Q.....
1880 e8 b9 fa 3e 3a cf 38 88 8b 17 2f 68 fe da a4 95 b0 ce 9a 10 e3 40 59 a7 c1 fc 3a 7b 1f c6 1f 8e ...>:.8.../h.........@Y...:{....
18a0 30 8b 7a f1 a5 17 f0 bf f2 12 4b fe 7a 89 a5 7f bd c4 d2 ab f2 df 25 7f bd c4 92 2b 2f f1 db a6 0.z.......K.z.........%....+/...
18c0 9b f0 5a 7a 15 bf 6d 57 f0 db b6 48 f4 58 77 1f 9d 96 5c c6 cc 93 cf 30 e3 f8 7f 98 76 ec 3f 4c ..Zz..mW...H.Xw...\....0....v.?L
18e0 39 f2 14 93 42 9f a0 e5 ac b3 f8 6d 47 24 fa ef 50 d0 6b 63 18 da 2c b8 8c 3e eb 6f 63 e8 ae 08 9...B......mG$..P.kc..,..>.oc...
1900 0c d9 11 81 41 db 1e 61 e0 d6 47 18 b0 39 1c bf 6f 0c c7 6f 1b c2 d0 77 fd 43 f4 5e 2b d3 71 ce ....A..a..G..9..o..o...w.C.^+.q.
1920 71 ec db 97 7a ee bf ad f7 b0 ce 9a 10 63 40 59 a7 b1 0c 5d bc 1b d3 8f 3d c1 7c 2b 51 2f b9 22 q...z........c@Y...]....=.|+Q/."
1940 e5 bc ec ef 57 58 fe f7 2b ac b8 f6 0a cb af c9 9f 97 5e 95 c2 1e 17 12 86 0e 8b 2f a1 eb aa 5b ....WX..+.........^......../...[
1960 68 35 fb 2c 66 9e 7c 8a 59 a7 9e 61 c6 09 6b 59 3f c5 1f bb 1e a0 cd 82 cb e8 b8 ec 1f 78 f9 5f h5.,f.|.Y..a..kY?............x._
1980 c1 a0 ed 61 18 be f7 31 86 ee 7e 8c 21 3b 23 30 68 fb 23 9b 79 eb df fe 0c 43 df f5 61 66 59 f7 ...a...1..~.!;#0h.#.y....C..afY.
19a0 5e fb 10 3d 16 9c c4 a1 90 03 9a bf 56 a9 3d ac b3 26 c4 38 50 d6 69 28 63 17 6f c1 c8 a0 87 98 ^..=........V.=..&.8P.i(c.o.....
19c0 77 4e ce 51 2f 8a ea 51 2f fd eb a5 59 d2 2b ff 79 85 55 d7 5f 63 d5 75 f9 f3 f2 bf 5f 61 59 94 wN.Q/..Q/...Y.+.y.U._c.u...._aY.
19e0 b0 17 5f 7a 81 3e 1b fe c1 8c 93 4f 30 f7 ec 73 cc 3e fd 0c 33 4f fe 87 69 c7 9e 9a 87 c2 27 1e .._z.>.....O0..s.>..3O..i.....'.
1a00 7e 82 81 db ee a1 f7 ba 9b 18 1d 1c 89 91 81 91 f0 db fb 18 c3 76 3f c6 1f 3b 23 30 68 7b 44 9c ~....................v?..;#0h{D.
1a20 b2 ee bd f6 21 3a 4c 0b c1 ed 9b d7 35 7f cd 52 73 38 67 4d 88 71 a0 ac d3 48 36 05 ec c0 e0 2d ....!:L.....5..Rs8gM.q...H6....-
1a40 ff 60 ee 99 e7 98 7f ee 39 16 5e b0 f4 aa 97 5d 7d 89 15 d7 5e 61 d5 f5 57 58 7d e3 35 d6 dc 94 .`......9.^....]}...^a..WX}.5...
1a60 59 75 fd 35 56 44 09 7b e9 5f 2f e1 7f 59 5e 7c b6 e0 fc 73 cc 8b 92 f5 88 c0 30 78 2d be 84 29 Yu.5VD.{._/..Y^|...s......0x-..)
1a80 47 9e 98 65 3d 3e e4 09 c6 1e 50 30 3a 58 89 21 eb c1 db 23 cc 17 99 39 92 75 f7 15 ff e2 b7 59 G..e=>....P0:X.!...#...9.u.....Y
1aa0 bc 4a fc 4d 42 59 13 62 1c 74 23 6b d6 59 27 3e 37 fe f9 1b bf 2d 3a 88 d9 a7 9f 61 ee d9 e7 96 .J.MBY.b.t#k.Y'>7....-:....a....
1ac0 21 f0 cb 2f b0 24 6a f8 7b c5 3f af b0 ea c6 6b ac bd f5 1a eb 6e 03 6b 6f bd c6 ea 1b af cd bd !../.$j.{.?....k.....n.ko.......
1ae0 6b 29 eb 97 36 b2 9e 73 fa 19 46 04 3e 84 d7 a2 c4 c9 da db 81 ac 7b af 7d 88 ae 8b af 60 d3 d6 k)..6..s..F.>.........{.}....`..
1b00 ed 9a bf 7e a9 35 94 35 21 c6 41 37 b2 06 58 67 9d d8 4c 59 b2 19 c3 f6 dc 8f 5d d6 57 5f 45 f5 ...~.5.5!.A7..Xg..LY......].W_E.
1b20 ac 65 8f 7a ed ad d7 f1 96 f5 ac 93 cf 62 0c 83 27 95 ac 7b af 7d 88 b6 53 0f e0 51 38 ef 76 96 .e.z.........b..'..{.}..S..Q8.v.
1b40 98 50 d6 84 18 07 dd c8 9a 75 d6 89 cb d5 2b 97 d0 df ff 30 66 9e f8 0f b3 4f 3d c3 dc 33 cf 62 .P.......u....+....0f....O=..3.b
1b60 0c 83 2f bd fa 12 cb ad e6 ab 57 df 88 12 f5 75 29 f1 65 57 e5 95 e1 8b 2f cb fa 6b 79 d3 14 75 ../.......W....u).eW..../..ky..u
1b80 ce fa 19 a6 1f ff 2f 16 59 c7 9c b3 56 65 1d d7 9c b5 9a 6e 8b af 60 e9 9a cd 9a bf 8e a9 31 94 ....../.Y...Ve.....n..`.......1.
1ba0 35 21 c6 41 37 b2 e6 9c 75 e2 b2 71 db 2e 0c da 7e 17 33 4e fc 87 59 a7 9e 61 ce 99 67 f2 02 b3 5!.A7...u..q....~.3N..Y..a..g...
1bc0 f3 cf b1 e8 a2 ac ab 96 bd 6b db 8b cc 56 fc 13 25 6a b5 57 7d e5 25 16 5d 7a 81 05 17 5e 60 fe .........k...V..%j.W}.%.]z...^`.
1be0 b9 e7 98 7b e6 39 66 9f 7a 86 99 51 57 83 3b 92 75 42 af 06 8f 9e 5f 66 04 22 f2 71 a4 e6 af 65 ...{.9f.z..QW.;.uB...._f.".q...e
1c00 6a 0b eb ac 09 31 0e 94 75 2a cf d8 65 81 18 77 e8 31 a6 1f ff 0f 33 4f 3e b3 0c 85 47 f5 ae 17 j....1..u*..e..w.1....3O>...G...
1c20 5d 92 37 41 51 7b d8 cb ae ca 39 ec 65 57 e5 f2 92 28 51 2f be 64 e9 55 9b 87 c0 4f 3d 83 5f e0 ].7AQ{....9.eW...(Q/.d.U...O=._.
1c40 43 b4 5f 74 09 13 43 9f 60 52 e8 53 4c 38 f4 04 e3 0e 2a 18 b3 5f c1 a8 a0 48 8c d8 17 89 e1 7b C._t..C.`R.SL8....*.._...H.....{
1c60 1e 63 e8 2e 47 b2 8e 5d d4 bd d7 3e c4 2f 0b cf 61 df ee dd 9a bf 96 a9 31 ac b3 26 c4 18 50 d6 .c..G..]...>./..a.......1..&..P.
1c80 a9 3c 3e 8b 0f 62 ea 91 a7 98 76 ec 3f 4b ef fa f4 33 cc 53 e7 ae 2f c8 2b bc 17 5f b6 48 5b 8d .<>..b....v.?K...3.S../.+.._.H[.
1ca0 ff 95 a8 2b c0 a3 44 bd e0 fc 73 cc 3b f7 1c 73 ce 3c 93 bd ea 93 ff 61 44 50 18 da 2d bc 88 89 ...+..D...s.;..s.<.....aDP..-...
1cc0 a1 4f 2c bd ea 83 0a 46 ef 57 30 32 28 12 7e 66 59 47 d8 b9 83 59 b8 f9 0e 66 8e 64 dd d1 ff 06 .O,....F.W02(.~fYG...Y...f.d....
1ce0 96 ae fe 53 f3 d7 32 b5 85 75 d6 84 18 07 ca 3a 95 67 f1 ba ed f0 de fa 2f a6 1e 7d 1a d5 bb b6 ...S..2..u.....:.g....../..}....
1d00 1a 0e 8f ea 61 2f b8 f0 dc 7c 4f f0 45 97 e4 5c f6 e2 4b 56 92 be 10 d5 a3 3e f7 1c 73 cf 3c 33 ....a/...|O.E..\..KV.....>..s.<3
1d20 cf 55 ab 77 2f 9b 1c 75 43 94 09 87 e2 31 5f 1d cb ed 46 1d c9 ba db 9c 23 38 7a e4 b0 e6 af 65 .U.w/..uC....1_...F.....#8z....e
1d40 6a 0b e7 ac 09 31 0e 94 35 13 67 86 0d 1b 86 bf ff fe 5b f3 76 30 b6 a1 ac 09 31 0e ba 91 35 eb j....1..5.g.......[.v0....1...5.
1d60 ac f5 9b 92 25 4b e2 e8 d1 a3 9a b7 83 b1 0d 65 4d 88 71 d0 8d ac 01 d6 59 eb 35 94 b5 3e 43 59 ....%K.........eM.q.....Y.5..>CY
1d80 13 62 1c 74 23 6b d6 59 eb 37 94 b5 3e 43 59 13 62 1c 74 23 6b ce 59 eb 37 94 b5 3e c3 3a 6b 42 .b.t#k.Y.7..>CY.b.t#k.Y.7..>.:kB
1da0 8c 03 65 cd c4 19 ca 5a bf 61 9d 35 21 c6 80 b2 66 e2 0c 65 ad cf b0 ce 9a 10 e3 40 59 33 71 86 ..e....Z.a.5!...f..e.......@Y3q.
1dc0 b2 d6 67 38 67 4d 88 71 a0 ac 99 38 43 59 eb 33 94 35 21 c6 41 37 b2 66 9d b5 7e 43 59 eb 33 94 ..g8gM.q...8CY.3.5!.A7.f..~CY.3.
1de0 35 21 c6 41 37 b2 06 58 67 ad d7 50 d6 fa 0c 65 4d 88 71 d0 8d ac 59 67 ad df 50 d6 fa 0c 65 4d 5!.A7..Xg..P...eM.q...Yg..P...eM
1e00 88 71 d0 8d ac 39 67 ad df 50 d6 fa 0c eb ac 09 31 0e 94 35 13 67 28 6b fd 86 75 d6 84 18 03 ca .q...9g..P......1..5.g(k..u.....
1e20 9a 89 33 94 b5 3e c3 3a 6b 42 8c 03 65 cd c4 99 37 91 75 50 50 10 5c 5c 5c 50 b6 6c 59 f3 ba 31 ..3..>.:kB..e...7.uPP.\\\P.lY..1
1e40 63 c6 a0 7d fb f6 89 6e cf 9d 3b 77 f0 c1 07 1f 68 fe ba 68 1d ce 59 13 62 1c 28 6b 26 ce bc 69 c..}...n..;w....h..h..Y.b.(k&..i
1e60 cf 7a fd fa f5 36 b2 3e 71 e2 04 f6 ee dd 6b 5e ae 5d bb 36 66 ce 9c 19 ef e3 2d 5b b6 0c 2d 5b .z...6.>q.....k^.].6f.....-[..-[
1e80 b6 4c f1 d7 21 7b f6 ec 38 7b f6 ac e6 bf 0f 35 94 35 21 c6 41 37 b2 66 9d b5 7e 93 d4 b2 8e 9e .L..!{..8{.....5.5!.A7.f..~.....
1ea0 84 ca ba 4d 9b 36 58 b4 68 51 8a bf 0e 94 35 21 44 2b 74 23 6b 80 75 d6 7a 8d 3d 59 47 46 46 62 ...M.6X.hQ....5!D+t#k.u.z.=YGFFb
1ec0 d0 a0 41 a8 5f bf 3e 9a 34 69 82 2e 5d ba 20 3c 3c 1c 8a a2 20 3c 3c 1c ed db b7 47 e9 d2 a5 51 ..A._.>.4i..]..<<....<<....G...Q
1ee0 b7 6e 5d f8 fa fa 9a 65 bd 77 ef 5e 9b 61 f1 e1 c3 87 23 7f fe fc f8 fc f3 cf 51 af 5e 3d 6c d8 .n]....e.w.^.a....#.......Q.^=l.
1f00 b0 01 b7 6e dd 42 e3 c6 8d d1 a2 45 0b d4 ab 57 0f 6d db b6 b5 79 ee 0f 3f fc 10 37 6e dc 80 a2 ...n.B.....E...W.m...y..?..7n...
1f20 c8 2b a2 eb d6 ad 0b 0f 0f 0f 54 af 5e 1d 5d ba 74 81 a2 28 70 73 73 83 93 93 13 fc fc fc 50 a9 .+........T.^.].t..(pss.......P.
1f40 52 25 64 ce 9c 19 03 07 0e 74 d8 ee 1d 3b 76 a0 76 ed da f8 e9 a7 9f d0 a8 51 23 cc 9e 3d db fc R%d......t...;v.v........Q#..=..
1f60 9c 2d 5b b6 44 86 0c 19 e0 ea ea 8a 7a f5 ea e1 d2 a5 4b 0e 8f 15 d7 39 24 45 28 6b 42 8c 83 6e .-[.D.......z.....K....9$E(kB..n
1f80 64 cd 3a 6b fd c6 9e ac a7 4d 9b 86 f2 e5 cb 23 22 22 02 8a a2 a0 71 e3 c6 18 3a 74 28 14 45 81 d.:k.....M.....#""....q...:t(.E.
1fa0 9f 9f 1f be fc f2 4b 84 87 87 23 32 32 12 0d 1b 36 b4 e9 59 47 ef 69 47 ef 59 0f 19 32 04 7d fb ......K...#22...6..YG.iG.Y..2.}.
1fc0 f6 85 a2 c8 2f 05 55 ab 56 35 6f 33 99 4c 70 71 71 81 a2 28 08 0b 0b 43 d1 a2 45 b1 61 c3 06 28 ..../.U.V5o3.Lpqq..(...C..E.a..(
1fe0 8a 82 fb f7 ef a3 68 d1 a2 e6 7d 9d 9d 9d 51 ab 56 2d 3c 7c f8 10 3b 77 ee c4 d8 b1 63 1d b6 7b ......h...}...Q.V-<|..;w....c..{
2000 e7 ce 9d 38 71 e2 84 f9 79 cb 96 2d 6b d3 93 8e de b3 76 74 2c 47 e7 90 54 a1 ac 09 31 0e ba 91 ...8q...y..-k.....vt,G..T...1...
2020 35 e7 ac f5 1b 7b b2 ae 54 e0 22 50 68 00 00 20 00 49 44 41 54 a9 12 fe f8 e3 0f f3 f2 fc f9 f3 5....{..T."Ph....IDAT...........
2040 51 aa 54 29 28 8a 82 0a 15 2a 60 d8 b0 61 e6 6d f3 e6 cd 4b 90 ac c7 8c 19 83 12 25 4a 60 c3 86 Q.T)(....*`..a.m...K.......%J`..
2060 0d 66 11 aa f1 f3 f3 83 8f 8f 0f 14 45 c1 a6 4d 9b 90 33 67 4e 44 46 46 9a b7 ef df bf df fc b3 .f..........E..M..3gNDFF........
2080 b3 b3 73 8c e1 75 47 ed be 71 e3 06 3a 76 ec 88 5a b5 6a a1 5e bd 7a c8 9f 3f 3f 96 2d 5b 66 de ..s..uG..q..:v..Z.j.^.z..??.-[f.
20a0 37 ba ac 1d 1d cb d1 39 24 55 58 67 4d 88 71 a0 ac 99 38 63 4f d6 85 0b 17 86 b3 b3 33 dc dd dd 7......9$UXgM.q...8cO.......3...
20c0 e1 ee ee 8e da b5 6b c3 d9 d9 19 8a a2 a0 50 a1 42 98 31 63 86 79 df e8 72 8e 4b d6 11 11 11 18 ......k.......P.B.1c.y..r.K.....
20e0 36 6c 18 8a 14 29 82 77 df 7d 17 a3 47 8f 36 6f 73 75 75 45 60 60 20 14 45 c1 ac 59 b3 1c 5e 15 6l...).w.}..G.6osuuE``..E..Y..^.
2100 ee ec ec 8c d5 ab 57 c7 bb dd cd 9b 37 47 9b 36 6d cc fb d6 a8 51 03 73 e6 cc 31 2f 47 97 b5 a3 ......W.....7G.6m....Q.s..1/G...
2120 63 39 3a 87 a4 0c eb ac 09 31 06 94 35 13 67 ec c9 fa eb af bf c6 98 31 63 6c d6 a9 f3 c8 2e 2e c9:......1..5.g........1cl......
2140 2e 6f d4 b3 be 79 f3 26 22 23 23 11 19 19 89 d5 ab 57 c3 c9 c9 09 07 0e 1c c0 bd 7b f7 50 b0 60 .o...y.&"##......W.........{.P.`
2160 41 3c 7e fc 18 8a a2 60 f3 e6 cd c8 91 23 87 4d cf fa d4 a9 53 08 0b 0b 83 a2 d8 97 b5 a3 76 17 A<~....`.....#.M....S.........v.
2180 29 52 04 fe fe fe e6 f5 d5 aa 55 73 28 6b 47 c7 8a ed 1c 92 f2 f7 c2 3a 6b 42 8c 03 65 cd c4 19 )R........Us(kG........:kB..e...
21a0 7b b2 9e 3e 7d 3a aa 55 ab 66 16 67 40 40 00 dc dd dd a1 28 0a 46 8d 1a 85 72 e5 ca 99 e7 ac eb {..>}:.U.f.g@@.....(.F...r......
21c0 d6 ad eb 50 d6 3f fc f0 03 26 4c 98 80 4b 97 2e a1 6f df be f0 f2 f2 42 50 50 10 14 45 c1 e3 c7 ...P.?...&L..K...o.....BPP..E...
21e0 8f 51 b0 60 41 84 84 84 60 cd 9a 35 68 de bc b9 f9 71 e1 e1 e1 28 5a b4 28 d6 ad 5b 07 45 91 f5 .Q.`A...`..5h....q...(Z.(..[.E..
2200 d7 65 ca 94 31 0f 3b db 93 b5 a3 76 57 af 5e 1d bd 7a f5 82 a2 48 e9 e6 cd 9b d7 46 d6 05 0a 14 .e..1.;....vW.^..z...H.....F....
2220 c0 91 23 47 b0 6a d5 2a 2c 5d ba d4 e1 b1 62 3b 87 a4 fc bd 70 ce 9a 10 e3 40 59 33 71 26 b6 ab ..#G.j.*,]....b;....p....@Y3q&..
2240 c1 87 0c 19 82 da b5 6b c3 c3 c3 03 4d 9b 36 c5 b5 6b d7 a0 28 0a 1e 3d 7a 04 2f 2f 2f 94 29 53 .......k....M.6..k..(..=z.///.)S
2260 06 0d 1a 34 40 8f 1e 3d 90 27 4f 1e 74 eb d6 0d 81 81 81 a8 54 a9 12 f2 e4 c9 83 ee dd bb 43 51 ...4@..=.'O.t.......T.........CQ
2280 a4 bc cb 94 29 83 9a 35 6b e2 cf 3f ff c4 f2 e5 cb 51 ad 5a 35 78 78 78 a0 76 ed da e6 79 61 2f ....)..5k..?.....Q.Z5xxx.v...ya/
22a0 2f 2f 1b 79 2a 8a 82 63 c7 8e a1 4e 9d 3a 68 da b4 29 dc dc dc b0 73 e7 4e 28 8a 82 fe fd fb 23 //.y*..c...N.:h..)....s.N(.....#
22c0 6f de bc a8 58 b1 a2 cd 55 dd 8e da 1d 1a 1a 8a 2f be f8 02 35 6b d6 84 87 87 07 4a 95 2a 85 f2 o...X...U......./...5k.....J.*..
22e0 e5 cb 9b 87 dd 07 0c 18 80 4a 95 2a a1 46 8d 1a e6 ab c1 63 3b 56 6c e7 90 94 a1 ac 09 31 0e ba .........J.*.F.....c;Vl......1..
2300 91 35 eb ac f5 1b bd dc 6e b4 58 b1 62 f8 fb ef bf 35 6f 87 5e 42 59 13 62 1c 74 23 6b 80 75 d6 .5......n.X.b....5o.^BY.b.t#k.u.
2320 7a 8d 5e 64 cd d8 86 b2 26 c4 38 e8 46 d6 ac b3 d6 6f 28 6b 7d 86 b2 26 c4 38 e8 46 d6 9c b3 d6 z.^d....&.8.F....o(k}..&.8.F....
2340 6f 28 6b 7d 86 75 d6 84 18 07 ca 9a 89 33 94 b5 7e c3 3a 6b 42 8c 01 65 cd d8 a4 4a 95 2a e6 bb o(k}.u.......3..~.:kB..e...J.*..
2360 70 a9 89 2e eb 49 93 26 21 73 e6 cc 9a b7 d5 e8 61 9d 35 21 c6 81 b2 66 6c 72 e5 ca 15 38 39 39 p....I.&!s......a.5!...flr...899
2380 e1 bb ef be 33 af b3 96 f5 dc b9 73 91 2d 5b b6 18 37 03 61 52 3e 9c b3 26 c4 38 50 d6 4c 8c 78 ....3......s.-[..7.aR>..&.8P.L.x
23a0 78 78 20 73 e6 cc 66 61 ab b2 9e 3b 77 2e 72 e5 ca 85 1c 39 72 68 de 46 86 b2 26 c4 48 e8 46 d6 xx.s..fa...;w.r....9rh.F..&.H.F.
23c0 ac b3 d6 4f ae 5c b9 82 6c d9 b2 99 7b d8 25 4b 96 c4 d0 a1 43 91 3b 77 6e 64 cd 9a 95 bd 6a 9d ...O.\..l...{.%K....C.;wnd....j.
23e0 84 b2 26 c4 38 e8 46 d6 00 eb ac f5 14 0f 0f 0f 64 c8 90 01 4e 4e 4e c8 9c 39 33 72 e5 ca 05 21 ..&.8.F.........d...NNN..93r...!
2400 04 7b d5 3a 0a 65 4d 88 71 d0 8d ac 59 67 ad af a8 bd 6b 21 84 39 ec 55 eb 2b 94 35 21 c6 41 37 .{.:.eM.q...Yg....k!.9.U.+.5!.A7
2420 b2 e6 9c b5 fe a2 f6 ae 55 59 b3 57 ad af b0 ce 9a 10 e3 40 59 33 b1 c6 ba 77 cd 5e b5 3e c3 3a ........UY.W.......@Y3...w.^.>.:
2440 6b 42 8c 01 65 cd 38 8c 87 87 07 d2 a7 4f cf 5e b5 0e c3 3a 6b 42 8c 03 65 cd 38 cc 95 2b 57 90 kB..e.8......O.^...:kB..e.8..+W.
2460 29 53 26 f6 aa 75 18 ce 59 13 62 1c d2 84 ac 8f 1f 3f 8e 81 03 07 32 c9 14 6f 6f 6f f8 f8 f8 68 )S&..u..Y.b......?....2..ooo...h
2480 de 8e b4 9a e5 cb 97 53 d6 84 10 87 e8 46 d6 6f 52 67 bd 62 c5 0a 94 f8 d0 09 de 6d d2 31 4c aa .......S.....F.oRg.b.......m.1L.
24a0 4a a3 6a e9 d0 d4 bd 0e 65 4d 08 71 88 6e 64 0d 24 be ce 7a c5 8a 15 68 f0 6d 2e c0 24 18 26 55 J.j.....eM.q.nd.$..z...h.m..$.&U
24c0 65 e9 30 41 59 13 42 e2 44 68 dd 00 95 37 a9 b3 a6 ac 99 d4 1a ca 9a 10 12 1f 84 d6 0d 50 79 93 e.0AY.B.Dh...7...............Py.
24e0 39 6b ca 9a 49 ad 79 13 59 b3 ce 9a 10 e3 20 b4 6e 80 0a 65 cd 18 31 6f 22 6b 45 61 9d 35 21 46 9k..I.y.Y.......n..e..1o"kEa.5!F
2500 41 68 dd 00 15 ca 9a 31 62 de 44 d6 ac b3 26 c4 38 08 ad 1b a0 42 59 33 46 0c e7 ac 09 21 f1 41 Ah.....1b.D...&.8....BY3F....!.A
2520 68 dd 00 15 ca 9a 31 62 28 6b 42 48 7c 10 5a 37 40 e5 4d eb ac 29 6b 26 35 86 b2 26 84 c4 07 a1 h.....1b(kBH|.Z7@.M..)k&5..&....
2540 75 03 ac 61 9d 35 63 b4 50 d6 84 90 f8 20 b4 6e 80 4a 72 d6 59 df 0e 10 a8 f9 95 fc 33 8f 65 4b u..a.5c.P......n.Jr.Y.......3.eK
2560 0a 1c 98 27 f0 3c 44 a0 41 15 81 b7 73 0b 74 69 2a 70 63 8b 40 c3 aa 02 e9 d3 0b b4 ff de fe 71 ...'.<D.A...s.ti*pc.@..........q
2580 1a 56 15 c8 fb 96 40 2b 37 b9 dc a5 a9 40 fe bc 02 9f 16 15 98 e5 1d bf 0f e7 f9 be 02 ae ce 02 .V....@+7....@..................
25a0 3f d6 91 ff ce 1b 28 d7 07 4c 16 28 ff 89 40 ad 8a 49 2f 84 e7 21 02 de 6d 04 22 f6 25 8f 70 fa ?.....(..L.(..@..I/..!..m.".%.p.
25c0 fe 24 30 a3 bf 36 b2 ab f0 99 c0 f9 d5 29 ff bc 89 39 e7 9b 5b 05 86 76 12 78 75 d8 b2 8e b2 26 .$0..6.......)...9..[..v.xu....&
25e0 84 c4 07 a1 75 03 54 52 62 ce ba 46 05 81 ca 5f 58 96 e7 f8 08 2c 1c 6c bb 4f be b7 04 b2 3a 09 ....u.TRb..F..._X....,.l.O....:.
2600 dc df 69 bb fe ea 9f 02 6f e5 10 f8 fa 73 db f5 b5 2a 0a f8 75 8d df 87 f5 f5 cd 52 f6 aa 34 ef ..i.....o....s...*..u......R..4.
2620 ee 10 f0 ff c3 b2 7d f1 90 e4 91 75 77 0f 29 85 e4 12 d7 e7 25 04 fe de 98 f2 c2 bc bf 53 e0 a3 ......}....uw.).....%........S..
2640 f7 53 fe 79 df e4 9c 27 f5 11 f8 a3 93 65 99 75 d6 84 90 f8 20 b4 6e 80 4a 4a c8 fa f4 0a 81 0c .S.y...'.....e.u......n.JJ......
2660 19 04 96 0f 17 08 db 23 f0 fd b7 02 af 43 6d f7 a9 55 51 f6 94 a3 0b b8 77 2b 81 4e ee 6f 26 eb .......#.....Cm..UQ.....w+.N.o&.
2680 1d 53 65 cf 3e b6 ed c9 21 eb 0b 6b e4 f9 24 97 b4 6e 6e 4d de e3 3b ca d2 61 f2 77 92 d2 cf fb .Se.>...!..k..$..nnM..;..a.w....
26a0 26 e7 fc 22 44 a0 d0 bb 02 ff 6e b7 9c 03 eb ac 09 21 71 21 b4 6e 80 4a 4a 5d 0d de a5 a9 fc b0 &.."D.....n......!q!.n.JJ]......
26c0 ec d8 44 e0 f8 d2 98 db 6b 55 14 98 f6 9b c0 07 05 e4 07 2b 4c 02 4a b0 c0 0f 35 04 26 f7 49 bc ..D.....kU.........+L.J...5.&.I.
26e0 ac 43 16 08 54 2c 23 90 3b a7 1c 4e 6f 58 55 e0 3b 17 81 ec 59 2d fb 44 97 f5 f9 d5 02 f5 be 91 .C..T,#.;..NoXU.;...Y-.D........
2700 c3 ee b5 2b c9 63 58 8b aa 41 15 01 cf 7a f2 38 81 b3 ed 3f ef f0 2e 02 1d 1a 5b 96 c3 f7 ca 73 ...+.cX..A...z.8...?......[....s
2720 f9 a9 ae 6c 83 57 d4 b6 a1 9d 64 db 3a b9 cb ed 79 df 12 a8 5e 41 6e db 34 41 a0 4e 25 f9 98 6a ...l.W....d.:...y...^An.4A.N%..j
2740 e5 05 e6 fa 58 8e 37 d7 47 a0 67 0b 81 6b 9b 04 aa 96 17 28 fc 3f b9 fe d4 72 39 44 6d fd 7a c5 ....X.7.G.g..k.....(.?...r9Dm.z.
2760 d6 e6 d7 a1 02 c3 3a 0b 34 aa 26 d0 f4 3b 39 12 f0 3c 44 8e 40 14 2d 28 a7 2f 16 0f 11 28 5d 4c ......:.4.&..;9..<D.@.-(./...(]L
2780 fe 1c 34 47 3e ae 95 9b c0 86 b1 f2 4b d0 ff de 96 d3 08 bf b7 91 bf df aa e5 e5 48 46 a3 6a 72 ..4G>.......K..............HF.jr
27a0 9b b5 d4 ff dd 2e cf bd 75 7d 81 96 6e 02 bf b6 b4 0c 4d d7 af 22 e0 94 59 60 4c 0f d9 f6 02 f9 ........u}..n.....M.."..Y`L.....
27c0 62 fe 7e d5 73 4e ac ec 9b b8 0a cc fc fd cd 65 cd 3a 6b 42 8c 83 e1 64 fd 60 97 14 d1 f7 df da b.~.sN.........e.:kB...d.`......
27e0 df 5e ab a2 40 64 90 14 d7 ca 11 72 dd f4 fe 52 0a 6f 22 6b 98 04 b6 4e 92 42 51 97 af fe 19 bb .^..@d.....r...R.o"k...N.BQ.....
2800 ac 9f 1d 94 43 bc 1b c6 5a e4 f7 4e 1e d9 b6 97 87 04 72 66 17 f8 ef 80 dc f6 e7 38 81 b1 3d ed ....C...Z..N......rf.......8..=.
2820 3f e7 0f 35 04 46 74 b3 2c fb 75 95 f3 d7 aa 24 bf fd d2 b2 ad 9f a7 94 ed f5 cd 02 8f 03 05 da ?..5.Ft.,.u....$................
2840 35 92 5f 18 f2 be 25 70 2f 6a 5a e0 c4 32 f9 c5 c1 fa f8 db a6 c8 9f 43 17 59 64 0d 93 c0 ba 31 5._...%p/jZ..2.........C.Yd....1
2860 96 d7 cb 51 9b e7 f8 08 38 7f 26 f7 51 8f 39 32 aa cd 4f f7 4b 41 ab 43 c7 63 7a c8 e7 79 1d 2a ...Q....8.&.Q.92..O.KA.C.cz..y.*
2880 bf 50 3d 0e b4 bc b6 d9 b3 ca eb 11 5e 1d 96 b2 76 fe 4c b6 3b 6c 8f fc 7d 9e 5e 21 f7 bd 1d 20 .P=.........^...v.L.;l..}.^!....
28a0 f7 57 db d9 ad 99 ed 74 84 4b 29 29 f3 17 21 02 27 97 0b 64 ca 68 3b df 6f 7d ce 89 49 3f 4f cb .W.....t.K))..!.'..d.h;.o}..I?O.
28c0 97 24 ce 59 13 42 e2 83 e1 64 fd 74 bf ec ad 65 cb 22 f0 cf 26 fb b2 86 49 f6 9c d4 f9 ed 7a df .$.Y.B...d.t...e."..&...I.....z.
28e0 48 01 a4 a4 ac 77 4e 93 6d b4 1e a6 2f 51 58 60 cd 28 d9 96 77 f2 c8 0f fd 9b 5b 1d 3f 67 d5 f2 H....wN.m.../QX`.(..w.....[.?g..
2900 02 53 fb 59 96 27 f5 11 28 59 58 5e d0 a6 ca d1 5a 22 9e f5 6c d7 0d 68 2b cf df 7a dd 11 7f 8b .S.Y.'..(YX^....Z"..l..h+..z....
2920 80 0b e6 97 af 69 5c b2 76 d4 e6 ca 5f d8 7e a1 58 3a 4c f6 a2 ad 65 7d f5 cf 98 6d 70 75 b6 7d .....i\.v..._.~.X:L...e}...mpu.}
2940 6d 8b 16 b4 2c f7 f9 49 8e 04 a8 cb 15 cb 58 be f8 bc 0e 15 18 f5 8b 1c 2d 68 58 55 0e 69 ff d2 m...,..I......X.........-hXU.i..
2960 dc 56 d6 d6 d7 32 e4 ca 2e 70 66 a5 fd 73 4e 4c 86 76 92 3d 7e ca 9a 10 12 5f 74 23 eb 94 aa b3 .V...2...pf..sNL.v.=~...._t#....
2980 1e ec 25 87 31 0b ff 4f a0 79 cd d8 65 7d 65 bd bc 32 7c 64 37 d9 9b 83 29 65 65 bd 60 90 dc d6 ..%.1..O.y..e}e..2|d7...)ee.`...
29a0 ac a6 25 ce 9f 59 24 72 72 b9 1c 1d c8 e2 24 a5 13 5d 66 6a aa 94 93 c3 fa ea f2 cb 43 02 a3 bb ..%..Y$rr.....$..]fj........C...
29c0 4b b1 fd ef 6d 81 89 bd 6d 65 fd 6b 4b db c7 b7 ae 6f 2b 3d eb 04 cf 11 70 fb da b2 ec 48 d6 8e K...m...me.kK....o+=....p....H..
29e0 da fc e1 7b 52 90 ea 79 d6 ad 2c 97 ad 65 ad f6 a0 ad 85 37 ea 97 d8 5f 5b ef 36 72 38 dd fa 4b ...{R..y..,..e.....7..._[.6r8..K
2a00 cb aa 91 f2 e7 d9 03 e4 05 62 4a b0 5c f6 eb 2a d0 b6 a1 ad ac 37 8e b7 2c 17 c8 27 70 6c 89 fd .........bJ.\..*.....7..,..'pl..
2a20 73 4e 4c 86 75 96 d3 01 94 35 21 24 be e8 46 d6 40 f2 d7 59 ff bd d1 32 fc bd 7e ac ed fc 67 74 sNL.u....5!$..F.@..Y...2..~...gt
2a40 59 c3 24 7b 94 39 b2 09 3c dc 9d 30 59 ef 9e 21 70 67 db 9b c9 7a d7 74 39 fc 6c fd f8 27 c1 72 Y.${.9..<..0Y..!pg...z.t9.l..'.r
2a60 18 f9 d5 61 39 f7 0c 93 bc a2 bc 61 55 cb 87 7f f4 34 71 b5 0c 29 c3 24 87 84 5f 87 ca 6c 1c 2f ...a9......aU....4q..).$.._..l./
2a80 e7 67 8f fa c7 2e 6b 9f 76 52 9e d6 eb ce ae 92 ff 0e 68 2b 7b ea ea fa 13 cb e4 17 00 75 79 e1 .g....k.vR........h+{........uy.
2aa0 60 db 9e 75 6c 6d fe a6 ac ed 71 60 b2 bc e6 b1 c9 ba f2 17 52 fe 89 91 75 9b 06 f2 da 05 75 db `..ulm....q`........R...u.....u.
2ac0 90 8e f1 97 75 f4 73 4e 4c 7e 6b 6d 29 0f a4 ac 09 21 f1 41 37 b2 4e 89 bf 67 dd a2 b6 ec 31 ab ....u.sNL~km)....!.A7.N..g....1.
2ae0 cb f5 ab 08 94 fb d8 b6 ee d5 5a d6 a6 c5 96 3a e8 84 c8 ba 9f a7 e5 c3 3d b1 b2 7e 1e 22 e7 ac ..........Z....:........=..~."..
2b00 f7 cc 94 cb af 43 65 e9 d9 99 95 72 1e d6 5a a0 b3 bc 05 1a bb da 3f e7 41 1d 04 3a ff 60 59 ee .....Ce....r..Z.......?.A..:.`Y.
2b20 d2 54 f6 80 55 81 be 5f 40 4a 36 36 59 5f 58 23 90 27 97 e5 ea e5 90 05 f2 22 30 98 04 be fc 54 .T..U.._@J66Y_X#.'......."0....T
2b40 e0 d2 3a db 2f 02 59 9c e4 75 01 30 c9 8b b7 d4 d7 cb 51 9b e7 fa c8 21 6d f5 f7 b0 77 a6 ec 61 ..:./.Y..u.0......Q....!m...w..a
2b60 c7 26 eb f0 bd b2 37 ee e8 b5 75 24 eb e1 5d e4 b0 f8 ab c3 f2 75 75 75 8e bf ac a3 9f f3 b5 4d .&....7...u$..]......uuu.......M
2b80 f2 02 be e7 21 f6 97 77 4c 95 cf 67 dd d6 e6 35 2d c2 a7 ac 09 21 f1 41 37 b2 4e ce 39 eb 7f 36 ....!..wL..g...5-....!.A7.N.9..6
2ba0 49 31 17 cc 2f 87 4f 61 12 38 b7 5a 8a 44 08 79 d5 f3 a1 85 b2 17 5a 20 9f 40 d7 a6 31 8f b1 70 I1../.Oa.8.Z.D.y......Z..@..1..p
2bc0 b0 c0 17 25 65 1d b6 7a 65 f1 2f cd e5 fe a5 3e 92 8f 55 53 b2 70 4c 59 1f 5e 28 7b 83 79 72 c9 ...%e..ze./....>..US.pLY.^({.yr.
2be0 32 b0 9b 5b e5 50 70 86 0c 52 7e db a7 ca 61 ee 02 f9 e4 50 bd 2a ca 7a df 08 78 d4 92 73 9c 8b 2..[.Pp..R~...a....P.*.z..x..s..
2c00 a2 86 c0 9f 04 cb 0f fc 46 d5 e4 cd 55 ea 56 b6 15 88 75 4e 2e 97 43 be ea f2 ba 31 52 4e 2d dd ........F...U.V...uN..C....1RN-.
2c20 e4 e3 d4 b9 e2 15 7e b2 dd 25 0a cb 1b 7e 58 1f 63 d3 04 79 53 99 1f eb 08 b8 57 97 17 68 dd dd ......~..%...~X.c..yS.....W..h..
2c40 21 50 bc 50 cc e7 1b da 49 4a f3 e7 06 f2 8b 42 be b7 04 fa ff ec b8 cd af 43 e5 17 9e ba 95 65 !P.P....IJ.....B.........C.....e
2c60 bb 3c 6a 59 2e 68 fb fe 5b f9 3b 6a 54 4d 7e 79 82 49 4a d7 5a ae a7 57 58 5e db c1 5e f2 e2 b5 .<jY.h..[.;jTM~y.IJ.Z..WX^..^...
2c80 8f 3f 14 28 f6 81 3c af 91 dd e4 cd 6f be 2a 2d 8f 11 b1 4f f6 ea 5d 4a c9 36 d5 ad 2c e5 3f df .?.(..<.....o.*-...O..]J.6..,.?.
2ca0 57 60 60 7b 39 a2 f1 f5 e7 f2 ff 48 cf 16 72 f4 a1 46 05 81 d3 cb 63 9e 73 c8 02 79 f5 b9 3a 12 W``{9......H..r..F....c.s..y..:.
2cc0 10 7d 79 c2 af f2 ca 77 75 ff 57 87 e5 73 5d df fc e6 b2 66 9d 35 21 c6 c1 10 b2 36 7a da 34 10 .}y....wu.W..s]....f.5!....6z.4.
2ce0 d8 3c 31 69 8f b9 78 88 ed 50 72 4a a6 6d 43 4b 2f 39 25 93 14 e7 bc 60 90 ed 97 21 d6 59 13 42 .<1i..x..PrJ.mCK/9%....`...!.Y.B
2d00 e2 83 d0 ba 01 2a 94 75 f2 45 09 96 a3 05 d1 e7 7d 99 94 cd ad 00 39 aa f2 ec a0 65 1d eb ac 09 .....*.u.E......}.....9....e....
2d20 21 f1 41 68 dd 00 15 ca 9a 31 62 38 67 4d 08 89 0f 42 eb 06 a8 50 d6 8c 11 43 59 13 42 e2 83 d0 !.Ah.....1b8gM...B...P...CY.B...
2d40 ba 01 2a fc 7b d6 8c 11 43 59 13 42 e2 83 d0 ba 01 d6 f0 ef 59 33 46 0b 65 4d 08 89 0f 42 eb 06 ..*.{...CY.B........Y3F.eM...B..
2d60 a8 a4 44 9d 35 c3 e8 2d 94 35 21 24 3e 08 ad 1b a0 c2 39 6b c6 88 61 9d 35 21 24 3e 08 ad 1b a0 ..D.5..-.5!$>.....9k..a.5!$>....
2d80 42 59 33 46 0c eb ac 09 21 f1 41 68 dd 00 95 37 95 f5 c7 45 9c 30 b4 93 60 98 54 95 a6 df b1 ce BY3F....!.Ah...7...E.0..`.T.....
2da0 9a 10 12 37 69 42 d6 47 8f 1e 45 df be bd 99 64 4a fe fc 6f a3 5d bb 36 9a b7 23 ad 66 f1 e2 c5 ...7iB.G..E....dJ..o.].6..#.f...
2dc0 9c b3 26 84 38 24 4d c8 9a 49 de 94 2c 59 12 47 8f 1e d5 bc 1d 8c 6d 28 6b 42 8c 83 6e 64 fd 26 ..&.8$M..I..,Y.G......m(kB..nd.&
2de0 75 d6 4c f2 86 b2 d6 67 28 6b 42 8c 83 6e 64 0d 24 be ce 9a 49 de 50 d6 fa 0c 65 4d 88 71 d0 8d u.L....g(kB..nd.$...I.P...eM.q..
2e00 ac df a4 ce 9a 49 de 50 d6 fa 0c 65 4d 88 71 d0 8d ac 39 67 ad df 50 d6 fa 0c eb ac 09 31 0e 94 .....I.P...eM.q...9g..P......1..
2e20 35 13 67 28 6b fd 86 75 d6 84 18 03 ca 9a 89 33 94 b5 3e c3 3a 6b 42 8c 03 65 cd c4 19 ca 5a 9f 5.g(k..u.......3..>.:kB..e....Z.
2e40 e1 9c 35 21 c6 81 b2 66 e2 0c 65 ad cf 50 d6 84 18 07 dd c8 9a 75 d6 fa 0d 65 ad cf 50 d6 84 18 ..5!...f..e..P.......u...e..P...
2e60 07 dd c8 1a 60 9d b5 5e 43 59 eb 33 94 35 21 c6 41 37 b2 66 9d b5 7e 43 59 eb 33 94 35 21 c6 41 ....`..^CY.3.5!.A7.f..~CY.3.5!.A
2e80 37 b2 e6 9c b5 7e 43 59 eb 33 ac b3 26 c4 38 50 d6 4c 9c a1 ac f5 1b d6 59 13 62 0c 28 6b 26 ce 7....~CY.3..&.8P.L......Y.b.(k&.
2ea0 50 d6 fa 0c eb ac 09 31 0e 94 35 13 67 28 6b 7d 86 73 d6 84 18 07 ca 9a 89 33 94 b5 3e 43 59 13 P......1..5.g(k}.s.......3..>CY.
2ec0 62 1c 74 23 6b d6 59 eb 37 94 b5 3e 43 59 13 62 1c 74 23 6b 80 75 d6 7a 0d 65 ad cf 50 d6 84 18 b.t#k.Y.7..>CY.b.t#k.u.z.e..P...
2ee0 07 dd c8 9a 75 d6 fa 4d 6a 91 f5 f0 e1 c3 51 a8 50 21 0c 19 32 04 8a a2 e0 d1 a3 47 28 52 a4 08 ....u..Mj.....Q.P!..2......G(R..
2f00 ce 9c 39 13 63 df a0 a0 20 b8 b8 b8 a0 6c d9 b2 c9 de ae 99 33 67 a2 58 b1 62 e8 de bd 7b 92 1e ..9.c........l......3g.X.b...{..
2f20 97 b2 26 c4 38 e8 46 d6 9c b3 d6 6f 92 5a d6 41 41 41 28 54 a8 50 b2 b4 d5 d3 d3 d3 2c 6b 45 51 ..&.8.F....o.Z.AAA(T.P......,kEQ
2f40 b0 68 d1 22 84 85 85 d9 dd 77 fd fa f5 f1 96 f5 9b b6 b9 57 af 5e 49 2e 6b d6 59 13 62 1c 28 6b .h.".....w.........W.^I.k.Y.b.(k
2f60 26 ce a4 66 59 3b 4a 6a 97 b5 a2 b0 ce 9a 10 a3 40 59 33 71 c6 9e ac c3 c3 c3 d1 be 7d 7b 94 2e &..fY;Jj........@Y3q........}{..
2f80 5d 1a 35 6b d6 44 cf 9e 3d 91 3b 77 6e 74 ee dc 19 8a a2 e0 f6 ed db 68 d1 a2 05 9a 35 6b 86 3a ].5k.D..=.;wnt.........h....5k.:
2fa0 75 ea 60 ea d4 a9 50 14 05 97 2e 5d c2 37 df 7c 83 ac 59 b3 a2 5e bd 7a 68 d9 b2 65 8c e3 7e f5 u.`...P....].7.|..Y..^.zh..e..~.
2fc0 d5 57 c8 9a 35 ab f9 58 13 27 4e 44 81 02 05 d0 b7 6f 5f 5c bd 7a d5 fc 38 0f 0f 0f 74 ef de 1d .W..5..X.'ND.....o_\.z..8...t...
2fe0 8f 1f 3f 36 3f de 5a d6 5d bb 76 45 9e 3c 79 b0 7a f5 ea 18 6d ae 5b b7 2e 7c 7d 7d 6d 64 3d 69 ..?6?.Z.].vE.<y.z...m.[..|}}md=i
3000 d2 24 d4 af 5f 1f ad 5a b5 42 c3 86 0d 11 18 18 e8 b0 cd b1 9d a3 a2 28 f8 eb af bf e0 ea ea 0a .$.._..Z.B.............(........
3020 17 17 17 34 6b d6 0c 3f ff fc 73 92 cb 9a 75 d6 84 18 07 ca 9a 89 33 f6 64 ed e7 e7 87 2f bf fc ...4k..?..s...u.......3.d..../..
3040 12 e1 e1 e1 88 8c 8c 84 9b 9b 9b 8d f8 3c 3c 3c d0 ad 5b 37 28 8a 82 fb f7 ef e3 83 0f 3e c0 de .............<<<..[7(........>..
3060 bd 7b cd 92 71 d4 4b bd 79 f3 26 b2 64 c9 82 b3 67 cf 42 51 14 84 85 85 a1 51 a3 46 50 14 29 c1 .{..q.K.y.&.d...g.BQ.....Q.FP.).
3080 f5 eb d7 9b f7 ed d4 a9 13 e6 ce 9d 6b 5e 8e de b3 76 76 76 36 cb 3a 7a 9b 1b 36 6c 68 d3 e6 79 ............k^...vvv6.:z..6lh..y
30a0 f3 e6 99 87 cc af 5d bb 86 e2 c5 8b db 88 31 7a 9b 1d 9d a3 9b 9b 1b ba 76 ed 0a 45 51 70 eb d6 ......].......1z........v..EQp..
30c0 2d 14 2e 5c 98 73 d6 84 90 44 43 59 33 71 c6 9e ac 2b 54 a8 80 61 c3 86 99 97 e7 cd 9b 67 16 5f -..\.s...DCY3q...+T..a.......g._
30e0 58 58 18 32 64 c8 60 16 97 a2 28 68 d3 a6 0d 3a 75 ea 04 45 89 df 90 f2 f7 df 7f 0f 1f 1f 1f 28 XX.2d.`...(h...:u..E...........(
3100 8a 82 e5 cb 97 63 fa f4 e9 50 14 05 91 91 91 18 36 6c 18 6a d6 ac 89 7a f5 ea e1 93 4f 3e 31 f7 .....c...P......6l.j...z....O>1.
3120 c0 15 c5 b1 ac 1d b5 59 51 14 98 4c 26 34 69 d2 04 75 ea d4 41 bd 7a f5 90 3e 7d 7a dc b8 71 c3 .......YQ..L&4i..u..A.z..>}z..q.
3140 6e 9b 1d 9d e3 83 07 0f 90 2e 5d 3a 04 05 05 99 b7 25 47 cf 9a b2 26 c4 38 e8 46 d6 ac b3 d6 6f n.........]:.....%G...&.8.F....o
3160 ec c9 ba 50 a1 42 98 31 63 86 79 d9 7a fe f7 dc b9 73 10 42 c0 cd cd 0d ee ee ee 70 77 77 47 95 ...P.B.1c.y.z....s.B.......pwwG.
3180 2a 55 d0 b1 63 47 28 4a fc 64 bd 72 e5 4a 14 2b 56 0c 8a a2 a0 79 f3 e6 b8 7d fb 36 14 45 c1 d4 *U..cG(J.d.r.J.+V....y...}.6.E..
31a0 a9 53 51 ba 74 69 dc bb 77 0f 8a a2 60 c8 90 21 f0 f4 f4 34 3f ce 91 ac 1d b5 f9 f1 e3 c7 f8 e0 .SQ.ti..w...`..!...4?...........
31c0 83 0f 30 6f de 3c f3 76 27 27 27 5c bc 78 d1 6e 9b 1d 9d e3 d9 b3 67 21 84 b0 b9 0a 3d 39 e6 ac ..0o.<.v'''\.x.n......g!....=9..
31e0 29 6b 42 8c 83 6e 64 0d b0 ce 5a af b1 27 6b 17 17 97 38 7b d6 87 0e 1d 32 6f 7f f4 e8 11 fe fd )kB..nd...Z..'k...8{....2o......
3200 f7 5f 28 4a fc 64 1d 1e 1e 8e b7 df 7e 1b eb d6 ad 43 8b 16 2d cc eb 7f fa e9 27 78 79 79 99 97 ._(J.d......~....C..-.....'xyy..
3220 7d 7c 7c e2 2d 6b 47 6d be 70 e1 02 84 10 b8 76 ed 1a 14 45 f6 e0 33 66 cc 18 ab ac 1d 9d a3 da }||.-kGm.p.....v...E..3f........
3240 b3 56 e7 bc 15 85 3d 6b 42 c8 9b a1 1b 59 b3 ce 5a bf b1 27 eb 51 a3 46 a1 5c b9 72 b1 ce ff 7a .V....=kB....Y..Z..'.Q.F.\.r...z
3260 78 78 c0 db db db bc ec ed ed 8d 89 13 27 42 51 14 1c 3b 76 0c f9 f3 e7 37 af 57 e7 a6 a3 c7 cb xx...........'BQ..;v....7.W.....
3280 cb 0b 05 0a 14 c0 9a 35 6b cc eb 06 0f 1e 0c 17 17 17 3c 7e fc 18 91 91 91 a8 56 ad 5a bc 65 1d .......5k.........<~......V.Z.e.
32a0 bd cd 75 eb d6 35 b7 f9 e1 c3 87 c8 99 33 a7 79 3e 3c 20 20 00 42 08 b3 ac ed b5 d9 d1 39 d6 af ..u..5.......3.y><...B.......9..
32c0 5f df 3c 3c 7f eb d6 2d 14 2c 58 90 b2 26 84 24 1a dd c8 9a 73 d6 fa 8d 3d 59 3f 7a f4 08 5e 5e _.<<...-.,X..&.$....s...=Y?z..^^
32e0 5e 28 5d ba 34 dc dc dc e0 eb eb 8b 72 e5 ca 99 b7 df be 7d 1b 2d 5b b6 44 e3 c6 8d e1 ee ee 8e ^(].4.......r......}.-[.D.......
3300 1e 3d 7a 98 af da 8e 8c 8c 44 cd 9a 35 cd 43 c8 d6 57 73 5b 67 ef de bd 78 e7 9d 77 f0 e8 d1 23 .=z......D..5.C..Ws[g...x..w...#
3320 f3 ba 3b 77 ee a0 6e dd ba 70 76 76 c6 0f 3f fc 80 da b5 6b a3 70 e1 c2 98 39 73 26 46 8e 1c 89 ..;w..n..pvv..?....k.p...9s&F...
3340 c2 85 0b e3 b3 cf 3e c3 92 25 4b d0 bd 7b 77 e4 cd 9b 17 15 2b 56 44 60 60 a0 b9 cd 65 ca 94 41 ......>..%K..{w.....+VD``...e..A
3360 83 06 0d d0 a3 47 0f e4 c9 93 c7 7c 91 d8 92 25 4b 50 a2 44 09 34 6a d4 08 9d 3b 77 46 a6 4c 99 .....G.....|...%KP.D.4j...;wF.L.
3380 50 ab 56 2d dc bb 77 cf 6e 9b 1d 9d e3 5f 7f fd 85 ea d5 ab e3 eb af bf 86 bb bb 3b 9a 35 6b 86 P.V-..w.n...._.............;.5k.
33a0 e2 c5 8b 63 da b4 69 49 f6 7b 61 9d 35 21 c6 81 b2 66 e2 4c 6c a5 5b e1 e1 e1 e6 e5 79 f3 e6 a1 ...c..iI.{a.5!...f.Ll.[.....y...
33c0 56 ad 5a 9a b7 d5 68 61 9d 35 21 c6 80 b2 66 e2 8c 3d 59 af 5e bd da 66 fe b7 59 b3 66 18 35 6a V.Z...ha.5!...f..=Y.^..f..Y.f.5j
33e0 94 e6 6d 35 52 58 67 4d 88 71 a0 ac 99 38 63 4f d6 a1 a1 a1 a8 54 a9 12 9a 36 6d 8a 86 0d 1b a2 ..m5RXgM.q...8cO.....T...6m.....
3400 4b 97 2e 36 3d 6d 26 f9 c3 39 6b 42 8c 03 65 cd c4 99 d4 f2 87 3c 8c 16 ca 9a 10 e3 a0 1b 59 b3 K..6=m&..9kB..e......<........Y.
3420 ce 5a bf a1 ac f5 19 ca 9a 10 e3 a0 1b 59 03 ac b3 d6 6b 28 6b 7d 86 b2 26 c4 38 e8 46 d6 ac b3 .Z...........Y....k(k}..&.8.F...
3440 d6 6f 28 6b 7d 86 b2 26 c4 38 e8 46 d6 9c b3 d6 6f 28 6b 7d 86 75 d6 84 18 07 ca 9a 89 33 94 b5 .o(k}..&.8.F....o(k}.u.......3..
3460 7e c3 3a 6b 42 8c 01 65 cd d8 a4 72 e5 ca a8 58 b1 a2 cd ba e8 b2 5e b4 68 11 9c 9c 9c 34 6f ab ~.:kB..e...r...X......^.h....4o.
3480 d1 c3 3a 6b 42 8c 03 65 cd d8 e4 dc b9 73 c8 92 25 0b 1a 34 68 60 5e 67 2d eb e5 cb 97 23 4b 96 ..:kB..e.....s..%..4h`^g-....#K.
34a0 2c 18 3e 7c b8 e6 6d 35 7a 38 67 4d 88 71 a0 ac 99 18 71 77 77 47 e6 cc 99 cd c2 56 65 bd 7c f9 ,.>|..m5z8gM.q....qwwG.....Ve.|.
34c0 72 e4 cc 99 13 59 b2 64 d1 bc 8d 0c 65 4d 88 91 d0 8d ac 59 67 ad 9f 9c 3b 77 0e 39 72 e4 80 93 r....Y.d....eM.....Yg...;w.9r...
34e0 93 13 1a 34 68 80 92 25 4b 62 ec d8 b1 c8 95 2b 17 b2 65 cb c6 5e b5 4e 42 59 13 62 1c 74 23 6b ...4h..%Kb.....+..e..^.NBY.b.t#k
3500 80 75 d6 7a 8a bb bb 3b 32 64 c8 00 27 27 27 38 39 39 21 47 8e 1c 10 42 b0 57 ad a3 50 d6 84 18 .u.z...;2d..'''899!G...B.W..P...
3520 07 dd c8 9a 75 d6 fa 8a da bb 16 42 98 c3 5e b5 be 42 59 13 62 1c 74 23 6b ce 59 eb 2f 6a ef 5a ....u......B..^..BY.b.t#k.Y./j.Z
3540 95 35 7b d5 fa 0a eb ac 09 31 0e 94 35 13 6b ac 7b d7 ec 55 eb 33 ac b3 26 c4 18 50 d6 8c c3 b8 .5{......1..5.k.{..U.3..&..P....
3560 bb bb 23 7d fa f4 ec 55 eb 30 ac b3 26 c4 38 50 d6 8c c3 9c 3b 77 0e 99 33 67 66 af 5a 87 e1 9c ..#}...U.0..&.8P....;w..3gf.Z...
3580 35 21 c6 c1 10 b2 8e 8c 8c c4 98 31 63 98 44 c6 d7 d7 17 23 47 8e d4 bc 1d a9 35 27 4e 9c a0 ac 5!.........1c.D....#G.....5'N...
35a0 09 21 6f 84 6e 64 9d 9c 75 d6 11 11 11 48 97 2e 1d ba 36 73 62 98 14 4d 89 0f b3 60 fe fc f9 94 .!o.nd..u....H....6sb..M...`....
35c0 35 21 e4 8d d0 8d ac 81 e4 ab b3 8e 88 88 40 fa f4 e9 00 93 60 98 14 8d 47 9d 9c 94 35 21 e4 8d 5!............@.....`...G...5!..
35e0 11 5a 37 40 25 39 eb ac 29 6b 46 ab 50 d6 84 90 a4 40 68 dd 00 95 e4 9c b3 a6 ac 19 ad 92 9c b2 .Z7@%9..)kF.P....@h.............
3600 66 9d 35 21 c6 41 68 dd 00 15 ca 9a 49 8b 49 4e 59 2b 0a eb ac 09 31 0a 42 eb 06 a8 50 d6 4c 5a f.5!.Ah.....I.INY+....1.B...P.LZ
3620 4c 72 ca 9a 75 d6 84 18 07 a1 75 03 54 28 6b 26 2d 86 73 d6 84 90 a4 40 68 dd 00 15 ca 9a 49 8b Lr..u.....u.T(k&-.s....@h.....I.
3640 a1 ac 09 21 49 81 d0 ba 01 2a c9 5d 67 4d 59 33 5a 84 b2 26 84 24 05 42 eb 06 58 c3 3a 6b 26 ad ...!I....*.]gMY3Z..&.$.B..X.:k&.
3660 85 b2 26 84 24 05 42 eb 06 a8 b0 ce 9a 49 8b a1 ac 09 21 49 81 d0 ba 01 2a 9c b3 66 d2 62 58 67 ..&.$.B......I....!I....*..f.bXg
3680 4d 08 49 0a 84 d6 0d 50 a1 ac 99 b4 18 d6 59 13 42 92 02 a1 75 03 54 28 6b 26 2d 86 75 d6 84 90 M.I....P......Y.B...u.T(k&-.u...
36a0 a4 40 68 dd 00 15 ca 9a 49 8b e1 9c 35 21 24 29 10 5a 37 40 85 b2 66 d2 62 28 6b 42 48 52 20 b4 .@h.....I...5!$).Z7@..f.b(kBHR..
36c0 6e 80 8a 91 ea ac 6f 07 08 d4 fc 4a 40 08 81 b2 25 05 0e cc 13 78 1e 22 d0 a0 8a c0 db b9 05 ba n.....o....J@...%....x."........
36e0 34 15 b8 b1 45 a0 61 55 81 f4 e9 05 da 7f 6f ff 38 0d ab 0a e4 7d 4b a0 95 9b 5c ee d2 54 20 7f 4...E.aU......o.8....}K...\..T..
3700 5e 81 4f 8b 0a cc f2 4e 9e b6 07 4c 16 28 ff 89 40 ad 8a 96 75 93 fa 08 74 72 b7 bf ff af 2d 05 ^.O....N...L.(..@...u...tr....-.
3720 f2 e4 12 d8 38 3e 71 cf f7 22 44 a0 68 41 81 bf 36 68 ff 7b a3 ac 09 21 5a a1 1b 59 03 c6 ab b3 ....8>q.."D.hA..6h.{...!Z..Y....
3740 ae 51 41 a0 f2 17 96 e5 39 3e 02 0b 07 db ee 93 ef 2d 81 ac 4e 02 f7 77 da ae bf fa a7 c0 5b 39 .QA.....9>.......-..N..w......[9
3760 04 be fe dc 76 7d ad 8a 02 7e 5d 93 b7 dd 8b 87 d8 ca fa e2 5a 81 90 05 b1 ef ef 52 2a fe b2 ce ....v}...~].........Z......R*...
3780 9e 55 9e 9b f5 ba 15 7e 02 cf 0e 6a ff fb 4a 4c 28 6b 42 48 52 20 b4 6e 80 8a 11 eb ac 4f af 10 .U.....~...j..JL(kBHR..n.....O..
37a0 c8 90 41 60 f9 70 81 b0 3d 02 df 7f 2b f0 3a 34 a6 7c 3f 2d 1a 53 c0 bd 5b c9 de ac 1e 64 1d 57 ..A`.p..=...+.:4.|?-.S..[....d.W
37c0 de 54 d6 a9 39 94 35 21 24 29 10 5a 37 40 c5 a8 73 d6 5d 9a 0a 14 7a 57 a0 63 13 81 e3 4b 63 6e .T..9.5!$).Z7@..s.]...zW.c...Kcn
37e0 af 55 51 60 da 6f 02 1f 14 90 43 c2 30 09 28 c1 02 3f d4 10 98 dc 27 f1 b2 5e 34 58 0e a1 ab c3 .UQ`.o....C.0.(..?....'..^4X....
3800 f0 61 7b 04 aa 94 13 f8 f8 43 81 53 cb 05 66 f4 17 68 54 4d e0 e7 06 02 8d 5d 05 0e 2f b4 2f eb .a{......C.S..f..hTM.....].././.
3820 90 05 02 15 cb c8 a1 71 75 fb 81 79 02 e5 3e 16 a8 56 5e a0 ef 4f b6 b2 fe 77 bb 1c be 6f 5d 5f .......qu..y..>..V^..O...w...o]_
3840 a0 a5 9b 1c 26 7f 75 58 6e 6b 5d 5f 7e 79 f9 ce 45 ee 73 63 8b 40 8f 16 b6 c3 e8 af 43 e5 f9 35 ....&.uXnk]_~y..E.sc.@......C..5
3860 aa 26 d0 a2 b6 40 bb 46 02 8f 03 e5 b6 fa 55 04 9c 32 0b 8c e9 21 5f 97 02 f9 92 ff 8b 8b 96 b2 .&...@.F......U..2...!_.........
3880 66 9d 35 21 c6 81 b2 d6 38 0f 76 49 69 7e ff ad fd ed b5 2a 0a 44 06 09 e4 ce 29 b0 72 84 5c 37 f.5!....8.vIi~.....*.D....).r.\7
38a0 bd bf c0 86 b1 6f 26 6b 98 04 fa 79 4a 41 aa cb 63 7a 08 ec 9d 29 7f 5e 32 d4 32 f4 7c 6f a7 40 .....o&k...yJA..cz...).^2.2.|o.@
38c0 89 c2 f6 65 0d 93 c0 d6 49 16 59 3f 09 96 92 5c 3f 56 2e 87 2e 12 c8 9c c9 22 db db 01 72 7f f5 ...e....I.Y?...\?V......."...r..
38e0 b1 dd 9a 09 f8 ff 61 59 b6 d7 b3 b6 96 fd 5c 1f 81 4a 9f 0b bc 3c 24 97 7f 69 2e d0 a1 b1 ed be ......aY......\..J...<$..i......
3900 0d ab ca 2f 36 27 97 0b 64 ca 28 10 b1 2f 6d ca 5a 51 58 67 4d 88 51 a0 ac 35 ce d3 fd f2 02 aa .../6'..d.(../m.ZQXgM.Q..5......
3920 6c 59 04 fe d9 64 5f d6 30 09 f4 6c 61 99 df ae f7 8d ec 8d be a9 ac 4f af 10 c8 99 5d f6 d4 61 lY...d_.0..la..........O....]..a
3940 92 17 b8 a9 c3 f0 67 56 0a 34 fd 4e 3e 97 7a a1 db c3 dd 71 cb 3a 60 b2 40 8e 6c b6 c3 f9 c5 0b ......gV.4.N>.z....q.:`.@.l.....
3960 d9 f6 8c 47 fd 22 50 a7 92 3c ee a7 45 a5 70 e3 2b eb ca 5f 08 8c ee 6e d9 16 34 47 f6 a6 d5 de ...G."P..<..E.p.+.._...n..4G....
3980 b9 4b 29 db 79 ff 5c d9 e5 b9 a4 45 59 b3 ce 9a 10 e3 40 59 6b 9c c1 5e b2 b7 58 f8 7f 02 cd 6b .K).y.\....EY.....@Yk..^..X....k
39a0 c6 2e eb 2b eb a5 30 47 76 93 3d 60 98 de 5c d6 30 c9 61 70 ff 3f 64 2f f4 f7 36 72 dd ab c3 72 ...+..0Gv.=`..\.0.ap.?d/..6r...r
39c0 68 7e c9 50 cb 7e 4e 99 05 ae 6f 8e 5b d6 f3 7d e5 63 63 93 ed ec 01 02 9f 97 b0 7c 41 f0 eb 2a h~.P.~N...o.[..}.cc........|A..*
39e0 d0 b6 61 fc 65 fd e1 7b 02 f3 06 5a b6 9d 5d 25 af aa ff 77 7b cc 7d 61 92 bd fc 63 4b d2 a6 ac ..a.e..{...Z..]%...w{.}a...cK...
3a00 39 67 4d 88 71 a0 ac 35 cc df 1b 2d c3 df eb c7 4a e9 04 cd b1 2f 6b 98 64 2f 37 47 36 4b 0f 37 9gM.q..5...-....J..../k.d/7G6K.7
3a20 be b2 de 3d 43 e0 ce 36 fb 6d 18 d7 53 3e a6 cf 4f 02 e7 56 cb 75 ff 6c 92 6d b9 17 75 05 fa eb ...=C..6.m..S>..O..V.u.l.m..u...
3a40 50 81 8c 19 e2 27 eb 6d 53 1c f7 ac db 34 90 f3 f4 ea b6 21 1d 13 26 eb 6f ca da f6 ac 03 67 c7 P....'.mS....4.....!..&.o.....g.
3a60 ec 59 53 d6 84 90 b4 86 6e 64 6d a4 3a 6b 35 2d 6a cb 1e b3 ba 5c bf 8a bc 30 4b 15 4f 74 59 9b .YS.....ndm.:k5-j....\...0K.OtY.
3a80 16 db f6 2a e3 2b eb 7e 9e b1 0b eb ce 36 39 a7 5c a7 92 65 dd 7f 07 e4 f0 b8 3a b7 bc 77 a6 94 ...*.+.~.....69.\..e......:..w..
3aa0 77 7c 64 fd 74 bf c0 ff de 16 58 3b 5a 2e 87 2e 12 48 97 ce 22 d0 e1 5d e4 05 69 af 0e 4b a1 bb w|d.t.....X;Z....H.."..]..i..K..
3ac0 3a db ca fa dd 7c b2 b7 fc e7 38 81 35 a3 62 0a 78 ae 8f 7c bc a3 39 6b ca 9a 10 92 d6 d0 8d ac :....|....8.5.b.x..|..9k........
3ae0 01 e3 d4 59 ff b3 49 8a b9 60 7e 81 a1 9d e4 ba 73 ab a5 78 85 10 a8 5e 41 e0 d0 42 81 26 ae 52 ...Y..I..`~.....s..x...^A..B.&.R
3b00 36 5d 9b c6 3c c6 c2 c1 02 5f 94 94 75 d8 ea 0d 49 7e 69 2e f7 2f f5 91 7c ac 9a 92 85 1d 0b ab 6]..<...._..u...I~i../..|.......
3b20 76 25 81 89 bd 6d d7 ad 1e 29 1f d7 c4 55 1e 37 53 46 01 b7 af 05 fe 1c 2f e0 fc 99 7c 9e c1 5e v%...m...)...U.7SF....../...|..^
3b40 f2 2a f1 ca 5f c8 2b b6 7b b7 92 8f 0d 59 20 bf 74 d4 aa 28 db 56 fe 13 79 6e 07 e7 cb 8b bd 1a .*.._.+.{....Y..t..(.V..yn......
3b60 54 91 52 6d 5e 53 a0 6e 65 39 b4 3d df 57 3e 76 b0 97 3c 5e ad 8a f2 6a f0 de ad e4 05 78 5f 7f T.Rm^S.ne9.=.W>v..<^...j.....x_.
3b80 2e 9f eb 75 a8 14 7e fd 2a 72 4e dd fa 6a f0 81 ed 2d fb 9e 5b 2d e7 f9 9d 32 cb 7a f6 db 01 94 ...u..~.*rN..j...-..[-...2.z....
3ba0 35 21 24 f5 a2 1b 59 1b b1 ce 9a 49 fb a1 ac 09 21 49 81 d0 ba 01 2a 46 9c b3 66 d2 7e 58 67 4d 5!$...Y....I....!I....*F..f.~XgM
3bc0 08 49 0a 84 d6 0d 50 a1 ac 99 b4 18 d6 59 13 42 92 02 a1 75 03 54 28 6b 26 2d 86 75 d6 84 90 a4 .I....P......Y.B...u.T(k&-.u....
3be0 40 68 dd 00 15 ca 9a 49 8b e1 9c 35 21 24 29 10 5a 37 40 85 b2 66 d2 62 28 6b 42 48 52 20 b4 6e @h.....I...5!$).Z7@..f.b(kBHR..n
3c00 80 8a 11 eb ac 99 b4 1f ca 9a 10 92 14 08 ad 1b 60 8d 51 ea ac 19 e3 84 b2 26 84 24 05 42 eb 06 ................`.Q......&.$.B..
3c20 a8 b0 ce 9a 49 8b a1 ac 09 21 49 81 d0 ba 01 2a 9c b3 66 d2 62 58 67 4d 08 49 0a 84 d6 0d 50 a1 ....I....!I....*..f.bXgM.I....P.
3c40 ac 99 b4 18 d6 59 13 42 92 02 a1 75 03 54 28 6b 26 2d 86 75 d6 84 90 a4 40 68 dd 00 15 ca 9a 49 .....Y.B...u.T(k&-.u....@h.....I
3c60 8b e1 9c 35 21 24 29 10 5a 37 40 85 b2 66 d2 62 28 6b 42 48 52 20 b4 6e 80 0a eb ac 99 b4 18 ca ...5!$).Z7@..f.b(kBHR..n........
3c80 9a 10 92 14 08 ad 1b 60 4d 72 d6 59 a7 4b 27 f0 47 27 86 49 d9 94 29 91 99 b2 26 84 bc 31 ba 91 .......`Mr.Y.K'.G'.I..)...&..1..
3ca0 75 72 d6 59 47 46 46 a2 5f bf 7e e8 d7 af 2f 93 88 e4 cb 97 17 ed da b5 d5 bc 1d a9 35 87 0e 1d ur.YGFF._.~.../.............5...
3cc0 a2 ac 09 21 6f 84 6e 64 9d 9c 73 d6 cc 9b a5 64 c9 92 38 7a f4 a8 e6 ed 60 6c c3 3a 6b 42 8c 03 ...!o.nd..s....d..8z....`l.:kB..
3ce0 65 cd c4 19 ca 5a bf 61 9d 35 21 c6 80 b2 66 e2 0c 65 ad cf b0 ce 9a 10 e3 40 59 33 71 86 b2 d6 e....Z.a.5!...f..e.......@Y3q...
3d00 67 38 67 4d 88 71 d0 8d ac 77 ec d8 01 57 57 57 cd 3f 00 99 98 a1 ac f5 99 f1 e3 c7 a3 73 e7 ce g8gM.q...w...WWW.?...........s..
3d20 5a bf 75 09 21 29 80 6e 64 7d f9 f2 65 b4 68 d1 42 f3 0f 40 26 66 28 6b 7d a6 77 ef de 18 36 6c Z.u.!).nd}..e.h.B..@&f(k}.w...6l
3d40 98 d6 6f 5d 42 48 0a a0 1b 59 03 c0 f3 e7 cf 35 ff 00 64 62 86 b2 d6 67 da b6 6d 8b 4d 9b 36 69 ..o]BH...Y.....5..db...g..m.M.6i
3d60 fd b6 25 84 a4 00 ba 92 f5 fe fd fb 71 f5 ea 55 cd 3f 04 19 db 50 d6 fa cb dd bb 77 91 3d 7b 76 ..%.........q..U.?...P.....w.={v
3d80 ad df b2 84 90 14 42 57 b2 be 7c f9 32 8a 16 2d aa f9 07 21 63 1b ca 5a 7f 39 77 ee 1c 8e 1c 39 ......BW..|.2..-...!c..Z.9w....9
3da0 a2 f5 5b 96 10 92 42 e8 4a d6 00 d0 b3 67 4f f8 fa fa 6a fe 61 c8 58 42 59 eb 2f 2f 5e bc d0 fa ..[...B.J....gO...j.a.XBY.//^...
3dc0 ad 4a 08 49 41 74 27 6b 00 68 da b4 29 f6 ed db a7 f9 07 22 23 43 59 eb 2b 15 2a 54 80 c9 64 d2 .J.IAt'k.h..)......"#CY.+.*T..d.
3de0 fa 6d 4a 08 49 41 74 29 6b 00 f8 f2 cb 2f 71 f0 e0 41 cd 3f 18 19 ca 5a 2f f9 fb ef bf 51 b2 64 .mJ.IAt)k..../q..A.?...Z/....Q.d
3e00 49 dc b9 73 47 eb b7 27 21 24 85 d1 ad ac 01 60 fc f8 f1 78 fa f4 29 ce 9d 3b a7 f9 07 a5 91 43 I..sG..'!$.....`...x..)..;.....C
3e20 59 6b 9b 5b b7 6e c1 cf cf 0f ef bd f7 1e 4e 9e 3c a9 f5 db 92 10 a2 01 ba 96 b5 ca e0 c1 83 f1 Yk.[.n........N.<...............
3e40 ee bb ef c2 cb cb 0b 5d ba 74 c1 b0 61 c3 e0 ed ed 8d 23 47 8e 40 51 14 2c 5e bc 18 de de de 31 .......].t..a.....#G.@Q.,^.....1
3e60 c2 ed 49 b3 fd bd f7 de 83 97 97 97 6e db 97 16 b7 0f 1c 38 10 c1 c1 c1 f8 ef bf ff e0 e9 e9 89 ..I.........n......8............
3e80 b1 63 c7 6a fd 36 24 84 68 48 aa 90 35 00 dc be 7d 1b ab 56 ad c2 84 09 13 30 62 c4 08 f8 fa fa .c.j.6$.hH..5...}..V.....0b.....
3ea0 e2 cc 99 33 00 80 15 2b 56 c0 d7 d7 37 46 b8 3d 69 b6 17 2c 58 10 5d ba 74 d1 6d fb d2 e2 f6 d1 ...3...+V...7F.=i..,X.].t.m.....
3ec0 a3 47 e3 fc f9 f3 6f f4 9e 21 84 a4 1d 52 8d ac 89 76 7c fc f1 c7 38 77 ee 9c d6 cd 20 84 10 c3 .G....o..!...R...v|...8w........
3ee0 42 59 93 38 a1 ac 09 21 44 5b 28 6b 12 27 94 35 21 84 68 0b 65 4d e2 84 b2 26 84 10 6d a1 ac 89 BY.8...!D[(k.'.5!.h.eM...&..m...
3f00 99 d7 af 5f e3 f9 f3 e7 31 d6 db 93 f5 cb 97 2f f1 f2 e5 cb 94 6a 1a 21 84 18 1a ca 9a d8 50 a3 ..._....1....../.....j.!......P.
3f20 46 0d 94 2c 59 d2 66 5d 74 59 8f 19 33 06 4e 4e 4e 29 dd 34 42 08 31 2c 94 35 b1 e1 ee dd bb c8 F..,Y.f]tY..3.NNN).4B.1,.5......
3f40 9c 39 33 5c 5d 5d cd eb ac 65 3d 67 ce 1c 64 cb 96 0d 53 a7 4e d5 aa 89 84 10 62 38 28 6b 12 83 .93\]]...e=g..d...S.N.....b8(k..
3f60 d6 ad 5b db 08 5b 95 f5 9c 39 73 90 27 4f 1e e4 ca 95 4b e3 16 12 42 88 b1 a0 ac 49 0c ee de bd ..[..[...9s.'O....K...B....I....
3f80 8b ac 59 b3 22 4b 96 2c 70 75 75 c5 c7 1f 7f 8c 3f fe f8 03 f9 f2 e5 43 d6 ac 59 d9 ab 26 84 90 ..Y."K.,puu.....?......C..Y..&..
3fa0 14 86 b2 26 76 69 dd ba 35 32 64 c8 80 2c 59 b2 20 73 e6 cc c8 9d 3b 37 84 10 78 eb ad b7 b4 6e ...&vi..52d..,Y..s....;7..x....n
3fc0 1a 21 84 18 0e ca 9a d8 45 ed 5d 0b 21 cc 61 af 9a 10 42 b4 81 b2 26 b1 a2 f6 ae 55 59 73 ae 9a .!......E.].!.a...B...&....UYs..
3fe0 10 42 b4 81 b2 26 b1 62 dd bb 66 af 9a 10 42 b4 83 b2 26 0e 69 dd ba 35 d2 a7 4f cf 5e 35 21 84 .B...&.b..f...B...&.i..5..O.^5!.
4000 68 08 65 4d 1c 72 ef de 3d 64 ca 94 09 d3 a7 4f d7 ba 29 84 10 62 58 92 5d d6 bb 77 ef c6 80 01 h.eM.r..=d.....O..)..bX.]..w....
4020 de 0c c3 68 98 89 13 27 26 f7 5b 3d 55 70 fd fa 75 0c 18 30 40 b5 fe ec 6f 00 00 20 00 49 44 41 ...h...'&.[=Up..u..0@...o....IDA
4040 54 f3 df 07 a3 cf 6c dd ba 55 eb ff a2 b1 92 ec b2 f6 f5 f5 c5 b7 5f 0a 0c e9 c8 30 8c 16 f9 a5 T.....l..U............_....0....
4060 b9 c0 c7 c5 df 4b ee b7 7a aa e0 e0 c1 83 78 ff dd 2c 9a ff 4e 18 fd a5 76 25 81 9e 3d 3a 6b fd .....K..z.....x..,..N...v%..=:k.
4080 5f 34 56 52 44 d6 be 1d 04 60 62 18 46 8b 9c 5b 4d 59 ab 1c 3c 78 10 2e 9f bf a5 f9 ef 84 d1 5f _4VRD....`b.F..[MY..<x........._
40a0 c6 f5 a4 ac 29 6b 86 d1 30 94 b5 05 ca 9a 89 2d 94 35 65 cd 30 9a 86 b2 b6 40 59 33 b1 85 b2 a6 ....)k..0......-.5e.0....@Y3....
40c0 ac 19 46 d3 50 d6 16 28 6b 26 b6 50 d6 94 35 c3 68 1a ca da 02 65 cd c4 16 ca 9a b2 66 18 4d 43 ..F.P..(k&.P..5.h....e......f.MC
40e0 59 5b a0 ac 99 d8 42 59 53 d6 0c a3 69 28 6b 0b 94 35 13 5b 28 6b ca 9a 61 34 0d 65 6d 81 b2 66 Y[....BYS...i(k..5.[(k..a4.em..f
4100 62 0b 65 4d 59 33 8c a6 a1 ac 2d 24 44 d6 0b 06 09 d4 fc 4a a0 61 55 f9 6f 83 2a 02 2b 47 c8 6d b.eMY3....-$D......J.aU.o.*.+G.m
4120 73 7c 04 8a 17 12 f8 b5 65 d2 fd 9e 6e 6c 11 a8 55 51 c0 29 73 e2 1e 1f b2 40 a0 62 19 81 f2 9f s|......e...nl..UQ.)s....@.b....
4140 68 ff 7f 4e 8b 8c e9 21 50 f8 7f 02 7e 5d 13 f7 78 ca 9a b2 66 18 4d 43 59 5b 88 af ac 47 74 93 h..N...!P...~]..x...f.MCY[...Gt.
4160 e2 7c 12 6c 59 37 b9 8f ad 48 fb 79 26 ad ac 61 12 b8 be 39 fe b2 0e 5d 24 e5 64 bd 6e eb a4 c4 .|.lY7...H.y&..a...9...]$.d.n...
4180 cb 7a 74 77 01 cf 7a da ff 7f 7d 93 b4 6d 48 59 27 1a ca 9a 61 b4 0d 65 6d 21 3e b2 be b9 55 20 .ztw..z...}..mHY'...a..em!>...U.
41a0 53 46 81 f3 ab 63 6e 2b f5 91 e5 67 ca 5a 7f a1 ac df 00 ca 9a 61 b4 0d 65 6d 21 3e b2 9e de 5f SF...cn+...g.Z.......a..em!>..._
41c0 e0 fd 02 f6 b7 fd 77 c0 f2 73 3f 4f 81 8e 4d 04 9a b8 0a bc f7 8e fc f7 e5 21 b9 ed 75 a8 c0 b0 ......w..s?O..M..........!..u...
41e0 ce 02 8d aa 09 34 fd 4e a0 bb 87 c0 f3 10 cb 63 37 4d 10 a8 53 49 e0 a7 ba 02 d5 ca 0b cc f5 91 .....4.N.......c7M..SI..........
4200 eb ad 65 1d b2 40 e0 a3 f7 e5 d0 f6 92 a1 b6 ed b8 b1 45 a0 6a 79 81 ac 4e 72 98 be 75 7d b9 5e ..e..@............E.jy..Nr..u}.^
4220 95 f5 80 b6 02 45 0a 0a 94 fb 58 e0 9f 4d 96 c7 79 35 16 68 51 5b e0 e7 06 f2 df 7f b7 cb f5 01 .....E....X..M..y5.hQ[..........
4240 93 05 3e fb 48 e0 83 02 f2 78 63 7a d8 3f ff 8d e3 e5 3d b4 5b b9 09 34 76 15 b8 1d 60 39 6e fa ..>.H....xcz.?....=.[..4v...`9n.
4260 f4 02 d5 2b c8 f3 74 29 25 50 ba 98 c0 de 99 f2 39 d4 36 b6 74 93 5f 70 5e 1d 96 8f ab 5f 45 9e ...+..t)%P......9.6.t._p^...._E.
4280 ef e8 ee f2 3c 0b e4 93 d3 0f 2b fc 04 3e 29 22 50 ec 03 81 a3 fe 96 36 96 ff 44 a0 4a 39 79 ac ....<.....+..>)"P......6..D.J9y.
42a0 6f ca 0a 54 f8 4c e0 d4 72 4b fb a2 cb 3a b6 f6 da 0b 65 4d 59 33 8c a6 a1 ac 2d c4 47 d6 bd 5b o..T.L..rK...:....eMY3....-.G..[
42c0 49 09 c4 f5 ba f6 f3 94 32 bd bb 43 40 09 96 a2 db 3a 49 6e 9b e3 23 e0 fc 99 45 de 3f d4 10 18 I.......2..C@....:In..#...E.?...
42e0 d9 4d fe 7c 7e b5 40 de b7 04 ee ed 94 cb 27 96 49 a1 c0 64 2b eb e0 39 02 ed 1a 59 c4 16 3d b1 .M.|~.@.......'.I..d+..9...Y..=.
4300 f5 ac b3 67 15 08 9c 2d 97 9b b8 ca 76 aa db e7 fb 5a 7e 5e 33 4a 1e 5f 5d 8e ab 67 7d 7e b5 40 ...g...-....v....Z~^3J._]..g}~.@
4320 ae ec 16 e1 4d e9 2b bf 70 a8 db 7b b4 90 73 fb af 43 05 9a d5 94 af 0b 4c 72 7f f5 75 81 49 a0 ....M.+.p..{..s..C......Lr..u.I.
4340 5b 33 01 ff 3f 2c cb 2e a5 04 dc ab cb f3 dc 35 5d 20 77 4e 81 89 bd e5 36 df 0e 72 9b ba ef e2 [3..?,.........5].wN....6..r....
4360 21 72 d4 e3 e2 5a cb eb fc f1 87 96 d7 c8 5a d6 71 b5 37 7a 28 6b ca 9a 61 34 0d 65 6d 21 be b2 !r...Z........Z.q.7z(k..a4.em!..
4380 76 29 15 f7 eb da cf 53 f6 50 d5 e5 06 55 04 a6 f6 93 3f 57 fe 42 ce 7b ab db 96 0e 93 3d 4d 98 v).....S.P...U....?W.B.{.....=M.
43a0 64 af b7 de 37 b6 c7 3a 12 d5 7b 54 65 1d ba 48 f6 b8 5f 84 c4 fe fc b1 c9 ba 48 41 cb f2 b8 9e d...7..:..{Te..H.._.......HA....
43c0 f2 8b 82 ba bc 71 bc 40 dd ca b2 ad 55 ca 09 94 29 6e d9 16 97 ac 07 b4 b5 7c a9 80 49 e0 56 80 .....q.@....U...)n.......|..I.V.
43e0 80 10 02 f7 a3 be 74 44 06 09 7c f8 9e 14 e2 c2 c1 96 fd 5e 87 0a 8c fa 45 ae 6f 58 55 e0 d3 a2 ......tD..|........^....E.oXU...
4400 f2 2f c1 a9 db 5d 4a 09 2c 8a da 5f 09 96 c7 fc 6b 83 5c de 36 45 a0 6c 49 cb be 8b 87 d8 7e 91 ./...]J.,.._....k.\.6E.lI.....~.
4420 7a 12 b5 bf fa fa 59 cb 3a ae f6 46 0f 65 4d 59 33 8c a6 49 eb b2 7e fa f4 29 d6 ae 5d 1b af 7d z.....Y.:..F.eMY3..I..~..)..]..}
4440 e3 23 eb 19 0e 86 c1 ad 13 7d ce ba 59 4d 81 f1 bd e4 cf 1f be 27 25 d4 ac a6 4c dd ca 96 2f 00 .#.......}..YM.......'%...L.../.
4460 ad eb cb e1 6f 7b c7 bc be 59 20 43 06 29 b5 1c d9 6c 87 78 a3 27 3e 73 d6 d3 fb cb 63 a9 ff 0f ....o{...Y.C.)...l.x.'>s....c...
4480 72 66 17 b8 bc 5e 2e 1f 9c 2f 47 06 d4 7d e3 92 75 eb fa f2 8b 80 7a 4e 4d bf 93 43 e7 67 57 59 rf...^.../G..}..u.....zNM..C.gWY
44a0 f6 59 3c 44 7e d9 b0 16 e2 ec 01 02 9f 97 90 22 86 49 ca b4 6d 43 cb 76 97 52 f2 4b 04 4c f2 cb .Y<D~..........".I..mC.v.R.K.L..
44c0 89 10 02 61 7b e4 f2 9e 99 f2 39 ac 8f 5f ab a2 6d bb b2 3a c9 69 05 98 6c 65 1d 9f f6 5a 87 b2 ...a{.....9.._..m..:.i..le...Z..
44e0 36 80 ac 0f cc 93 73 2f 0d ab ca 37 65 d5 f2 72 18 27 32 28 e5 da e0 5e 5d 60 d9 30 ed 5f 8b b8 6.....s/...7e..r.'2(...^]`.0._..
4500 f2 22 44 a0 68 41 cb 37 e7 37 49 f4 52 8d a4 3c 76 5a 4a 5a 97 35 00 94 2e 5d 1a 4e 4e 4e 18 37 ."D.hA.7.7I.R..<vZJZ.5...].NNN.7
4520 6e 9c c3 fd e2 23 eb db 01 52 38 17 d6 d8 ae 7f ba 5f be cf 23 f6 c9 65 47 b2 fe a6 ac c0 a4 3e n....#...R8......_..#..eG......>
4540 b6 8f 7f b8 5b fe eb d3 4e 7e 4e 58 6f 53 05 72 7d b3 1c e6 55 82 e5 10 f0 57 a5 13 3e 0c 1e 9b ....[...N~NXoS.r}...U....W..>...
4560 ac 17 0d b6 15 5f e0 ec 84 c9 da a7 9d 9c f7 b5 5e f7 68 af 6d fb 9a d5 94 f3 f4 d6 5f 46 da 34 ....._..........^.h.m......._F.4
4580 10 e8 d2 d4 b2 3c a4 e3 9b c9 da ba 67 ad 38 e8 59 c7 a7 bd d6 a1 ac d3 b8 ac f7 cd 92 ff e1 af .....<......g.8.Y...............
45a0 59 5d c4 71 68 81 fc b6 77 70 7e f2 3c a7 bd 37 d5 ee 19 f2 a2 13 ad 5f 8f e8 c9 9e 55 e0 ea 9f Y].qh...wp~.<..7......._....U...
45c0 b6 eb 56 f8 09 3c 3b 28 7f b6 f7 81 93 90 44 bf a0 c4 fa d8 09 6d 57 5a 8d 11 64 0d 00 95 2b 57 ..V..<;(......D......mWZ..d...+W
45e0 46 f6 ec d9 91 2d 5b b6 58 a5 1d df d2 ad 89 bd e5 10 ea d3 fd 72 f9 75 a8 94 73 87 c6 96 7d 1c F....-[.X............r.u..s...}.
4600 c9 7a ae 8f 80 ab b3 45 0c 7b 67 ca ed 30 c9 2f 01 79 72 59 2e ee 0a 59 20 7b 7d 30 d9 ce 59 3f .z.....E.{g..0./.yrY...Y.{}0..Y?
4620 3b 28 87 8c 27 f7 b1 df c6 f3 ab 05 f2 e7 95 3f 0f ea 20 ff 3f 3b 92 f5 81 79 f2 ff bd 3a 57 3e ;(..'..........?....?;...y...:W>
4640 a8 83 ad ac 67 f4 b7 b4 c3 9e b4 2f ac 91 17 80 3d d8 25 97 ef ef 94 3d 66 75 a8 7e de 40 29 d3 ....g....../....=.%....=fu.~.@).
4660 7b 3b 05 de c9 23 2f 08 83 49 60 78 17 79 f1 d8 ab c3 f2 75 74 75 7e 33 59 67 75 b2 cc 59 cf f2 {;...#/..I`x.y.....utu~3Ygu..Y..
4680 8e 7d ce 3a ae f6 46 0f 65 9d c6 65 fd d9 47 f2 3f 79 f4 f5 6d 1b a6 ac ac f5 9a b8 a4 98 d4 b2 .}.:..F.e..e..G.?y..m...........
46a0 4e aa 76 a5 a5 18 45 d6 00 f0 ed b7 df 22 53 a6 4c c8 95 2b 97 5d 69 27 e4 a6 28 0b 07 cb ab 9b N.v...E......"S.L..+.]i'..(.....
46c0 1b 56 15 a8 51 41 ce 81 aa 57 74 af f0 13 28 59 58 a0 44 61 81 d5 23 e5 85 4e ef 17 90 32 d8 39 .V..QA...Wt...(YX.Da..#..N...2.9
46e0 4d 4a c9 af ab ec 41 b7 74 13 f0 a8 65 91 24 4c 72 d8 b6 e6 57 02 3f d6 91 a3 62 b7 03 a4 a0 dc MJ....A.t...e.$Lr...W.?...b.....
4700 be 96 57 55 ff 54 57 0a e9 f3 12 72 38 bc 6b d3 98 ed 7b 1d 2a e7 81 eb 57 91 5f 04 4e 2e 97 73 ..WU.TW....r8.k...{.*...W._.N..s
4720 e5 79 72 09 0c f6 92 9f 3f 65 4b ca 2b d5 d5 0b b6 fa ff 2c bf 00 78 d4 92 9f 21 d9 b3 ca 39 7a .yr.....?eK.+......,..x...!...9z
4740 98 e4 55 e3 e5 3e 96 e7 3b ac b3 fd d7 c4 ba dd 0d ab ca f7 2f 4c f2 f9 f2 e7 95 17 71 9d 5e 21 ..U..>..;.........../L......q.^!
4760 bf 04 bc 9b 4f 2e 47 ec 93 73 e4 2e a5 04 9a 47 4d 09 7c f8 9e bc d8 6d 60 7b 79 b1 dd d7 9f cb ....O.G..s.....GM.|....m`{y.....
4780 ff a7 2d 6a 4b 59 37 a8 22 df 9f 55 ca c9 8b c4 fa fe 24 9f 67 f1 10 f9 bb e8 da 54 6e b3 be 1a ..-jKY7."..U......$.g......Tn...
47a0 7c 7c 2f 79 dc 52 1f c9 df 89 a3 f6 da 0b 65 9d 86 65 7d 6e b5 fc 8f a5 ce 01 59 e7 79 88 fc b6 ||/y.R........e..e}n......Y.y...
47c0 b7 63 aa c0 ff de 96 df 76 7d 3b c8 2b 46 33 64 90 fb 9c 5f 2d 2f 34 69 e5 26 bf c5 87 2c b0 3c .c......v};.+F3d..._-/4i.&...,.<
47e0 3e 21 25 16 d1 ef a6 a4 96 43 8c e9 21 df 04 05 f2 d9 0a ed 79 88 40 27 77 f9 41 50 a7 92 7c 23 >!%......C..!.......y.@'w.AP..|#
4800 e4 ce 69 7b d1 87 75 62 6b a7 f5 b9 0d 68 2b df 28 d6 a5 22 ad eb cb 73 fd ce 45 b6 f5 c6 16 79 ..i{..ubk....h+.(.."...s..E....y
4820 c5 68 9e 5c f2 9b b4 bd f2 93 de ad e4 6b fa 9d 8b 7c 93 07 cd 91 1f 2e 95 bf b0 df 36 6b 59 5b .h.\.........k...|..........6kY[
4840 1f 1b 26 81 63 4b 64 bb 5b d7 97 f3 5c d3 fb c7 de ae d8 f6 4d 0b 31 92 ac 01 29 ec cc 99 33 43 ..&.cKd.[...\.......M.1...)...3C
4860 08 11 43 da bc dd 68 ea 8e bd 39 eb a4 0a 65 9d 86 65 bd 69 82 14 8b f5 5d 8e ec 45 2d a7 d8 3a ..C...h...9...e..e.i....]..E-..:
4880 49 7e 1b f6 a8 25 87 b8 3e 7a 5f 60 c3 58 b9 cf a9 e5 72 e8 48 9d e7 4e 68 89 45 f4 21 39 97 52 I~...%..>z_`.X....r.H..Nh.E.!9.R
48a0 52 44 2f 42 e4 37 ee 4c 19 2d 73 6d 63 7b ca 6f a4 cf 43 64 7b ea 57 89 fd 46 0a 71 b5 53 3d b7 RD/B.7.L.-smc{.o..Cd{.W..F.q.S=.
48c0 bd 33 e5 72 f4 52 11 7b 3d 58 eb 61 2f 7b 3d eb 0a 9f c9 5a 4b 75 b9 59 cd d8 e7 ff a3 f7 ac ad .3.r.R.{=X.a/{=....ZKu.Y........
48e0 8f 5d ab a2 fc 42 01 93 ec d5 34 71 8d bd 5d 8e f6 4d ed 39 b7 5a a0 f0 fb b9 d1 bb 77 6f c3 e4 .]...B....4q..]..M.9.Z......wo..
4900 c3 0f 3f 44 c6 8c 19 21 84 30 4b 3b 4b 96 2c 18 33 66 0c 65 9d 8a 43 59 27 23 46 90 b5 3a af 15 ..?D...!.0K;K.,.3f.e..CY'#F..:..
4920 5b b6 4e 8a 29 a4 9d d3 04 b2 65 91 b2 54 d7 95 28 2c c5 0c 53 c2 4b 2c ec c9 da ba 7c 22 57 76 [.N.).....e..T..(,..S.K,....|"Wv
4940 81 33 2b e5 cf 5f 95 96 c7 50 b7 2d 19 1a bb ac e3 6a 67 5c a5 22 89 91 f5 e4 3e 72 f8 11 26 29 .3+.._...P.-.....jg\."....>r..&)
4960 4e eb f2 98 e8 71 24 eb c6 ae f2 35 3c be 34 e6 e3 a2 b7 cb d1 be a9 3d e7 56 0b 7c f8 41 5e 8c N....q$....5<.4........=.V.|.A^.
4980 1e 3d da 30 f9 df ff fe 67 ee 5d 0b 21 90 3d 7b 76 e4 cf 9f 1f 53 a7 4e a5 ac 53 69 d4 9b a2 e4 .=.0....g.].!.={v....S.N..Si....
49a0 cf 2b 87 cf 93 fa f8 94 75 1a 96 f5 f9 d5 b1 0f 83 5b c7 de 2d 00 17 0c 92 c2 50 cb 0a 9a d5 94 .+......u........[..-.....P.....
49c0 37 51 58 38 38 71 25 16 f6 64 ad 4a 0b 26 39 14 7e 6c 89 fc b9 f0 ff e4 c5 20 8e da 17 9f 76 da 7QX88q%..d.J.&9.~l............v.
49e0 7b ac f5 05 2d 30 25 4e d6 f7 76 ca 61 fc eb 9b a5 b8 b7 4d 89 fd b5 75 24 eb fb 3b e5 dc 56 9e {...-0%N..v.a......M...u$..;..V.
4a00 5c f2 cb ce ce 69 b1 b7 cb d1 be a9 3d 46 1b 06 2f 53 a6 8c 59 d4 d9 b3 67 c7 bb ef be 0b 7f 7f \....i......=F../S..Y...g.......
4a20 7f 00 1c 06 67 62 0f 65 9d 86 65 0d 93 9c f7 9d f9 7b cc f5 3d 5a c8 ab 2f 61 b2 2f c3 5d d3 e5 ....gb.e..e......{..=Z../a./.]..
4a40 85 15 d6 eb 9e 04 cb db 19 26 a6 c4 22 21 b2 ae 58 46 de a4 40 dd e6 a8 67 ed a8 9d f6 ce 2d 29 .........&.."!..XF..@...g.....-)
4a60 64 0d 93 9c 3f 1e d1 4d 96 81 a8 77 81 b2 17 47 b2 56 4b 65 9e ee 97 e5 22 b9 73 5a ae 1a 8d de d...?..M...w...G.VKe....".sZ....
4a80 2e 47 fb a6 f6 18 49 d6 65 ca 94 41 a6 4c 99 62 48 5a 85 b2 66 62 0b 65 9d c6 65 1d b2 40 5e dc .G....I.e..A.L.bHZ..fb.e..e..@^.
4aa0 65 7d ff dd 8d e3 65 ef 4c bd 72 d4 9e ac 9f 87 48 01 ef 89 9a eb 7d 1d 2a af 72 3c b3 32 71 25 e}....e.L.r.....H.....}.*.r<.2q%
4ac0 16 09 91 f5 84 5f 05 be fc d4 32 67 dd d8 35 76 59 3b 6a a7 bd 73 8b 2e eb 77 f3 c9 1a d2 3f c7 ....._....2g..5vY;j..s...w....?.
4ae0 59 86 ce ad db 66 af fc 04 26 81 e5 c3 e5 c5 6b 71 fd a1 04 47 b2 ae 56 de 72 3d c1 c5 b5 f2 4b Y....f...&.....kq...G..V.r=....K
4b00 87 3a 9c 1f bd 5d 8e f6 4d ed 31 8a ac 4b 96 2c 89 6c d9 b2 d9 95 b4 0a 65 cd c4 16 ca 3a 8d cb .:...]..M.1..K.,.l......e....:..
4b20 1a 26 29 6c b7 af e5 fc b2 5a aa 71 2b ea 7e b4 a7 57 58 ca 29 9a b8 da ce 6f 5f 58 23 7b 90 1e .&)l.....Z.q+.~..WX.)....o_X#{..
4b40 b5 64 0f 72 91 d5 1c 73 42 4a 2c e6 fb 5a ca 48 ec 95 43 f4 6c 21 87 95 6b 54 90 25 22 2f 42 e4 .d.r...sBJ,..Z.H..C.l!..kT.%"/B.
4b60 4d 0a 3e 2f 21 2f 2e 1b da 49 ca 3b b6 f3 8b ad 9d d6 e7 16 5b a9 c8 60 2f b9 4f ad 8a f2 aa eb M.>/!/...I.;........[..`/.O.....
4b80 de ad 2c 6d 3b bc 30 66 f9 89 da 9b 7d ba 5f ce b3 ab 5f 30 ec 25 7a a9 46 f4 63 0f e9 28 cb 36 ..,m;.0f....}._..._0.%z.F.c..(.6
4ba0 5a ba c9 e7 df 32 d1 f2 d8 e8 ed 72 b4 6f 6a 8f 11 64 5d a4 48 11 e4 cb 97 2f 56 49 ab 50 d6 4c Z....2.....r.oj..d].H..../VI.P.L
4bc0 6c a1 ac 0d 20 eb d4 96 e7 21 b6 7f 01 68 c9 50 f9 65 43 eb 76 45 4f f4 bb 3c 31 89 8b 11 64 bd l........!...h.P.eC.vEO..<1...d.
4be0 77 ef de 78 ed 47 59 33 b1 85 b2 a6 ac 75 97 8d e3 6d e7 ac 5b d4 96 43 e3 5a b7 0b 26 79 35 f6 w..x.GY3.....u...m..[..C.Z..&y5.
4c00 e5 f5 f2 ce 70 d6 6d 64 12 1f 23 c8 3a be 50 d6 fa 88 69 b1 c0 17 25 b5 6f 87 75 28 6b ca 5a 77 ....p.md..#.:.P...i...%.o.u(k.Zw
4c20 51 87 af 3d 6a c9 f9 ea e8 7f 6b 57 cb 6c 18 2b e7 fb 6b 55 b4 dc 72 90 79 b3 50 d6 16 28 6b 7d Q..=j.....kW.l.+..kU..r.y.P..(k}
4c40 24 62 9f c0 fa b1 da b7 c3 3a 94 35 65 cd 30 9a 86 b2 b6 40 59 33 b1 85 b2 a6 ac 19 46 d3 50 d6 $b.......:.5e.0....@Y3......F.P.
4c60 16 de 44 d6 71 dd c6 37 68 8e bc ce a2 4d 03 79 31 a9 f5 4d 89 d4 c7 8e ee 2e 4b 27 0b e4 93 f7 ..D.q..7h....M.y1..M......K'....
4c80 30 58 e1 27 f0 49 11 81 62 1f 08 1c f5 b7 ec ef e8 56 c4 4b 87 c9 8b 59 3d eb c9 5b e6 06 ce b6 0X.'.I..b........V.K...Y=..[....
4ca0 df de 19 fd e5 05 a1 3f 37 90 23 68 87 17 ca f5 89 bd 05 b2 75 46 76 93 e7 a0 de 69 d1 bb 8d bc .......?7.#h........uFv....i....
4cc0 20 54 bd 0b a0 a3 d7 2a 32 48 6e 17 42 e0 71 a0 5c 77 3b 40 9e 4b c5 32 b2 ad 3f d6 91 af c9 2c .T.....*2Hn.B.q.\w;@.K.2..?....,
4ce0 ef b8 9f 0b 26 39 b5 57 bb 92 6c 77 63 57 79 bc 84 fe 7e 29 6b ca 9a 61 34 0d 65 6d e1 4d 7b d6 ....&9.W..lwcWy...~)k..a4.em.M{.
4d00 8e 6e e3 1b 3c c7 f2 d7 a0 5e 87 4a 19 5a d7 f2 bb 94 92 7f b4 e3 d5 61 79 ff 82 dc 39 2d 55 13 .n..<....^.J.Z.........ay...9-U.
4d20 be 1d e4 36 98 1c df e2 f7 e5 21 79 c3 24 f5 3e 07 7f 8e 93 b7 0f b6 d7 d6 25 43 2d 7f 81 ee de ...6......!y.$.>.........%C-....
4d40 4e 59 2d a2 6e 4b cc 2d 90 a3 a7 6e 65 db db 22 7f 5e c2 56 a0 8e 5e ab a7 fb 6d 65 5d bf 8a bc NY-.nK.-...ne..".^.V..^...me]...
4d60 37 05 4c 02 e1 7b e5 1f 45 b1 2e db 74 f4 5c e7 57 4b 79 ab 82 9e d2 57 56 98 24 f4 77 4b 59 53 7.L..{..E...t.\.WKy....WV.$.wKYS
4d80 d6 0c a3 69 28 6b 0b 49 21 eb d8 6e e3 fb 70 b7 bc 0b 9e db d7 52 52 f9 f3 0a ac 1d 6d fb 58 b5 ...i(k.I!..n..p......RR.....m.X.
4da0 ec 51 fd 3b cc ea df 5e df 36 45 96 3d c2 e4 f8 16 bf af 0e 4b 81 f6 f3 14 b8 b9 d5 71 5b cf ac .Q.;...^.6E.=.......K.......q[..
4dc0 94 f7 63 a8 f7 8d 6c 4f fa f4 96 9b ff 24 e6 16 c8 d1 13 1f 59 c7 f6 5a 59 cb fa e9 7e 81 74 e9 ..c...lO.....$......Y..ZY...~.t.
4de0 6c ff 22 56 fb ef e3 2f eb 01 6d 65 af 5a dd 76 2b 40 1e fb fe 4e fb ed 8e 2d 94 35 65 cd 30 9a l."V.../..me.Z.v+@...N...-.5e.0.
4e00 86 b2 b6 90 14 b2 8e ed 66 43 3f d6 b1 fd 7b d7 b5 2a ca 3f 3c 61 ef b1 8e fe 6e 73 5c b7 f8 3d ........fC?...{..*.?<a....ns\..=
4e20 b9 5c e0 fb 6f 05 b2 38 c9 1e a4 bd 3f f5 fa ea b0 40 a1 77 65 ef 5a 5d a7 de c2 17 a6 84 df 02 .\..o..8....?....@.we.Z]........
4e40 d9 de 6b 11 1f 59 c7 f6 5a 59 cb fa ea 9f b6 5f 5c 60 8a 79 93 27 47 cf d5 ba be fc fb 04 6a 9b ..k..Y..ZY....._\`.y.'G.......j.
4e60 9b 7e 27 5f cb b3 ab 12 f6 bb a5 ac 29 6b 86 d1 34 94 b5 85 e4 94 75 d1 82 02 ab 46 5a b6 b9 3a .~'_........)k..4.....u....FZ..:
4e80 27 4e d6 8e 6e f1 fb ea b0 1c 26 86 49 e0 ee 0e d9 63 6e 50 25 66 3b ff d9 24 8f af de 05 f1 75 'N..n.....&.I....cnP%f;..$.....u
4ea0 a8 40 c6 0c 8e 65 1d d7 ad 85 a3 e7 fb 6f 6d 6f b5 5c a4 60 e2 64 ad f6 ac d5 39 75 98 62 f6 ac .@...e.......omo.\.`.d....9u.b..
4ec0 1d 3d 97 4f 3b 39 4f 6d dd b6 47 7b 13 7e bb 60 ca 9a b2 66 18 4d 43 59 5b 48 4e 59 d7 fc ca f2 .=.O;9Om..G{.~.`...f.MCY[HNY....
4ee0 e7 61 1f ee 96 e2 4b 8c ac 1d dd e2 f7 de 4e db 9b 05 cd f2 8e 29 2a 98 a4 60 73 66 97 52 86 49 .a....K.......N......)*..`sf.R.I
4f00 fe 09 5b 21 1c cb 3a ae 5b 0b 47 cf af 2d e5 dd 11 d5 ff 63 99 32 26 4e d6 30 c9 0b e1 7e 69 2e ..[!..:.[.G..-.....c.2&N.0...~i.
4f20 7f 0e df 2b ef 4c 68 2d 6b 47 cf 75 61 8d 3c f6 83 5d 72 f9 fe 4e d9 f3 7e 91 c0 72 54 ca 9a b2 ...+.Lh-kG.ua.<..]r..N..~..rT...
4f40 66 18 4d 43 59 5b 78 13 59 c7 75 1b df d3 2b e4 6d 80 eb 44 5d 95 5c ba 98 1c 46 3e bc 30 e6 63 f.MCY[x.Y.u...+.m..D].\...F>.0.c
4f60 5b d4 96 b2 6a 50 45 0e 03 57 29 27 e7 74 fb fe 24 9f 2b b6 5b fc 3e 09 16 f8 7f 7b e7 1d 1e 55 [...jPE..W)'.t..$.+.[.>....{...U
4f80 95 fe f1 43 42 12 20 a1 ef 02 8a 02 82 14 01 89 74 02 21 f4 84 04 92 50 14 e9 84 22 88 14 61 15 ...CB...........t.!....P..."..a.
4fa0 90 26 5d 2c 74 45 7e 08 48 57 50 70 5d ba 80 2b 4a 80 40 66 d7 c6 0a 96 55 44 5c 64 dd 5d 17 04 .&],tE~.HWPp]..+J.@f....UD\d.]..
4fc0 59 5a be bf 3f 5e 6e ee 9d c9 cc dc 64 92 c9 9d 3b 7c 3f cf f3 3e e4 96 39 f7 4c 39 7c ee a9 b7 YZ..?^n.....d...;|?..>..9.L9|...
4fe0 77 bc ec eb 97 28 e2 fe fa 8f ee f3 bb ed 05 59 86 b8 67 7b 11 61 58 51 e9 4f cf dc e8 db 12 c8 w....(.........Y..g{.aXQ.O......
5000 ae f1 dd 0e 79 7f dd da ca 92 c5 d1 b5 14 5a 37 14 21 7b fb ac fe fe ae d4 94 95 92 d7 5e 49 57 ....y.........Z7.!{..........^IW
5020 f8 e9 3d b9 d9 89 69 20 9f cd f0 1e ce b2 f6 76 2d 38 e4 71 c5 f1 2d e4 33 49 6d e3 dc ff 9d db ..=...i........v-8.q..-.3Im.....
5040 a0 ac 29 6b 06 c3 d2 a0 ac 75 38 cf da 1e e1 da 67 5d 18 41 59 53 d6 0c 86 a5 41 59 eb 50 d6 f6 ..)k.....u8.....g].AYS....AY.P..
5060 08 ca 3a 27 ca df 17 a0 ac 19 0c 6b 83 b2 d6 a1 ac 03 3f d6 ce 90 c7 0e 6b 8b a2 14 d6 75 29 6b ..:'.......k......?.....k....u)k
5080 ca 9a c1 b0 34 28 6b 1d ca 9a e1 29 28 eb 19 33 d0 ac 7e 28 c6 f4 8e 60 d8 36 c2 03 20 0f 0c 5f ....4(k....)(..3..~(...`.6....._
50a0 a3 7f 97 70 d4 a9 55 d9 df 45 dd 16 1c 3b 76 0c 95 7e 5f cc f2 ef 24 70 82 65 5b 8b d6 8d 8a 62 ...p..U..E...;v..~_...$p.e[....b
50c0 fc b8 51 56 ff 44 3d e2 77 59 1f 3f 7e 1c cb 96 2d 63 d8 38 2a 54 a8 80 a9 53 a7 5a 9e 0f 86 ef ..QV.D=.wY.?~...-c.8*T...S.Z....
50e0 b1 69 d3 26 7f 17 75 5b f0 d3 4f 3f 59 fe 5d 04 52 b0 6c 3b c7 e1 c3 87 ad fe 89 7a c4 ef b2 26 .i.&..u[..O?Y.].R.l;.......z...&
5100 f6 a7 4e 9d 3a 38 75 ea 94 d5 d9 20 84 14 30 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db 07 ca ..N.:8u.......0,....&..@....l...
5120 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 ....MHp..m.(kb..4!....}...),...'
5140 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b 62 0a ,....&..@....l.......MHp..m.(kb.
5160 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db .4!....}...),...',....&..@....l.
5180 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 ......MHp..m.(kb..4!....}...),..
51a0 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b .',....&..@....l.......MHp..m.(k
51c0 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 2c db f6 81 b2 26 d9 5c bb 76 0d 67 ce b..4!....}...),...',....&.\.v.g.
51e0 9c c9 b1 df 5d 81 fe f9 e7 9f f1 ef 7f ff bb b0 b2 46 08 c9 07 2c db f6 87 b2 26 4e 74 eb d6 0d ....]............F...,....&Nt...
5200 55 aa 54 71 da e7 5a a0 a7 4c 99 82 c8 c8 c8 c2 ce 1a 21 24 1f b0 6c db 1b ca 9a 38 71 e9 d2 25 U.Tq..Z..L........!$..l....8q..%
5220 14 2d 5a 14 4d 9b 36 cd de 67 2c d0 0b 17 2e 44 64 64 24 d6 ac 59 63 55 16 09 21 3e c0 b2 6d 6f .-Z.M.6..g,....Ddd$..YcU..!>..mo
5240 28 6b 92 83 11 23 46 20 3c 3c 3c bb 50 6b 05 7a e1 c2 85 28 5f be 3c ca 97 2f 6f 71 0e 09 21 be (k...#F.<<<.Pk.z...(_.<../oq..!.
5260 c0 b2 6d 5f 28 6b 92 83 4b 97 2e 21 2c 2c 0c c5 8a 15 43 d3 a6 4d 51 a7 4e 1d 4c 9c 38 11 15 2a ..m_(k..K..!,,....C..MQ.N.L.8..*
5280 54 40 b1 62 c5 78 e7 4d 88 4d 61 d9 b6 2f 94 35 71 cb 88 11 23 10 1a 1a 8a e2 c5 8b a3 58 b1 62 T@.b.x.M.Ma../.5q...#........X.b
52a0 f8 fd ef 7f 0f a5 14 ef bc 09 b1 39 2c db f6 84 b2 26 6e d1 ee c0 95 52 d9 c1 3b 6f 42 ec 0f cb ...........9,....&n....R..;oB...
52c0 b6 3d a1 ac 89 47 b4 3b 70 ad 40 f3 ce 9b 90 e0 80 65 db 7e 50 d6 c4 23 c6 3b 70 de 79 13 12 3c .=...G.;p.@......e.~P..#.;p.y..<
52e0 b0 6c db 0f ca 9a 78 65 c4 88 11 08 09 09 e1 9d 37 21 41 06 cb b6 bd a0 ac 89 57 2e 5f be 8c f0 .l....xe........7!A.......W._...
5300 f0 70 6c de bc d9 ea ac 10 42 0a 10 96 6d 7b 11 54 b2 3e 7a f4 28 c6 8c 1e 8e 31 a3 1f 63 30 02 .pl......B...m{.T.>z.(....1..c0.
5320 3e 96 bf f2 b2 d5 45 c6 b6 ec de bd db f2 ef 8f c1 d0 62 ee 9c 59 7e ff cd 07 95 ac 5f 7b ed 35 >.....E...........b..Y~....._{.5
5340 c4 44 87 63 e9 d3 8a c1 08 e8 78 e2 11 85 8e ed 9a 58 5d 64 6c cb f4 e9 d3 90 d8 d2 fa ef 91 c1 .D.c......x......X]dl...........
5360 98 3a 44 a1 d6 fd 77 f9 fd 37 1f 74 b2 1e d6 a3 04 e0 50 0c 46 40 c7 81 e5 94 75 7e 98 3e 7d 1a .:D...w..7.t......P.F@....u~.>}.
5380 66 8d b0 fe 7b 64 30 be dc 4e 59 e7 19 ca 9a 61 97 a0 ac f3 07 65 cd 08 94 a0 ac 7d 80 b2 66 d8 f...{d0..NY....a.....e.....}..f.
53a0 25 28 eb fc 41 59 33 02 25 28 6b 1f a0 ac 19 76 09 ca 3a 7f 50 d6 8c 40 09 ca da 07 28 6b 86 5d %(..AY3.%(k....v..:.P..@....(k.]
53c0 82 b2 ce 1f 94 35 23 50 82 b2 f6 01 ca 9a 61 97 a0 ac f3 07 65 cd 08 94 a0 ac 7d 80 b2 66 d8 25 .....5#P......a.....e.....}..f.%
53e0 28 eb fc 41 59 33 02 25 28 6b 1f a0 ac 19 76 09 ca 3a 7f 50 d6 8c 40 09 ca da 07 cc 64 fd cb 07 (..AY3.%(k....v..:.P..@.....d...
5400 0a a9 6d 14 42 42 14 e2 1a c9 df 31 0d e4 ef 2f b7 fb ef cb 4c 4b 56 88 2c ae 70 6c 6d c1 a5 b9 ..m.BB.....1.../....LKV.,.plm...
5420 f8 0f 0a 55 2a 29 14 8f 50 18 db 5b f6 6d 98 a5 50 bb aa 42 cb 68 85 c3 ab 15 56 4c 56 a8 5b 5d ...U*)..P..[.m..P..B.h....VLV.[]
5440 a1 42 39 fd 1c 5f 63 c1 38 85 aa 77 29 cc 1f 9d f7 d7 66 6e 90 cf b9 f1 03 05 ff d9 8e eb ab 90 .B9.._c.8..w).....fn............
5460 12 a7 d0 bc be c2 ce c5 d6 17 dc dc 06 65 9d 3f 28 6b 46 a0 04 65 ed 03 b9 ad 59 47 84 3b 8b b3 .............e.?(kF..e....YG.;..
5480 4f 82 42 eb 86 fe fd 42 6b dc 53 b0 b2 86 43 84 ac 94 c2 c1 57 65 fb 7f 47 15 ba c4 2a 5c 3b a6 O.B....Bk.S...C.....We..G...*\;.
54a0 9f 33 7f b4 42 42 4c c1 5c 6f 68 aa 6f b2 86 43 61 ef b2 82 97 f5 c9 ad 72 c3 02 87 c2 d7 7f 2c .3..BBL.\oh.o..Ca.......r......,
54c0 98 cf 37 73 83 dc 94 14 44 fe 5e 7a 52 61 50 57 f7 c7 28 eb fc 41 59 33 02 25 28 6b 1f f0 55 d6 ..7s....D.^zRaPW..(..AY3.%(k..U.
54e0 eb 66 ca 3e 7f 7e a1 fe 90 35 1c 0a 8f c6 2b d4 af a1 70 f3 b8 c2 bc 27 14 f6 2f 77 3e 1e cc b2 .f.>.~...5....+...p....'../w>...
5500 de f7 72 c1 a7 49 59 db 03 ca 9a 11 28 41 59 fb 80 af b2 5e 35 4d e1 be ca fa f6 c5 43 0a 03 bb ..r..IY.....(AY....^5M......C...
5520 28 f4 ed ac d0 b5 b5 1c d7 8e bd 31 4f 9a 5d 07 75 55 e8 d4 5c e1 a3 55 b2 3f 2b 53 44 d6 ad ad (..........1O.].uU..\..U.?+SD...
5540 bc 6e 58 37 85 5f 3f d2 5f a7 c9 7a c3 2c 85 72 a5 15 1a d6 56 38 fa ba 34 cd c7 35 52 a8 53 4d .nX7._?._..z.,.r....V8..4..5R.SM
5560 e1 f3 2d de af ed 2e ce ee 92 a6 f0 67 d2 dc 8b c1 28 eb 4b 1f 2a 54 af 2c b5 f1 f5 b3 14 ea d5 ..-.........g....(.K.*T.,.......
5580 50 b8 b7 a2 b3 e0 2f 1e 52 18 9c 22 d7 ef de 4e e1 e1 0e 0a e7 f7 c9 31 a3 ac 07 24 29 84 86 2a P...../.R.."...N.......1...$)..*
55a0 7c b7 43 b6 93 5a 49 ba 37 32 64 fb 7a 86 c2 c8 87 15 a2 6b c9 e7 35 77 a4 b3 58 7d f9 8c 8d 91 |.C..ZI.72d.z......k..5w..X}....
55c0 b1 4e 9a d6 cb 94 94 ee 8c 0d b3 64 ff ae 25 0a 89 2d 15 fa 27 c9 77 f1 cd bb b2 7f ee 48 39 77 .N.........d..%..-..'.w......H9w
55e0 e4 c3 0a 8f 74 94 ef a0 43 33 e7 34 cf ed 51 68 d3 58 3e cf d4 36 d2 7d e1 2d af 87 56 2a 3c 70 ....t...C3.4..Qh.X>..6.}.-..V*<p
5600 9f a4 bb 63 91 e4 e1 f7 65 15 1e ef 29 37 12 da e7 9b da 46 ba 11 8c d7 a2 ac f3 07 65 cd 08 94 ...c....e...)7.....F........e...
5620 a0 ac 7d c0 17 59 5f 3b 26 e2 d9 f7 b2 7e bc 7f 92 c2 f8 be f2 f7 6f e9 d2 d4 9a b1 4e 6a af 25 ..}..Y_;&....~........o.....Nj.%
5640 23 a5 b9 19 0e f9 0f 7a e1 78 f9 7b cd 74 e9 2b be 79 5c b6 c7 f6 56 18 de 43 4f d3 58 b3 9e 34 #......z.x.{.t.+.y\...V..CO.X..4
5660 48 17 01 1c f2 1f f9 a1 95 de af ed ed fd cc 18 2e a2 fc f4 cd 9c c7 5c 6b d6 57 8f c8 b9 2f 3d H......................\k.W.../=
5680 29 db 2f 4f 90 fe 5e ed f8 80 24 11 bf b6 dd bd 9d 9e 6f d7 9a 75 64 71 5d d6 bf 7c e0 2c eb 85 )./O..^...$.......o..udq]..|.,..
56a0 e3 15 9a d5 13 69 67 65 2a f4 68 ef 2c 6b 5f 3e 63 d7 70 ad ad 9f de a6 50 b6 94 c2 3f 0f c8 f6 .....ige*.h.,k_>c.p.....P...?...
56c0 3b 2f 49 9f bd f6 9d 4c 1a 24 b5 e6 1f 76 cb 8d d4 b0 6e 39 d3 74 57 b3 f6 f6 9d fc b0 5b a1 74 ;/I....L.$...v....n9.tW......[.t
56e0 94 74 49 7c f8 9a 7c 17 da eb 58 b3 f6 1f 94 35 23 50 82 b2 f6 81 bc c8 3a ae 91 48 ac 74 94 c2 .tI|..|...X....5#P......:..H.t..
5700 90 14 fd d8 b5 63 52 63 34 0a 72 78 0f 85 31 8f 2a dc 3a 21 35 a7 49 83 14 7e dc eb 9c 66 ec 43 .....cRc4.rx..1.*.:!5.I..~...f.C
5720 ba 00 e1 90 ff bc 23 c2 e5 35 70 38 cb fa e4 56 11 d2 95 74 d9 4e 89 13 a1 79 bb b6 b7 f7 f3 7f ......#..5p8...V...t.N...y......
5740 93 15 8a 14 71 7f 9e 27 59 7f bf 4b b6 ff ba 49 de 93 f1 bd 3b 36 ea e7 7f fb 27 11 31 1c 79 93 ....q..'Y..K...I....;6....'.1.y.
5760 75 8b 07 9d 3f 8f cd 73 75 b1 fa fa 19 bb 86 ab ac a7 0d 95 3e 7b 6d fb e6 71 85 f0 30 85 23 6b u...?..su...........>{m..q..0.#k
5780 64 7b d2 20 cf f2 d4 c2 55 d6 b9 f9 4e 5e 99 a8 50 b3 8a d4 ba b5 9b 0c 38 28 6b 7f 42 59 33 02 d{......U...N^..P.......8(k.BY3.
57a0 25 28 6b 1f f0 a5 66 bd 7f b9 48 66 d7 12 d9 3e b3 53 b6 93 e3 a4 3f f8 d1 78 85 b6 8d 15 46 f7 %(k...f...Hf...>.S....?..x....F.
57c0 92 e3 9f 6d 91 da 66 b1 08 69 6e d5 64 55 ed 6e 85 d7 9f d5 af f1 c5 db 92 ce 85 fd b2 ed da 67 ...m..f..in.dU.n...............g
57e0 dd b0 b6 c2 a6 39 92 de 94 21 b9 bb b6 bb f8 cf 9f e5 9c c5 7f 50 28 1a 2a 37 02 c6 e3 9e 64 ad .....9...!...........P(.*7....d.
5800 35 d1 9f da 26 37 2c c6 eb 7f fb 27 f7 d7 ca 8b ac ab de e5 fc 79 18 c5 ea eb 67 ec 1a ae b2 4e 5...&7,....'.........y....g....N
5820 4b 96 e6 6a e3 39 15 ca 29 6c 9d 2f 7f 4f 1a a4 f0 54 7f ef bf 0d 57 59 e7 e6 3b c9 ca 14 59 3f K..j.9..)l./.O...T....WY..;...Y?
5840 3d c0 39 ad 82 92 f5 a1 43 87 f0 e1 87 1f e2 e6 cd 9b 7e 2e 41 f6 81 b2 66 04 4a 50 d6 3e e0 6b =.9.....C.........~.A...f.JP.>.k
5860 9f 75 6a 1b 85 f8 16 f2 b7 56 93 fa 6c 8b 7e fc 46 86 c8 ed d6 09 85 ff 1e 92 7d ff 3c 20 af 4b .uj......V..l.~.F.........}.<..K
5880 89 93 ed d6 0d 9d 6b 92 1f ad f2 5c b3 86 43 61 d1 78 91 e8 84 81 22 4c b3 6b 7b 7a 2f a3 7a 49 ......k....\..Ca.x...."L.k{z/.zI
58a0 cd f1 d6 09 11 97 6b 3f 6c 5e 64 ad 5d 3f 73 83 7e fe 4f ef 29 fc fb 7d f9 db 55 d6 65 4b e9 53 ......k?l^d.]?s.~.O.)..}..U.eK.S
58c0 de be df e5 2c eb 98 06 0a 2f 8e d5 cf 75 57 b3 ce eb 67 ec 1a ae b2 9e 3e 2c 67 cd 3a ac a8 73 ....,..../...uW...g.....>,g.:..s
58e0 cd 3a af b2 ce cd 77 f2 e1 6b 72 93 50 32 52 6e d2 b4 fd f9 95 f5 a1 43 87 d0 a2 45 0b 14 2d 5a .:....w..kr.P2Rn.......C...E..-Z
5900 14 27 4f 9e 2c a4 52 64 0f f2 2a eb a3 af cb 0d 57 6a 1b f9 8d b4 69 2c cf 22 be 7c d8 fa ff ec .'O.,.Rd..*.....Wj....i,.".|....
5920 ed 16 f9 99 c6 19 8c 41 59 fb 80 af b2 3e b1 5e 9a 91 35 f1 0c 48 52 98 69 e8 7b 9c 39 5c e6 2c .......AY....>.^..5..HR.i.{.9\.,
5940 ff 7c d0 59 06 af 4d 95 be 58 38 a4 cf 3a a6 41 ee fa ac e1 10 09 86 87 49 cd d1 98 37 4f d7 76 .|.Y..M..X8..:.A........I...7O.v
5960 f7 3e fe ba 49 e1 89 47 f4 ed cc 0d 32 87 fc 8f 0b f4 7d 79 91 b5 76 fd 89 03 f5 ed a4 56 7a 6d .>..I..G....2.....}y..v......Vzm
5980 dd 55 d6 8d 1f 50 f8 d3 42 f9 7b f5 74 67 59 2f 79 4a a1 49 5d bd cf 3a 25 ce 59 ac be 7c c6 ae .U...P..B.{.tgY/yJ.I]..:%.Y..|..
59a0 e1 2a eb 2f b7 9b f7 59 9b c9 fa f4 36 a9 8d 6b 79 fa 6e 87 f7 ef e4 7f 47 a5 15 e0 da 31 d9 df .*./...Y....6..ky.n.....G....1..
59c0 2a 5a de 2f 1c d2 3d d1 ab 93 fc ed 2a 6d 6f b2 d6 24 5d b1 62 45 84 87 87 e3 db 6f bf 2d e4 92 *Z./..=.....*mo..$].bE.....o.-..
59e0 14 f8 e4 45 d6 1f be 26 e5 4f eb fa 81 43 e1 f8 3a 19 48 e8 8f 19 1a 70 78 bf 51 0b 86 c8 cf cc ...E...&.O...C..:.H....px.Q.....
5a00 90 fc 84 b1 35 af 20 a2 4b ac c2 da 19 f9 4b 83 b2 f6 81 dc 2c 8a d2 b3 bd 08 ad 5d 13 19 bc a4 ....5...K.....K.....,......]....
5a20 1d eb d4 5c 46 2e af 9e 2e a3 7f d3 92 65 d4 f0 a3 f1 52 fb bd 75 42 06 17 f5 8e 97 51 c6 fd 12 ...\F........e....R..uB.....Q...
5a40 e5 8b fe fa 8f f2 fa ac 4c 85 e7 46 c9 dd 7b af 4e ce a3 c1 87 75 93 1f 59 bb 26 7a 2d 1a 0e 85 ........L..F..{.N....u..Y.&z-...
5a60 ce 2d e5 ee de 98 47 4f d7 76 7d 2f 0b c6 c9 7f 40 1d 9b 29 7c f5 8e ec 9b 35 42 64 75 d7 ef e4 .-....GO.v}/....@..)|....5Bdu...
5a80 ef 95 53 64 5a 57 c5 f2 fa 00 a9 ee ed 44 aa 3d da cb e8 f0 f8 16 52 fb d4 6e 2c b4 eb f7 ea 24 ..SdZW.......D.=......R..n,....$
5aa0 ef 73 e5 14 d9 bf f8 0f d2 d4 5f bf 86 c2 b6 17 64 df de 65 0a 0f de 2f f3 d4 5f 9b aa a7 7b 3d .s........_.....d..e.../.._...{=
5ac0 43 a4 3d aa 97 c2 43 b5 e5 9a 13 06 4a de b4 7c f8 f2 19 1b e3 c4 7a 19 27 50 b6 94 7c a7 67 6f C.=...C.....J..|......z.'P..|.go
5ae0 ff 47 bc 6b 89 dc 9c f4 49 90 1b 04 6d 34 f8 d6 f9 b2 60 4c ad aa ce 37 23 ae 91 95 29 37 50 5a .G.k....I...m4....`L...7#...)7PZ
5b00 b3 f7 ad 13 9e f3 7a 6a 9b 0c 2a 8c ae 25 37 08 cf a4 c9 67 d0 be a9 6c 9f dd a5 d0 a8 8e d4 e6 ......zj..*..%7....g...l........
5b20 e6 3d e1 7c 1d 77 b2 36 4a 3a 24 24 04 11 11 11 14 b5 07 f2 22 eb 7a 35 e4 c6 c9 9d 70 28 6b df .=.|.w.6J:$$........".z5....p(k.
5b40 82 b2 d6 83 b2 f6 01 2e 37 ca b0 4b 18 65 ed 2a 69 a5 14 45 6d 42 6e 65 7d 6a 9b dc 40 69 37 6d ........7..K.e.*i..EmBne}j..@i7m
5b60 c6 b8 9e 21 37 5d 07 96 cb 0d 6e e3 07 64 34 ff bd 15 a5 eb 03 0e 69 69 e9 da 5a 5a 57 3a b7 74 ...!7]....n..d4.......ii..ZZW:.t
5b80 1e 68 38 a2 87 4c e7 d3 a6 3a 6a e3 53 3c 4d db f3 96 96 6b 78 3a 77 44 0f a9 6c 74 68 26 f9 6f .h8..L...:j.S<M....kx:wD..lth&.o
5ba0 5e 5f 6e 98 0f ad 94 eb 6b 53 0e fb 27 49 2b 92 76 a3 af 4d 5d 7c bc a7 dc 3c 57 2c 2f ad 72 27 ^_n.....kS..'I+.v..M]|...<W,/.r'
5bc0 b7 4a 8b 60 a5 f2 b2 de 84 96 ff c6 0f c8 20 dc b4 64 e9 e2 6b 56 4f a6 96 6a f9 73 95 f5 ce c5 .J.`.............d..kVO..j.s....
5be0 92 cf 01 49 72 c3 ae 4d f7 74 17 9e a6 57 be 30 46 f2 a5 c9 73 ea 10 85 52 91 f2 fd c0 21 79 09 ...Ir..M.t...W.0F...s...R....!y.
5c00 0d 95 8a 55 6a 1b 69 49 4c 88 91 96 d2 b9 23 a5 e2 52 bf 86 c2 96 e7 e4 fc dd 4b e5 7b d0 6e 9a ...Uj.iIL.....#..R........K.{.n.
5c20 de 9c 27 53 57 a7 de 1e 23 b4 60 9c 5c af 61 6d 49 6f df cb d2 05 f7 48 47 e9 d6 4a 6d 23 9f b7 ..'SW...#.`.\.amIo.....HG..Jm#..
5c40 d9 6f 8c b2 f6 01 ca 9a 61 97 d0 64 dd b2 65 4b 27 49 2b a5 10 1e 1e 8e de bd 7b 63 d8 b0 61 0c .o......a..d..eK'I+.......{c..a.
5c60 0f d1 b8 71 a3 5c c9 7a d7 12 f9 4c 7f 4b f7 7e de de 65 52 6b db bb 4c 5a 57 fa 24 48 d7 46 8d ...q.\.z...L.K.~..eRk..LZW.$H.F.
5c80 7b f4 ae 9e cf b7 c8 4c 05 ad 9f db 58 23 db fe a2 f3 54 40 d7 9a b5 59 5a c6 30 3b 77 5c 5f 69 {......L....X#....T@...YZ.0;w\_i
5ca0 11 cb ca 94 96 1e ad db e7 fc 3e c9 bf 96 ce 98 47 65 10 ab b6 3d 69 90 0c 84 fc f7 fb 32 30 b5 ..........>.....Ge...=i......20.
5cc0 54 a4 e4 f9 e6 71 85 0f 56 2a fc ae 8c 7e ee c6 d9 d2 e2 a6 b5 da ad 9e 2e 6b 41 68 f2 37 ca fa T....q..V*...~...........kAh.7..
5ce0 f4 36 49 4b 13 f4 2b 13 73 76 ef 69 61 36 bd d2 b5 a6 1b 5d 4b 97 35 1c 39 6b d6 3f ec 96 ef 57 .6IK..+.sv.ia6.....]K.5.9k.?...W
5d00 7b cd e9 6d 32 30 f5 cc 4e f7 df c3 93 7d 74 59 bb bb de fc d1 fa f1 ac 4c 69 0d 35 fb 8d 51 d6 {..m20..N....}tY........Li.5..Q.
5d20 3e 40 59 33 ec 12 9a ac 1f 7f fc 71 84 86 86 a2 48 91 22 d9 b2 2e 5d ba 34 1e 7b ec 31 ac 5a b5 >@Y3.......q....H."...].4.{.1.Z.
5d40 8a e1 21 92 93 bb e6 49 d6 57 8f 78 3f 6f ef b2 9c f3 eb 0f be aa 50 a2 98 3e 06 01 0e e9 46 d9 ..!....I.W.x?o........P..>....F.
5d60 fe a2 fc bd 73 b1 fc 67 9f 12 27 b5 d0 06 35 f5 f3 5c 25 61 96 56 5e ae 7b f9 b0 74 49 25 b6 94 ....s..g..'...5..\%a.V^.{..tI%..
5d80 c5 8d b4 73 b2 32 65 50 67 62 4b a9 15 d6 ad ee fc 4c 80 49 83 9c a7 a9 36 ad a7 cf d8 b8 76 4c ...s.2ePgbK......L.I....6.....vL
5da0 3e a7 8b b7 07 77 6e 9c 2d b5 69 ed dc df d2 e5 f8 5f 36 c9 b6 51 d6 d3 86 4a ad 5a 3b f7 1f fb >....wn.-.i......_6..Q...J.Z;...
5dc0 e4 dc 7f 1d cc f9 de cc a6 57 fa 2a eb 2b 86 9b b1 66 f5 f4 b5 19 f2 2a eb 65 13 a4 bb 6c df cb .........W.*.+...f.....*.e...l..
5de0 fa 0d 84 59 50 d6 3e 40 59 33 ec 12 c6 66 f0 ab 57 af e6 90 76 85 0a 15 f0 e6 9b 6f 5a 5c a2 02 ...YP.>@Y3...f..W...v......oZ\..
5e00 97 dc 36 83 9f de e6 b9 19 dc 18 ee 96 c3 5d 37 53 e4 a0 4d d9 7b 34 5e 04 b7 7e 96 34 af 97 8c ..6...........]7S..M.{4^..~.4...
5e20 d4 d3 3d b6 56 6a c3 da 6b 5d 25 e1 2d 2d d7 bc e4 e6 dc 8d b3 a5 f9 d7 28 c4 55 d3 44 6e 9a b8 ..=.Vj..k]%.--..........(.U.Dn..
5e40 e6 8f 16 a9 6a c7 5d 07 58 b6 8a 76 1e 8c aa 94 0c f0 d4 d2 77 5d a6 b8 78 84 3e c5 d5 28 eb b4 ....j.].X..v........w]..x.>..(..
5e60 64 59 01 52 cb 6b af 4e d2 fc 6c 9c 19 a1 85 d9 f4 4a 5f 64 ed ba 54 74 62 4b 7d 1a 65 5e 65 7d dY.R.k.N..l......J_d..TtbK}.e^e}
5e80 f3 b8 bc a6 7a 65 e9 1a 71 1d 53 e4 2e 28 6b 1f a0 ac 19 76 09 77 03 cc 5c a5 4d 61 7b 26 2f 03 ....ze..q.S..(k....v.w..\.Ma{&/.
5ea0 cc a2 6b e9 03 25 8d 31 ae af 4c e9 82 c3 bd ac df 5f 21 cb d2 1a f7 fd 96 2e 33 00 36 dc 5e ae ..k..%.1..L......_!.......3.6.^.
5ec0 57 db ff d1 2a ef b2 f6 96 96 6b be 72 73 ee a3 b7 07 61 1a c5 37 24 45 06 75 6a db b3 1f cf 9f W...*.....k.rs....a..7$E.uj.....
5ee0 ac 8d 35 eb 2b 5e 6a d6 d3 87 e5 9c b1 71 f1 90 fb 81 b1 66 d3 2b bb b7 73 fe ae ee ab 9c f7 9a ..5.+^j......q.....f.+..s.......
5f00 75 53 43 cd 7a e9 d3 d2 a5 a1 1d 1b 9c e2 5d d6 bf 7c 20 2d 14 59 99 d2 72 12 11 2e b3 6e bc fd uSC.z.........]..|.-.Y..r....n..
5f20 be 28 6b 1f a0 ac 19 76 09 6f 53 b7 8c d2 8e 8a 8a a2 b0 dd 90 17 59 67 ac 93 be da b3 86 a9 5b .(k....v.oS...........Yg.......[
5f40 3b 17 4b b3 f5 f5 db 53 0d dd c9 fa 7a 86 08 f8 83 db 4b 01 67 65 ca 20 a6 bf bd 25 92 8f 2c ae ;.K....S....z.....K.ge.....%..,.
5f60 cb 6d e6 70 67 59 bb 4e db f3 96 96 6b 7e cd ce 7d fd 59 91 e9 cf 07 a5 2f 5b 5b 2a f9 b9 51 32 .m.pgY.N....k~..}.Y...../[[*..Q2
5f80 58 ec d6 09 79 4d fb a6 f9 93 75 f1 08 bd cf fa b5 a9 9e fb ac bf dc 2e 03 b5 b4 f5 18 fe 75 50 X...yM....u...................uP
5fa0 6e 90 b4 69 9c c6 30 9b 5e f9 54 7f 7d c6 c8 a9 6d 22 72 a3 ac 2b 95 97 1a fb 8e 45 d2 2d f0 c3 n..i..0.^.T.}...m"r..+.....E.-..
5fc0 6e 99 76 ab 3d 1b e0 d4 36 e7 3e eb 9d 8b 65 00 19 1c d2 15 72 ff bd ce b2 ee 1d af f0 ea 33 f2 n.v.=...6.>...e.....r.........3.
5fe0 5c 80 a9 43 e4 66 47 5b 67 e2 d6 09 85 7b 2a ba 5f c6 d9 f5 3d 51 d6 79 84 b2 66 d8 25 72 b3 28 \..C.fG[g....{*._...=Q.y..f.%r.(
6000 8a 26 ed 90 90 10 ac 5b b7 ae 90 4a 91 3d c8 eb a2 28 19 eb 64 cd 80 94 38 a9 4d f5 4f 92 be 55 .&.....[...J.=...(..d...8.M.O..U
6020 38 64 44 b4 71 1a a0 b1 7f fb cb ed 32 2a bb 4f 82 d4 64 37 18 9a a2 27 0f 16 d1 f4 49 10 21 47 8dD.q.......2*.O..d7...'....I.!G
6040 16 d2 b6 cb 18 00 00 20 00 49 44 41 54 d7 9b 5f dd 4d db f3 96 96 6b 78 3a 77 d6 08 69 36 7e 65 .........IDAT.._.M....kx:w..i6~e
6060 a2 e4 bb c6 3d 22 b0 57 26 ca 54 4c ed d9 ee bd e3 e5 7d 56 bb 5b 6a 8e c6 a9 8b db 5e 10 d1 96 ....=".W&.TL......}V.[j.....^...
6080 2f 2d 72 3f b9 55 6a e8 da 4a 7d 57 8f 88 ac 3b 36 93 95 fa e2 1a 39 8f 06 77 37 8d 73 d7 12 19 /-r?.Uj..J}W...;6.....9..w7.s...
60a0 f4 d6 2f 51 1f a9 ed e9 bd 79 9a 5e 09 87 d4 9a 9b d6 93 f7 3c 77 a4 48 bf 75 43 85 8f 37 eb ef ../Q.....y.^........<w.H.uC..7..
60c0 3f f6 21 79 fd b9 3d 7a 33 f8 f2 49 72 fd 7a 86 d1 e0 70 c8 0d 43 f7 76 72 e3 32 aa 97 7c 4f 75 ?.!y..=z3..Ir.z...p..C.vr.2..|Ou
60e0 aa e9 03 ef f6 2e 93 e9 a5 89 2d 65 35 cb 3f 2e 90 73 fb 27 c9 e7 f7 fc 18 f3 df 16 65 ed 03 94 ..........-e5.?..s.'........e...
6100 35 c3 2e 91 97 e5 46 af 5e bd 8a b3 67 cf fa b9 f4 d8 0b 2e 37 ea df 70 d7 67 1d 88 e1 ae cf ba 5.....F.^...g.......7..p.g......
6120 b0 83 b2 f6 01 ca 5a ee a2 6b 56 31 5f a9 2b 50 23 2d 59 6a 28 fe 5a ac 22 50 82 0f f2 c8 1f 94 ......Z..kV1_.+P#-Yj(.Z."P......
6140 b5 7f 83 b2 ce 7d 50 d6 3e 40 59 4b e4 66 59 cd 40 0e d7 a5 59 83 31 28 eb fc 41 59 fb 2f b4 45 .....}P.>@YK.fY.@...Y.1(..AY./.E
6160 51 2a 94 53 78 f6 31 eb f3 e3 29 ce ed 91 1b 8a 90 10 cf 4b 12 17 46 50 d6 3e 40 59 4b 50 d6 81 Q*.Sx.1...)........K..FP.>@YKP..
6180 1f 94 75 fe a0 ac 19 81 12 94 b5 0f d8 59 d6 ff 37 59 06 55 0c 4e 91 bb c4 13 eb 65 ff a5 0f 65 ..u..........Y..7Y.U.N.....e...e
61a0 ce 9f 52 32 cf 52 5b c6 70 bf 61 84 e4 f9 7d b2 04 5f 4c 03 59 f6 f0 b1 ee de 65 ed 6e 69 c0 7f ..R2.R[.p.a...}.._L.Y.....e.ni..
61c0 1d 94 81 1c 4a 29 cc 19 29 d3 15 6a dc 23 2b f8 fc eb a0 3c 9f bb 4b ac 4c 0f e9 d9 de 79 ce 67 ....J)..)..j.#+....<..K.L....y.g
61e0 72 9c 34 45 bd f4 a4 e4 a1 e2 ed a5 0b b7 ce 57 78 e0 3e 19 81 a9 4d 7f d0 9e d8 33 24 45 5e d7 r.4E...........Wx.>...M....3$E^.
6200 ec f6 60 12 ed 99 d9 70 e4 94 b5 a7 a5 0c 7d 59 1a 30 50 82 b2 ce 1f 94 35 23 50 82 b2 f6 01 3b ..`....p......}Y.0P.....5#P....;
6220 cb 7a f3 5c 59 45 08 0e 99 3e 51 ab aa 7e 4c 7b 52 96 f6 08 ce 97 27 c8 88 4f ed 78 72 9c cc 19 .z.\YE...>Q..~L{R.....'..O.xr...
6240 85 43 04 56 ed 6e cf b2 f6 b6 34 e0 cd e3 f2 a4 ac 79 4f 88 a0 1f e9 a8 af a2 94 be 5a 9f c6 91 .C.V.n....4......yO.........Z...
6260 95 29 cd 64 c6 f9 8e cd eb 2b 3c dc 41 a6 3b bc bf 42 d6 21 d6 16 14 98 31 5c 8e 69 e7 0e 4d 15 .).d.....+<.A.;..B.!....1\.i..M.
6280 89 6b 73 23 fb 27 c9 0d 86 76 dc 28 6b 6f f9 f5 65 69 c0 40 09 ca 3a 7f 50 d6 8c 40 09 ca da 07 .ks#.'...v.(ko..ei.@..:.P..@....
62a0 ec 2c eb bf bd 25 f3 32 bb b6 96 5a 62 48 88 ac df 0b 87 2e 6b ed 11 7f 7f dd 24 f3 2b b5 63 45 .,...%.2...ZbH......k.....$.+.cE
62c0 8a 38 4f 95 f0 56 b3 36 5b 1a f0 93 37 64 80 57 52 2b fd 91 a1 70 48 5e 46 f7 92 fd a9 6d a4 3f .8O..V.6[...7d.WR+...pH^F....m.?
62e0 eb 9d 97 f4 e3 cd eb eb d3 4b b4 05 14 be fd 93 6c bf f7 8a 3e d7 11 0e 91 b5 f1 c9 57 7b 96 ca .........K......l...>.......W{..
6300 6a 50 da b6 51 d6 de f2 eb cb d2 80 81 12 94 75 fe a0 ac 19 81 12 94 b5 0f d8 55 d6 b7 4e 28 54 jP..Q..........u..........U..N(T
6320 a9 24 b5 6b 6d 5f 44 b8 8c 74 84 c3 fb 33 a8 bf db e1 2c 46 38 bc f7 59 e7 66 69 c0 a1 a9 32 d7 .$.km_D..t...3....,F8..Y.fi...2.
6340 d1 f8 ba 7e 89 ce cf e7 4e 88 91 11 a3 da 76 f3 fa d2 5c 0d 87 cc 6d 54 4a 6f da fe 60 a5 f3 6a ...~....N.....v...\...mTJo..`..j
6360 4f ae 4f ec 39 be 4e ce d7 1e 54 60 94 b5 b7 fc fa b2 34 60 a0 04 65 9d 3f 28 6b 46 a0 04 65 ed O.O.9.N...T`......4`..e.?(kF..e.
6380 03 76 95 f5 d9 5d ce ab 07 65 65 2a 14 0d cd 9d ac b5 9a b5 d6 c7 0d 87 f7 9a b5 d9 d2 80 ff 7e .v...]...ee*...................~
63a0 5f 9a ac 6b 56 d1 17 f9 87 43 84 f8 f6 0b fa 76 fb a6 f9 93 b5 b1 66 bd db 4b cd da 5b 7e 7d 59 _..kV....C.....v......f..K..[~}Y
63c0 1a 30 50 82 b2 ce 1f 94 35 23 50 82 b2 f6 01 bb ca fa 7f 47 45 56 da e3 ed 0e ad 14 d9 e5 46 d6 .0P.....5#P........GEV........F.
63e0 70 c8 00 2d ed e9 3a ff 3d 24 4b e4 79 92 b5 d9 d2 80 23 7a 48 df f4 07 2b 65 7d 62 ad af 38 be p..-..:.=$K.y.....#zH...+e}b..8.
6400 85 d4 d8 e1 90 26 f1 72 a5 f3 27 eb 06 35 f5 c7 16 6a 83 e2 b4 e3 46 59 7b cb af 2f 4b 03 06 4a .....&.r..'..5...j....FY{../K..J
6420 50 d6 f9 83 b2 66 04 4a 50 d6 3e 60 57 59 c3 21 cb f6 d5 ae 2a 23 ad c7 f6 96 35 71 93 5a 49 ff P....f.JP.>`WY.!....*#....5q.ZI.
6440 6f f7 76 22 bf 1e ed 65 74 78 7c 0b 39 ae 35 4b ff f4 9e ec 6b dd 50 9a 8a fb 76 96 01 6a ab a7 o.v"...etx|.9.5K....k.P...v..j..
6460 bb bf 96 a7 a5 01 bb b7 53 a8 5c 41 e4 ba 75 be 0c ec 7a f0 7e d9 3e b9 55 96 4f 4c bc 3d 2a fb ........S.\A..u...z.~.>.U.OL.=*.
6480 c1 fb a5 a9 fc c4 7a 99 8b 59 ae b4 ac 35 7c 6a 9b 5c 5f 29 59 4a f0 bb 1d b2 5c 61 a9 48 bd 36 ......z..Y...5|j.\_)YJ....\a.H.6
64a0 3d 34 55 de e3 c3 1d 24 8d d4 36 ba d8 87 75 93 3e f3 76 4d 24 2d 6f f9 f5 65 69 c0 40 09 ca 3a =4U....$..6...u.>.vM$-o..ei.@..:
64c0 7f 50 d6 8c 40 09 ca da 07 ec 2c eb 3b 29 5c fb ac ef c4 a0 ac f3 07 65 cd 08 94 a0 ac 7d 80 b2 .P..@.....,.;)\........e.....}..
64e0 b6 47 50 d6 94 75 7e a1 ac 19 81 12 94 b5 0f 50 d6 81 1f da a2 28 75 ab 2b bc f5 bc f5 f9 b1 2a .GP..u~........P.....(u.+......*
6500 28 eb fc 41 59 33 02 25 28 6b 1f a0 ac 19 76 09 ca 3a 7f 50 d6 8c 40 09 ca da 07 5e 7b ed 35 d4 (..AY3.%(k....v..:.P..@....^{.5.
6520 ac 5a 0c 03 93 a3 18 05 18 03 ba 96 c0 c0 e4 48 cb f3 11 4c d1 29 a6 38 3a b6 6f 66 75 91 b1 2d .Z.............H...L.).8:.ofu..-
6540 d3 a7 4f c7 43 75 c2 2d ff 1e 19 8c 6e ed 4b a0 d6 fd 95 fd fe 9b 0f 2a 59 7f f5 d5 57 58 bf 7e ..O.Cu.-....n.K........*Y...WX.~
6560 3d a3 80 e3 ae bb ee c2 f3 cf 3f 6f 79 3e 82 2d 0e 1c 38 60 75 91 b1 2d 9f 7c f2 89 e5 df 1f 83 =.........?oy>.-..8`u..-.|......
6580 a1 c5 bb ef be eb f7 df 7c 50 c9 9a f8 87 3a 75 ea e0 d4 a9 53 56 67 83 10 42 ee 58 28 6b 62 0a ........|P....:u....SVg..B.X(kb.
65a0 65 4d 08 21 d6 42 59 13 53 28 6b 42 08 b1 16 ca 9a 98 42 59 13 42 88 b5 50 d6 c4 14 ca 9a 10 42 eM.!.BY.S(kB......BY.B..P......B
65c0 ac 85 b2 26 a6 50 d6 84 10 62 2d 94 35 31 85 b2 26 84 10 6b a1 ac 89 29 94 35 21 84 58 0b 65 4d ...&.P...b-.51..&..k...).5!.X.eM
65e0 4c a1 ac 09 21 c4 5a 28 6b 62 0a 65 4d 08 21 d6 42 59 13 53 28 6b 42 08 b1 16 ca 9a 98 42 59 13 L...!.Z(kb.eM.!.BY.S(kB......BY.
6600 42 88 b5 50 d6 c4 14 ca 9a 10 42 ac 85 b2 26 a6 50 d6 84 10 62 2d 94 35 31 85 b2 26 84 10 6b a1 B..P......B...&.P...b-.51..&..k.
6620 ac 89 29 fe 90 f5 c3 0f 3f 8c 37 df 7c 33 cf af cb c8 c8 40 4c 4c 0c 1a 37 6e 5c e0 69 fb 9b c3 ..).....?.7.|3.....@LL..7n\.i...
6640 87 0f 23 2e 2e 0e 21 21 21 48 4d 4d 45 72 72 32 5a b5 6a 85 d9 b3 67 e3 ea d5 ab f9 4a fb dc b9 ..#...!!!HMMErr2Z.j...g.....J...
6660 73 48 48 48 40 44 44 44 01 e5 d6 bf e9 12 42 f2 06 65 4d 4c f1 87 ac ff fc e7 3f e3 dc b9 73 d9 sHHH@DDD......B..eML......?...s.
6680 db 91 91 91 f8 ee bb ef 72 f5 da bd 7b f7 7a 95 b5 6b da 05 49 97 2e 5d b0 76 ed 5a 9f 5f 7f ec ........r...{.z..k..I..].v.Z._..
66a0 d8 31 27 f1 5d b9 72 05 fd fa f5 43 5c 5c 1c ae 5f bf 9e af bc fd f0 c3 0f 7e 91 aa bf d2 25 84 .1'.].r....C\\.._........~....%.
66c0 e4 1e ca 9a 98 52 18 cd e0 05 29 6b 7f 52 d0 b2 06 80 4b 97 2e a1 7c f9 f2 58 ba 74 69 be f2 46 .....R....)k.R....K...|..X.ti..F
66e0 59 13 12 bc 50 d6 c4 14 57 59 7f fc f1 c7 e8 da b5 2b d2 d2 d2 90 90 90 80 15 2b 56 20 23 23 03 Y...P...WY.......+........+V.##.
6700 d5 ab 57 c7 fd f7 df 8f cd 9b 37 03 00 fa f4 e9 83 15 2b 56 00 00 16 2f 5e 8c ca 95 2b e3 95 57 ..W.......7.......+V.../^...+..W
6720 5e c1 ea d5 ab 51 b3 66 4d 3c f5 d4 53 00 80 b4 b4 34 84 86 86 a2 53 a7 4e 48 4d 4d c5 b9 73 e7 ^....Q.fM<..S....4....S.NHMM..s.
6740 90 95 95 85 f9 f3 e7 a3 5b b7 6e e8 df bf 3f 3a 74 e8 80 f4 f4 74 00 ba ac a7 4d 9b 86 fb ee bb ........[.n...?:t....t....M.....
6760 0f 8d 1a 35 c2 d9 b3 67 01 20 47 da c9 c9 c9 88 88 88 c0 82 05 0b d0 aa 55 2b 54 ac 58 11 f3 e7 ...5...g..G.............U+T.X...
6780 cf cf 7e 2f d7 af 5f c7 c8 91 23 11 1d 1d 8d c4 c4 44 4c 9c 38 11 65 ca 94 c1 d8 b1 63 73 7c 0e ..~/.._...#......DL.8.e.....cs|.
67a0 0b 16 2c 40 c5 8a 15 d1 b0 61 43 a4 a6 a6 62 df be 7d 00 80 5d bb 76 21 31 31 11 fd fb f7 47 b7 ..,@.....aC...b..}..].v!11....G.
67c0 6e dd f0 cd 37 df 78 fc 2c dd c9 1a 00 86 0d 1b 86 d8 d8 58 00 70 7a ef 7d fb f6 c5 b0 61 c3 f0 n...7.x.,..........X.pz.}....a..
67e0 eb af bf 66 9f ab 5d 6f e0 c0 81 68 db b6 2d d6 ac 59 03 40 97 ea f2 e5 cb d1 a9 53 27 d4 af 5f ...f..]o...h..-..Y.@.......S'.._
6800 1f 5b b6 6c c9 7e dd c5 8b 17 31 78 f0 60 f4 ed db 17 a9 a9 a9 58 b0 60 41 ae 8e 19 65 9d 91 91 .[.l.~....1x.`.......X.`A...e...
6820 81 1a 35 6a 20 26 26 26 fb 7b 26 84 f8 1f ca 9a 98 e2 2a eb 84 84 04 1c 38 70 00 00 f0 f3 cf 3f ..5j.&&&.{&.......*.....8p.....?
6840 a3 67 cf 9e 00 80 75 eb d6 a1 43 87 0e 00 80 9b 37 6f a2 62 c5 8a e8 da b5 2b 00 e0 da b5 6b 18 .g....u...C.....7o.b.....+....k.
6860 38 70 60 76 1a 93 26 4d ca 16 2a 90 b3 66 bd 66 cd 1a b4 6a d5 0a b7 6e dd 02 00 2c 5d ba 34 5b 8p`v..&M..*..f.f...j...n...,].4[
6880 b2 7b f7 ee 45 64 64 24 3e fa e8 23 00 40 cf 9e 3d 31 69 d2 24 8f 69 37 6f de 1c a9 a9 a9 b8 71 .{..Edd$>..#.@..=1i.$.i7o......q
68a0 e3 06 3e fb ec 33 84 85 85 e1 d2 a5 4b 00 80 85 0b 17 a2 59 b3 66 b8 7e fd 3a b2 b2 b2 90 9c 9c ..>..3......K......Y.f.~.:......
68c0 ec b5 d6 ee 5a b3 3e 7d fa 34 ca 96 2d 8b 7f fe f3 9f 00 80 77 de 79 07 75 eb d6 c5 cd 9b 37 dd ....Z.>}.4..-.......w.y.u.....7.
68e0 be de 93 ac e7 ce 9d 8b bb ee ba 2b fb bd b7 6c d9 32 3b 8d b1 63 c7 62 f8 f0 e1 d9 d7 2b 57 ae ...........+...l.2;..c.b.....+W.
6900 1c 7e fe f9 67 00 c0 a7 9f 7e 8a ce 9d 3b 03 10 a9 16 29 52 04 1b 36 6c c8 3e b7 58 b1 62 38 73 .~..g....~...;....)R..6l.>.X.b8s
6920 e6 0c 00 60 c0 80 01 d9 9f d3 8d 1b 37 d0 b8 71 63 bc f1 c6 1b a6 c7 8c b2 4e 4f 4f c7 b0 61 c3 ...`........7..qc........NOO..a.
6940 b2 bf 17 42 48 e1 40 59 13 53 5c 65 dd a3 47 0f 74 e9 d2 05 9f 7c f2 89 d3 79 17 2e 5c 40 44 44 ...BH.@Y.S\e..G.t....|...y..\@DD
6960 04 2e 5e bc 88 f4 f4 74 8c 1b 37 0e 25 4a 94 c0 d5 ab 57 b1 7f ff 7e ac 5a b5 2a fb 5c 33 59 c7 ..^....t..7.%J....W...~.Z.*.\3Y.
6980 c6 c6 e6 a8 f9 69 35 d6 bd 7b f7 e2 be fb ee cb 3e b6 68 d1 22 3c f2 c8 23 1e d3 6e de bc 39 d6 .....i5..{......>.h."<..#..n..9.
69a0 af 5f 9f bd 5d aa 54 29 fc ed 6f 7f 03 00 b4 68 d1 02 2f bd f4 52 f6 b1 cd 9b 37 e7 49 d6 d3 a6 ._..].T)..o....h../..R....7.I...
69c0 4d 43 97 2e 5d b2 b7 6f de bc 89 f0 f0 70 1c 39 72 c4 ed eb 3d c9 7a ce 9c 39 d9 b2 8e 8d 8d 75 MC..]..o.....p.9r...=.z..9.....u
69e0 ca d3 e1 c3 87 11 11 11 81 5b b7 6e 61 da b4 69 d9 37 40 1a 7f f9 cb 5f 00 88 54 95 52 b8 72 e5 .........[.na..i.7@...._..T.R.r.
6a00 4a f6 b1 66 cd 9a 61 e1 c2 85 b8 76 ed 1a 42 43 43 91 99 99 e9 74 cd 4e 9d 3a 79 3d a6 a5 1b 11 J..f..a....v..BCC....t.N.:y=....
6a20 11 81 cc cc 4c b4 6d db 16 37 6e dc f0 f8 f9 10 42 fc 03 65 4d 4c 71 95 f5 bf fe f5 2f 8c 1e 3d ....L.m..7n.....B..eMLq...../..=
6a40 1a 65 cb 96 45 83 06 0d 70 f0 e0 c1 ec 63 4d 9b 36 c5 b6 6d db 30 65 ca 14 9c 39 73 06 35 6b d6 .e..E...p....cM.6..m.0e...9s.5k.
6a60 c4 de bd 7b 31 6e dc 38 fc f8 e3 8f d9 e7 99 c9 ba 5a b5 6a 78 fd f5 d7 dd e6 c7 b5 cf 7a c5 8a ...{1n.8.........Z.jx........z..
6a80 15 48 4d 4d f5 98 76 f3 e6 cd b1 73 e7 ce ec ed 8a 15 2b e2 e3 8f 3f 06 00 54 ad 5a d5 e9 3a 66 .HMM..v....s......+...?..T.Z..:f
6aa0 fd e1 ae b2 4e 4b 4b 73 6a 31 00 80 0a 15 2a 60 eb d6 ad 6e 5f ef 49 d6 43 87 0e 45 eb d6 ad 01 ....NKKsj1....*`...n_.I.C..E....
6ac0 e4 7c ef 5f 7c f1 05 94 52 b8 70 e1 82 db eb 69 b8 eb 5b 4e 4c 4c c4 d3 4f 3f 8d 33 67 ce 40 29 .|._|...R.p....i..[NLL..O?.3g.@)
6ae0 85 6f bf fd 36 fb d8 ab af be 8a 07 1e 78 c0 eb 31 2d dd d0 d0 50 a4 a6 a6 22 2a 2a 0a 9f 7f fe .o..6........x..1-...P..."**....
6b00 b9 db eb 13 42 fc 07 65 4d 4c 71 95 f5 7f fe f3 1f 00 c0 d5 ab 57 31 7b f6 6c 94 29 53 26 bb 59 ....B..eMLq..........W1{.l.)S&.Y
6b20 74 e6 cc 99 18 3c 78 30 fa f5 eb 07 00 18 37 6e 1c 46 8f 1e 8d 5e bd 7a 39 a5 69 26 eb d6 ad 5b t....<x0......7n.F...^.z9.i&...[
6b40 3b d5 2e 2f 5f be 8c ef bf ff 1e 40 c1 ca 3a 26 26 06 2f be f8 62 f6 b1 bc d6 ac a7 4f 9f 9e a3 ;../_......@..:&&./..b......O...
6b60 66 1d 16 16 96 a7 9a f5 af bf fe 8a f2 e5 cb 63 c9 92 25 6e df fb 47 1f 7d 94 5d b3 76 bd 1e 20 f..............c..%n..G.}.].v...
6b80 32 07 dc d7 ac 9b 36 6d ea b1 66 3d 7b f6 6c 8f 35 6b ed 98 96 6e 58 58 18 ae 5c b9 82 19 33 66 2.....6m..f={.l.5k...nXX..\...3f
6ba0 a0 45 8b 16 6c 06 27 a4 90 a1 ac 89 29 ae b2 6e db b6 2d 7e fb ed 37 00 c0 57 5f 7d 85 72 e5 ca .E..l.'.....)..n..-~..7..W_}.r..
6bc0 21 2b 2b 0b 00 90 99 99 89 d2 a5 4b e3 99 67 9e 01 00 1c 38 70 00 65 ca 94 c1 b4 69 d3 9c d2 74 !++........K..g....8p.e....i...t
6be0 15 6a a5 4a 95 f0 c5 17 5f 60 c7 8e 1d d8 be 7d 3b d6 ac 59 83 98 98 98 ec 7e db e7 9f 7f 1e af .j.J...._`.....};..Y.....~......
6c00 be fa 2a 80 82 95 f5 92 25 4b d0 a4 49 93 ec 3e eb 1e 3d 7a 78 95 75 ef de bd f1 ea ab af e2 dc ..*.....%K..I..>..=zx.u.........
6c20 b9 73 98 3a 75 2a be fc f2 cb 7c f5 59 5f bd 7a 15 83 06 0d 42 ab 56 ad 70 ed da 35 00 c8 f1 de .s.:u*....|.Y_.z....B.V.p..5....
6c40 8d 7d d6 da f5 2e 5c b8 00 40 06 7c 69 37 42 9a ac b5 9b 89 53 a7 4e e5 e8 b3 9e 38 71 22 00 e9 .}....\..@.|i7B.....S.N....8q"..
6c60 97 6e d4 a8 91 53 9f b5 a7 63 c6 1a fb b5 6b d7 50 b7 6e 5d bc fc f2 cb 1e 3f 23 42 48 c1 43 59 .n...S...c....k.P.n].....?#BH.CY
6c80 13 53 5c 65 3d 7b f6 6c c4 c7 c7 a3 7f ff fe 48 48 48 c0 9e 3d 7b b2 8f 65 65 65 a1 52 a5 4a d9 .S\e={.l.......HHH..={..eee.R.J.
6ca0 83 bf ae 5d bb 86 a8 a8 28 1c 3d 7a 34 fb 9c b5 6b d7 a2 76 ed da a8 55 ab 56 b6 58 66 cd 9a 85 ...]....(.=z4...k..v...U.V.Xf...
6cc0 d8 d8 58 24 24 24 64 8f 06 7f ee b9 e7 d0 b5 6b 57 f4 ee dd 1b a3 46 8d c2 cd 9b 37 71 f2 e4 49 ..X$$$d........kW.....F....7q..I
6ce0 c4 c6 c6 a2 6c d9 b2 98 35 6b 16 8e 1d 3b 86 86 0d 1b e2 ee bb ef c6 d2 a5 4b 73 a4 fd ec b3 cf ....l...5k...;...........Ks.....
6d00 a2 5c b9 72 68 d5 aa 15 4e 9d 3a 85 f1 e3 c7 23 22 22 02 1d 3b 76 c4 f9 f3 e7 71 e3 c6 0d 8c 1a .\.rh...N.:....#""..;v....q.....
6d20 35 0a d1 d1 d1 48 4e 4e c6 dc b9 73 d1 a4 49 13 8f 9f c5 de bd 7b f1 d0 43 0f 21 31 31 11 fb f7 5....HNN...s..I......{..C.!11...
6d40 ef 07 20 a3 b3 13 12 12 d0 a7 4f 1f a4 a4 a4 78 1c 0d 9e 9e 9e 8e 76 ed da 21 24 24 04 3d 7b f6 ..........O....x......v..!$$.={.
6d60 44 f7 ee dd d1 ba 75 6b cc 9c 39 33 fb e6 47 fb 0c 9f 7b ee 39 24 27 27 a3 57 af 5e 6e 47 83 c7 D.....uk..93..G...{.9$''.W.^nG..
6d80 c7 c7 a3 5f bf 7e 78 f8 e1 87 71 fe fc 79 fc f8 e3 8f 48 4a 4a 42 44 44 04 e6 cc 99 83 e4 e4 64 ..._.~x...q..y....HJJBDD.......d
6da0 d4 ab 57 2f c7 68 f0 b4 b4 34 f4 ea d5 0b 5d ba 74 c9 31 26 c0 dd b1 5f 7e f9 05 49 49 49 08 09 ..W/.h...4....].t.1&..._~..III..
6dc0 09 c1 c0 81 03 f1 d5 57 5f 21 3a 3a 1a 51 51 51 18 3d 7a b4 e7 1f 0d 21 a4 40 a1 ac 89 29 c1 bc .......W_!::.QQQ.=z....!.@...)..
6de0 dc e8 f5 eb d7 9d 16 23 d9 bc 79 33 92 92 92 2c cc 11 21 84 e4 84 b2 26 a6 04 b3 ac 77 ee dc e9 .......#..y3...,..!....&....w...
6e00 d4 67 dd b7 6f df ec be 63 42 08 09 14 28 6b 62 4a 30 cb 5a 6b 56 ef d3 a7 0f 7a f4 e8 81 27 9f .g..o...cB...(kbJ0.ZkV....z...'.
6e20 7c 32 df cb 7e 12 42 48 41 43 59 13 53 82 59 d6 84 10 62 07 28 6b 62 0a 65 4d 08 21 d6 42 59 13 |2..~.BHACY.S.Y...b.(kb.eM.!.BY.
6e40 53 28 6b 42 08 b1 16 ca 9a 98 42 59 13 42 88 b5 50 d6 c4 89 36 6d da a0 79 f3 e6 4e fb 5c 65 bd S(kB......BY.B..P...6m..y..N.\e.
6e60 69 d3 26 3e 32 91 10 42 0a 11 ca 9a 38 71 f6 ec 59 44 44 44 20 25 25 25 7b 9f 51 d6 6f bf fd 36 i.&>2..B....8q..YDDD.%%%{.Q.o..6
6e80 8a 17 2f 8e 45 8b 16 59 95 45 42 08 b9 e3 a0 ac 49 0e fa f4 e9 83 f0 f0 f0 6c 61 6b b2 7e fb ed ../.E..Y.EB.....I........lak.~..
6ea0 b7 51 aa 54 29 94 28 51 c2 e2 1c 12 42 c8 9d 05 65 4d 72 70 f6 ec 59 44 45 45 65 d7 b0 eb d4 a9 .Q.T).(Q....B...eMrp..YDEEe.....
6ec0 83 25 4b 96 a0 74 e9 d2 28 51 a2 04 6b d5 84 10 52 c8 50 d6 c4 2d 7d fa f4 41 68 68 28 22 22 22 .%K..t..(Q..k...R.P..-}..Ahh("""
6ee0 10 11 11 81 92 25 4b 42 29 c5 5a 35 b9 e3 59 b1 62 05 96 2f 5f ce 08 c0 f8 fb df ff 6e f5 cf c3 .....%KB).Z5..Y.b../_.......n...
6f00 6f 50 d6 c4 2d 5a ed 5a 29 95 1d ac 55 13 02 84 86 86 60 c4 c3 c5 30 b2 17 23 90 a2 fa bd c5 b0 oP..-Z.Z)...U.....`...0..#......
6f20 6d db 36 ab 7f 1e 7e 83 b2 26 1e d1 6a d7 46 59 13 72 a7 13 1a 1a 82 1b 19 0a 70 30 02 29 7a 76 m.6...~..&..j.FY.r........p0.)zv
6f40 2a 45 59 93 3b 13 63 ed 9a b5 6a 42 04 ca 3a 30 83 b2 26 77 34 7d fa f4 41 48 48 08 6b d5 84 dc *EY.;.c...jB..:0..&w4}..AHH.k...
6f60 86 b2 0e cc a0 ac c9 1d cd d9 b3 67 11 1e 1e ce 5a 35 21 b7 a1 ac 03 33 28 eb 20 e2 f8 f1 e3 58 ...........g....Z5!....3(......X
6f80 b8 70 21 23 8f 31 67 ce 1c bc f4 d2 4b 96 e7 c3 6e b1 61 c3 06 ab 7f f2 c4 0f 50 d6 81 19 94 75 .p!#.1g.....K...n.a.......P....u
6fa0 10 31 6f de 3c 34 ab 5f 14 e3 fb 85 31 18 7e 8d 01 5d 8a a2 41 fd 6a 56 ff e4 89 1f a0 ac 03 33 .1o.<4._....1.~..]..A.jV.......3
6fc0 28 eb 20 62 de bc 79 98 3c 38 c4 f2 1f 15 23 f8 e3 d3 37 15 1a d4 ab 6a f5 4f 9e f8 01 ca 3a 30 (..b..y.<8....#...7....j.O....:0
6fe0 83 b2 0e 22 28 6b 46 61 05 65 1d bc 50 d6 81 19 94 75 10 41 59 33 0a 2b 28 eb e0 25 37 b2 be 7a ..."(kFa.e..P....u.AY3.+(..%7..z
7000 44 61 ea 10 85 ce 2d 15 52 e2 14 e2 1a 29 0c 4d 55 c8 58 67 fd 6f d3 2c 6a 56 51 78 61 8c f3 be Da....-.R....).MU.Xg.o.,jVQxa...
7020 5f 3e 50 48 6d a3 10 12 22 ef 25 25 4e a1 59 3d 85 c7 ba 2b 5c 3e 9c f3 f8 d1 d7 cd 3f 9f e4 38 _>PHm...".%%N.Y=...+\>......?..8
7040 59 bf e1 d7 8f 0a 26 df 94 75 10 41 59 33 0a 2b 28 eb e0 c5 4c d6 59 99 0a 89 2d 15 9e 7d 4c df Y.....&..u.AY3.+(...L.Y...-..}L.
7060 77 ed 98 42 9f 04 85 84 18 ff fd e6 22 8b 2b 7c b7 23 7f 69 7c bc 59 a1 6c 29 85 c6 0f b8 3f 1e w..B........".+|.#.i|.Y.l)....?.
7080 11 ae 70 6c ad fe 9e 1a 3f a0 f0 f4 00 f7 c7 cd e2 ea 11 ca 3a 2f 28 ab 33 50 98 50 d6 8c c2 0a ..pl....?...........:/(.3P.P....
70a0 ca 3a 78 31 93 f5 db 2f 28 dc 53 51 e1 e6 71 e7 fd 3f ec 96 9a b6 bf 7e 73 05 21 eb c9 83 15 de .:x1.../(.SQ..q..?.....~s.!.....
70c0 9c 27 12 fd fb bb 39 8f bb ca f8 d9 c7 14 1e bc df f3 71 6f 41 59 e7 0d 65 75 06 0a 13 ca 9a 51 .'....9...........qoAY..eu.....Q
70e0 58 41 59 07 2f 66 b2 7e 34 5e a1 7f 92 fb 63 ff 3b 2a ff 26 c7 89 d8 16 8e 57 88 7d 48 21 3c 4c XAY./f.~4^....c.;*.&.....W.}H!<L
7100 61 ce 48 a9 95 cf 7b 42 a1 5b 5b 85 5e 9d 14 9e ec a3 70 fd f6 b5 2e ec 97 a6 e6 b4 64 49 ff a9 a.H...{B.[[.^.....p.........dI..
7120 fe 0a b7 4e c8 b1 b4 64 85 d0 50 85 4e cd e5 9c 73 7b bc a7 e5 29 52 db c8 bf d1 b5 14 e6 8f ce ...N...d..P.N...s{...)R.........
7140 79 dc 55 c6 93 07 2b 34 a9 eb f9 b8 6b ac 98 ac 50 bf 86 dc b4 ac 9c e2 2c eb ac 4c b9 66 b7 b6 y.U...+4....k...P.......,..L.f..
7160 0a 7d 3b 2b 0c eb e6 2c f2 5d 4b a4 c5 62 60 17 85 b6 8d 15 d6 4c 77 4e 9b b2 0e 22 28 6b 46 61 .};+...,.]K..b`......LwN..."(kFa
7180 05 65 1d bc 98 c9 ba 49 5d 85 89 03 cd 7f 23 cd eb 2b 24 b5 12 81 a7 af 56 78 79 82 c2 ea e9 0a .e.....I].....#..+$.....Vxy.....
71a0 4d eb e9 b5 f2 47 3a ea fd c7 e7 f7 29 ec 5d a6 bf 7e cc a3 0a 9b e6 e8 db ae 35 6b 6f 69 b9 8b M....G:.....).]..~........5koi..
71c0 8f 37 cb 0d 03 1c 0a cf 8f 51 68 54 27 e7 39 46 19 ff fb 7d 85 fb ef 55 78 71 ac fb e3 ae f1 97 .7.......QhT'.9F...}...Uxq......
71e0 4d 0a 51 25 14 7e dc 2b db 4b 9f 76 96 f5 9a e9 0a 2d a3 f5 fc 8e ed ad 30 bc 87 fc 7d 7a 9b 42 M.Q%.~.+.K.v.....-......0...}z.B
7200 b9 d2 0a 3f 1f d4 cb 97 6b 2b 05 65 1d 44 50 d6 8c c2 0a ca 3a 78 c9 8d ac 27 0d 32 ff 8d 34 af ...?....k+.e.DP.....:x...'.2..4.
7220 af b0 76 86 f3 be d8 87 44 94 da f6 1b f3 f4 66 e6 ac 4c 11 63 62 4b a9 01 d7 ad 2e 42 d3 ce 75 ..v.....D......f..L.cbK.....B..u
7240 95 b5 b7 b4 dc c5 94 21 0a df dc 6e fa 3e b3 53 a1 48 11 7d 5b 8b 88 70 85 8e cd a4 a6 9e d8 52 .......!...n.>.S.H.}[..p.......R
7260 61 f1 1f f4 da bd 76 dc 93 ac 9f 49 53 e8 12 ab 6f ff b8 d7 59 d6 b1 0f 29 bc f4 a4 7e fc f0 6a a.....v....IS...o...Y...)...~..j
7280 49 ef d6 09 85 69 43 15 ba b6 76 4e ef 2f 9b 9c b7 29 eb 20 82 b2 66 14 56 50 d6 f6 e2 d8 b1 63 I....iC...vN./...)....f.VP.....c
72a0 b9 3e d7 4c d6 bd bd 34 83 1b a3 79 7d 85 9d 8b 9d f7 55 bb 5b f6 3f 1a 2f d1 25 56 b6 e1 50 58 .>.L...4...y}.....U.[.?./.%V..PX
72c0 35 4d 9a a7 af a4 cb f6 fc d1 32 c2 5c 7b ad ab ac bd a5 e5 2e 9a d5 93 9b 00 2d ca 96 52 78 6e 5M........2.\{............-..Rxn
72e0 94 f3 39 66 cd dc de 8e 0f ea 2a 4d d8 da b6 6b 9f 75 b5 bb 15 5e 7f 56 3f fe c5 db 72 fc c2 7e ..9f......*M...k.u...^.V?...r..~
7300 69 e6 37 be d6 5d 50 d6 41 44 6e 65 6d a7 69 17 9e a6 4c 1c 5a a9 d0 2a 5a a1 68 a8 1c 3f bd 4d i.7..]P.ADnem.i...L.Z..*Z.h..?.M
7320 a1 52 79 d9 d7 2a 5a a1 78 84 42 ed aa f2 77 f3 fa 0a fd 12 15 16 8c 93 bb f5 d0 50 85 ef 77 e5 .Ry..*Z.x.B...w............P..w.
7340 bc d6 27 6f 48 e1 69 19 ad b0 7b a9 dc f9 c6 35 92 6b a7 b6 51 b8 f4 61 de f2 be 62 b2 5c af 42 ..'oH.i...{....5.k..Q..a...b.\.B
7360 39 79 7d 42 8c d4 4a 0e 2c 77 7f 3c b1 a5 42 bb 26 0a 9b e7 7a 7e ff c6 ff 6c ee a9 a8 37 9b b9 9y}B..J.,w.<..B.&...z~...l...7..
7380 8b b4 64 49 bb 56 55 a9 b5 b8 1e 5f fc 07 79 bf 29 71 ee 3f 0f 6f 41 59 db 0b ed 71 b0 b3 67 cf ..dI.VU...._..y.)q.?.oAY...q..g.
73a0 36 3d d7 4c d6 7f 5c a0 70 af 9b 01 66 7f dd a4 f0 78 4f 7d db 9d ac 5b 37 54 58 36 c1 79 df 7f 6=.L..\.p...f....xO}...[7TX6.y..
73c0 fe 2c ff 0e 49 51 18 d5 4b df 3f fb 71 ef b2 f6 96 96 6b 7c bc d9 b9 16 0e 87 6c 3f 54 db 79 5f .,..IQ..K.?.q.....k|......l?T.y_
73e0 7e 64 3d 79 b0 34 fb 6b db ae 35 eb d6 0d 9d 6b d6 1f ad d2 6b d6 d3 87 39 d7 ca e1 10 99 1b b7 ~d=y.4.k..5....k....k...9.......
7400 29 eb 20 22 37 b2 b6 62 da 45 e6 06 85 aa 77 e5 2f 0d 77 85 e4 83 95 0a a5 a3 e4 ef ef 76 28 8c ).."7..b.E....w./.w..........v(.
7420 e8 a1 1f ab 5d 55 46 7d c2 21 42 eb 97 28 7f cf 1f 2d 85 de 5d 9f db f0 1e 72 1d 4d a6 70 c8 35 ....]UF}.!B..(...-..]....r.M.p.5
7440 23 c2 7d cf f7 fc d1 ce 9f eb f6 17 a5 5f eb fc 3e f7 c7 cf ee 52 68 50 53 9a d4 cc de 7f bf 44 #.}.........._..>....RhPS......D
7460 ef b2 86 43 d2 8e 2c ae b0 67 69 ce df c1 43 b5 e5 3f 13 5f 16 c0 a0 ac ed c7 f0 e1 c3 11 19 19 ...C..,..gi...C..?._............
7480 89 b0 b0 30 af d2 ce cd 3c eb 1e ed 15 66 0c d7 b7 af a4 cb a0 28 e3 8d a6 3b 59 af 99 ae d0 be ...0....<....f.......(...;Y.....
74a0 a9 de b4 7c 68 a5 d4 8a e1 90 5a 6e 4c 03 39 96 95 29 e7 19 65 5d a9 bc 08 6c c7 22 29 47 de d2 ...|h.....ZnL.9..)..e]...l.")G..
74c0 72 8d c9 83 15 3e db e2 bc ef e4 56 f9 fd 7f fd 47 ef e5 cc ac 1c 6a f1 f1 66 29 6b 3f ec 96 ed r....>.....V....G.....j..f)k?...
74e0 05 e3 72 f6 59 c7 34 70 df 67 fd e5 76 a9 e9 5f d8 2f db 19 eb a4 29 de 98 3e 65 1d 44 e4 46 d6 ..r.Y.4p.g..v.._./....)..>e.D.F.
7500 56 4c bb 28 0c 59 5f 49 97 3b 7b ed 98 51 d6 d7 8e 29 9c 58 2f 7f cf 1f ad 30 f2 61 29 18 5a 73 VL.(.Y_I.;{..Q...).X/....0.a).Zs
7520 1b 1c 22 bd 41 5d 15 ca 97 f6 af ac 6f 64 48 cd 7e fb 8b ee 8f c3 21 ad 07 45 8a 48 4d df db fb ..".A]......odH.~.....!..E.HM...
7540 3f b9 d5 7c f4 6b 42 8c bc 5f d7 6b ec 5c ac f0 c4 23 94 f5 9d c6 a8 51 a3 50 ba 74 69 84 87 87 ?..|.kB.._.k.\...#.....Q.P.ti...
7560 7b 94 76 6e 64 7d ed 98 f4 01 6b a3 b3 3b 34 73 1e 0c f6 ec 63 32 60 aa 55 b4 c2 fa 59 fa 7e 6d {.vnd}....k..;4s....c2`.U...Y.~m
7580 44 74 97 58 69 4a ef 93 a0 df 70 5e fa 50 5a 79 9a d7 97 a6 f6 2e b1 d2 74 ac f5 7b cf 1a 21 fd Dt.XiJ....p^.PZy........t..{..!.
75a0 be 09 31 fa 68 70 4f 69 19 63 f5 74 85 8a e5 75 31 6a 31 bc 87 b4 58 35 ad a7 f0 d1 6b 0a 3d db ..1.hpOi.c.t...u1j1...X5....k.=.
75c0 cb 76 bb 26 39 fb da 7f f9 c0 f9 b8 27 61 bf 36 55 a1 5e 0d 19 f1 3d 7f b4 94 af 6e 6d e5 bd 65 .v.&9.......'a.6U.^...=....nm..e
75e0 65 ca 0d 49 72 9c 88 d8 dd 68 f0 f8 16 72 13 fe 70 07 fd 86 5e 0b ca 3a 88 c8 8d ac cd a6 5d 5c e..Ir....h...r..p...^..:......]\
7600 fa 50 a1 7a 65 f9 91 6d 9c 2d 03 36 94 92 26 e1 8b 87 a4 5f a5 6f 67 19 0c b1 6a 9a fe da c3 ab .P.ze..m.-.6..&...._.og...j.....
7620 a5 d0 0c 49 91 1f b5 56 40 cf ed 51 68 d3 58 9a a5 b5 69 19 5a a1 cd cb b4 0b 33 59 bb 86 51 d6 ...I...V@..Qh.X...i.Z.....3Y..Q.
7640 ae f2 3c b0 5c a1 72 05 99 5a a1 ed 9f f7 84 bc 07 7f cb fa 7f 47 45 c4 bb 96 78 96 35 1c 32 0a ..<.\.r..Z...........GE...x.5.2.
7660 75 da 50 cf ef 3f b7 ad 20 09 31 52 1b 09 09 51 38 b5 4d df ff 48 47 b9 7b 37 ca da db d4 99 b9 u.P..?....1R...Q8.M..HG.{7......
7680 23 15 ca 94 94 66 ce 9e ed 15 2a 94 55 28 5d aa 04 6e de bc 69 f5 cf 9e e4 91 51 a3 46 a1 4c 99 #....f....*.U(]..n..i.....Q.F.L.
76a0 32 50 4a b9 95 36 97 1b 0d cc a0 ac 83 88 dc c8 3a 37 d3 2e b4 81 11 da 34 87 05 e3 a4 76 dc 3f 2PJ..6..........:7......4....v.?
76c0 49 61 7c 5f d9 f7 5b ba 42 95 4a 7a 3f 77 fa 6a 85 af de 91 bf b3 32 65 e5 1f ad 7f c9 5d cd 3a Ia|_..[.B.Jz?w.j......2e.....].:
76e0 af d3 2e 22 c2 15 1a d6 16 f1 6b 11 5d cb 37 59 7f b0 52 e4 53 af 86 ec bb 91 21 77 bb 70 f8 5f ..."......k.].7Y..R.S.....!w.p._
7700 d6 cb 26 28 dc f5 3b b9 f1 71 77 5c 8b 8e cd a4 a6 e0 e9 fd 57 bb 3b 77 d7 d7 d2 ee d8 4c 6a d2 ..&(..;..qw\........W.;w.....Lj.
7720 70 88 b4 ff d0 4f e1 f3 2d ce b2 36 9b 3a 33 69 90 dc c8 5d d8 2f df 7b d1 d0 10 0c 1b 36 0c 0b p....O..-..6.:3i...]./.{.....6..
7740 16 2c 60 d8 2c 5a b5 6a 85 a8 a8 28 28 a5 9c a4 bd 70 e1 42 ca 3a 40 83 b2 0e 22 72 2b 6b b3 69 .,`.,Z.j...((....p.B.:@..."r+k.i
7760 17 9a ac 8d 83 39 ae 1d 93 e6 5b e3 20 b4 e1 3d e4 3f 74 38 64 60 c7 e8 5e 32 c0 22 b5 8d 0c 6c .....9....[....=.?t8d`..^2."...l
7780 7a e7 25 39 e6 4e d6 79 9d 76 51 90 35 eb 0f 56 2a fc f3 80 a4 79 f0 55 85 ad f3 f5 51 9a fe 90 z.%9.N.y.vQ.5..V*....y.U....Q...
77a0 75 a5 f2 d2 a2 91 da 46 04 6c ac e1 7a 92 75 07 37 b2 f6 b5 66 0d 87 c2 9f 16 4a 5f f9 7f 0f c9 u......F.l..z.u.7...f.....J_....
77c0 f7 f4 cd bb 39 65 6d 36 75 66 d2 20 85 c1 29 f2 f7 a7 6f 2a 94 28 1e 86 0e 1d 3a e0 a9 a7 9e 62 ....9em6uf....)...o*.(....:....b
77e0 d8 2c 62 63 63 51 bc 78 f1 6c 59 17 2b 56 0c e1 e1 e1 98 3a 75 2a 65 1d a0 41 59 07 11 b9 91 75 .,bccQ.x.lY.+V.....:u*e..AY....u
7800 6e a6 5d b8 5b 26 ef cc 4e d9 97 1c a7 4f 95 68 db 58 fe e3 87 43 fa 59 8c 7d 42 09 31 d2 8c 0e n.].[&..N....O.h.X...C.Y.}B.1...
7820 87 7b 59 e7 75 da 45 41 cb 1a 0e e9 a3 4e 8e 93 a6 f8 ab 47 64 9f bf 6b d6 b9 3d 5e e3 1e 19 21 .{Y.u.EA.....N.....Gd..k..=^...!
7840 ea e9 fd 9f d9 99 bb eb 6b 69 df 3a a1 70 5f 65 49 b3 f7 ed 41 38 ae b2 36 9b 3a 33 69 90 34 8d ........ki.:.p_eI...A8..6.:3i.4.
7860 c3 21 b2 2e 5d aa 04 16 2f 5e 6c f5 cf 9e e4 91 59 b3 66 a1 64 c9 92 d9 92 8e 88 88 c0 13 4f 3c .!..].../^l.....Y.f.d.........O<
7880 81 8b 17 2f 02 60 33 78 a0 06 65 1d 44 e4 46 d6 b9 99 76 e1 4e d6 5a cd da 38 a2 f2 46 86 7e 4e .../.`3x..e.D.F...v.N.Z..8..F.~N
78a0 f5 ca 32 78 4d 3b d6 be a9 77 59 e7 65 da 05 1c fe 91 b5 63 a3 f4 1f 4f 19 a2 1f cf 8d ac 6f 1e ..2xM;...wY.e......c...O......o.
78c0 57 78 eb f9 dc 15 30 5f 64 7d f4 75 f9 fc cd 06 98 e5 26 8c 69 2f 18 27 ef f7 bd 57 64 db 55 d6 Wx....0_d}.u......&.i/.'...Wd.U.
78e0 66 53 67 28 6b fb a3 89 da 9d a4 35 28 eb c0 0c ca 3a 88 c8 ed 3c 6b b3 69 17 9e 16 a0 1f 90 a4 fSg(k......5(....:...<k.i.......
7900 30 d3 f0 ba 99 c3 65 ae 30 1c 32 8a 51 6b 5e ff cf 9f 65 24 a8 26 eb d3 db a4 59 5c 7b cd 77 3b 0.....e.0.2.Qk^...e$.&....Y\{.w;
7920 f2 36 ed 02 0e ff c8 1a 0e 19 9d 79 6e 8f be 9d 1b 59 5f 3d a2 af 31 6c 16 79 95 f5 8f 7b 65 4a .6.........yn....Y_=..1l.y...{eJ
7940 d5 04 97 71 05 05 21 eb 5f 3e 90 41 6b da 9c 6b 57 59 9b 4d 9d a1 ac ed cd ac 59 b3 50 a2 44 09 ...q..!._>.Ak..kWY.M......Y.P.D.
7960 8f 92 d6 a0 ac 03 33 28 eb 20 22 b7 b2 36 9b 76 d1 bd 9d 3e e5 c0 b1 51 df 7f f1 90 8c 14 7e a4 ......3(.."..6.v...>...Q......~.
7980 a3 88 75 c2 40 5d b6 27 b7 ca 5a bb 89 2d 45 ea 0f de 2f 03 c8 4e ac d7 e7 76 6b 4d e8 9a 0c 72 ..u.@].'..Z..-E.../..N...vkM...r
79a0 33 ed c2 d3 94 89 8f 56 c9 22 21 61 45 e5 b8 d6 8c 0d 87 a4 57 32 52 9a d5 ff b8 40 df bf 72 8a 3......V."!aE.......W2R....@..r.
79c0 2c b2 1f d7 48 5e 6f bc ce d5 23 92 4e 78 98 d4 fa 3f 58 29 83 e6 da 35 91 6b f7 6c af 47 f7 76 ,...H^o...#.Nx...?X)...5.k.l.G.v
79e0 ba ac 27 0f d6 07 6e b9 86 76 bd 8a e5 e5 75 c6 a9 62 ee 8e 27 c7 c9 f5 36 cc f2 fc fe b5 9b 23 ..'...n..v....u..b..'...6......#
7a00 2d 62 1a 78 ae e5 8f ed ad a7 fd ef f7 9d 8f 39 36 ca f7 af 94 dc bc fd f3 80 f7 a9 33 5b e7 cb -b.x...........96...........3[..
7a20 0d 50 ad aa 0a db 5e 90 9b ae b0 a2 a1 88 8e 8e c6 c1 83 07 ad fe e9 13 13 46 8f 1e 8d d0 d0 50 .P....^..................F.....P
7a40 af 92 d6 a0 ac 03 33 28 eb 20 82 cb 8d 16 7e c4 b7 10 79 59 71 ed ab 47 14 7e 57 26 e7 7c cc c2 ......3(......~...yYq..G.~W&.|..
7a60 08 ce b3 b6 0f d7 af 5f c7 9e 3d 7b 4c 25 ad 41 59 07 66 50 d6 41 04 65 5d b8 b1 77 99 d4 b0 dd ......._..={L%.AY.fP.A.e]..w....
7a80 2d e5 59 18 f1 4c 9a 3c 82 d0 8a 6b 53 d6 c1 8b 15 b2 de 30 4b e1 c8 9a 9c 4b fc 6a 91 12 97 73 -.Y..L.<...kS......0K....K.j...s
7aa0 39 ce fc c6 da 19 0a 35 ab e8 5d 3b be c6 8f 7b 65 2a a8 f1 81 1f fe 08 ca 3a 88 a0 ac 0b 37 2e 9......5..];...{e*.......:....7.
7ac0 1f ce 39 50 af 30 e3 bf 87 ac bb 36 65 1d bc 14 b6 ac df 5d e8 3c 93 c4 dd 38 91 1b 19 05 2f 6b ..9P.0.....6e......].<...8..../k
7ae0 38 9c c7 61 e4 27 96 4d d0 d7 a5 f0 57 50 d6 41 04 65 cd 28 ac a0 ac 83 97 c2 94 75 56 a6 2c ae 8..a.'.M....WP.A.e.(.......uV.,.
7b00 f4 0f 43 57 8e 3b 59 67 65 3a cf 8e 28 a8 28 28 59 df c8 90 f7 a1 ad ed ed 8f a0 ac 83 08 ca 9a ..CW.;Yge:..(.((Y...............
7b20 51 58 41 59 07 2f 85 29 eb a3 af cb a0 45 e3 3e 57 59 7f be c5 59 a8 69 c9 f2 c0 8c 29 b7 9f 1c QXAY./.).....E.>WY...Y.i....)...
7b40 f8 e0 fd d2 25 94 95 29 cd e9 e5 4a cb 6a 7f 47 5f 97 01 9a 71 8d 14 ea 54 93 74 ce ef 93 81 95 ....%..)...J.j.G_...q...T.t.....
7b60 31 0d 64 d9 e4 c7 ba 3b a7 fd e5 76 69 72 1f 90 24 83 62 f7 1b 66 86 5c 3c 24 8b 02 f5 ed 2c 83 1.d....;...vir..$.b..f.\<$....,.
7b80 4c 5d d7 ef ee d9 de 79 09 e3 82 0e ca 3a 88 a0 ac 19 85 15 94 75 f0 52 98 b2 5e 3e 29 e7 03 84 L].....y.....:.......u.R..^>)...
7ba0 8e ad 95 f5 00 b4 a5 75 9b d4 cd 59 fb ad 71 8f 2c 6a 04 87 cc b2 a8 55 55 9f 7a 3a 71 a0 fe 0c .......u...Y..q.,j.....UU.z:q...
7bc0 02 38 64 7d 01 6d ba 66 72 9c c2 b8 db 4b 26 ff f7 90 cc 76 d0 d2 be 76 4c d2 d5 96 dc fd c7 3e .8d}.m.fr....K&....v...vL......>
7be0 99 1a aa ad e4 38 20 c9 f9 69 78 dd db 39 4f a7 9c 34 c8 f9 c9 7f 05 1d 94 75 10 41 59 33 0a 2b .....8...ix..9O..4.......u.AY3.+
7c00 28 eb e0 a5 30 65 3d 63 b8 4c 05 35 ee 33 ab 59 c3 21 52 35 3e f6 75 e2 40 7d 7d ff cf b7 c8 d4 (...0e=c.L.5.3.Y.!R5>.u.@}}.....
7c20 4d 6d aa 64 4a 9c d4 ba af 1e 91 9b 80 cc 0d fa eb 8c 35 eb 83 af ca eb 8c 03 46 3b 34 93 87 fc Mm.dJ.............5.......F;4...
7c40 68 8b 42 19 a7 b2 7e fb 27 a9 b9 6b db 73 47 ca 74 57 7f 7d 56 94 75 10 41 59 33 0a 2b 28 eb e0 h.B...~.'..k.sG.tW.}V.u.AY3.+(..
7c60 a5 30 65 fd ec 63 39 9f db ec 2a eb ff 1d cd 39 3d b1 c6 3d ce b5 da 17 c6 48 0d 5c db 8e ae 25 .0e..c9...*....9=..=.....H.\...%
7c80 35 ed cf b7 c8 5a 08 70 48 0d 59 29 91 ac 76 9e b1 cf 7a dd 4c e9 77 36 5e a7 57 27 79 c4 ac b6 5....Z.pH.Y)..v...z.L.w6^.W'y...
7ca0 dc b2 f1 b5 ae 31 ef 09 b9 31 f0 d7 67 45 59 07 11 94 35 a3 b0 82 b2 0e 5e 0a 53 d6 2f 4f 90 be .....1...1..gEY...5.....^.S./O..
7cc0 61 e3 3e 4f eb f1 9f dc aa ff ed 5a b3 9e 60 a8 59 c3 21 4d df 9d 5b 8a 8c ff f6 96 ec d3 6a d6 a.>O.......Z..`.Y.!M..[.......j.
7ce0 da b3 ed e1 70 ae 59 bf bf 42 1e 76 63 ac 59 b7 6f ea 5c b3 36 d6 ca 7f 7a cf 79 b1 a1 67 d2 24 ....p.Y..B.vc.Y.o.\.6...z.y..g.$
7d00 3d 7f 7d 56 94 75 10 31 6f de 3c 74 68 56 04 8b c6 2b 06 c3 af f1 f4 00 ca 3a 58 29 4c 59 1f 5a =.}V.u.1o.<thV...+.......:X)LY.Z
7d20 29 4f 77 cb 8d ac 8d 4b e7 d6 b8 47 61 58 37 f9 fb f2 61 99 2f ad f5 59 c3 21 fd cd e1 61 39 6f )Ow....K...GaX7...a./..Y.!...a9o
7d40 04 ba b5 d5 9f 24 f7 df 43 0a f7 54 d4 65 7d 3d c3 f9 26 e0 c7 bd 39 fb ac 8d 8f 17 4e 6a e5 7c .....$..C..T.e}=..&...9.....Nj.|
7d60 03 d1 3b 3e e7 f3 0e 28 eb dc 73 47 c9 fa e0 c1 83 18 3f 6e 14 23 8f 51 f9 ee df 63 70 5a 3f cb ..;>...(..sG......?n.#.Q...cpZ?.
7d80 f3 61 b7 58 f0 d2 8b 56 ff e4 89 1f 28 4c 59 df 3c 2e cf 77 ff d7 ed a5 86 3d 2d f1 db b3 bd 42 .a.X...V....(LY.<..w.....=-....B
7da0 cb 68 67 59 bf 30 46 a1 6b 6b 19 0d 3e 69 50 ce c5 89 3a 35 57 58 fc 07 e7 7d 3f bd 27 ab 0e b6 .hgY.0F.kk..>iP...:5WX...}?.'...
7dc0 6e 28 4b 1f f7 ed 2c 83 d3 56 4f 97 e3 a7 b7 49 0d bd 4f 82 dc 1c 68 0f bd 81 43 5f 6e b9 57 27 n(K...,..VO....I..O...h...C_n.W'
7de0 91 be 71 e4 f7 ad 13 32 58 ed 87 dd 94 b5 af dc 51 b2 26 be 51 a7 4e 1d 9c 3a 75 ca ea 6c 10 12 ..q....2X.......Q.&.Q.N..:u..l..
7e00 10 14 f6 a2 28 1b 66 e5 7c 70 8d 59 b8 f6 59 bb 8b c1 29 22 e7 c2 78 0f eb 66 3a d7 ba 29 eb bc ....(.f.|p.Y..Y...)"..x..f:..)..
7e20 43 59 13 53 28 6b 42 74 ac 58 6e 74 d1 f8 bc 3d 55 ce 93 ac 2f 1e 92 a7 e6 fd fa 91 fe dc 76 7f CY.S(kBt.Xnt...=U.../.........v.
7e40 c7 3f f6 49 b7 d0 b5 63 94 75 7e a0 ac 89 29 94 35 21 3a 81 fe 20 0f 6d 51 94 b8 46 0a 5f bc ed .?.I...c.u~...).5!:....mQ..F._..
7e60 7c ec a7 f7 14 aa 57 96 a6 f4 8c 75 d6 e7 95 b2 ce 3d 94 35 31 85 b2 26 44 27 d0 65 7d a7 06 65 |.....W....u.....=.51..&D'.e}..e
7e80 4d ee 78 28 6b 42 74 42 43 43 30 77 a4 c2 73 a3 18 81 14 f5 6b 46 50 d6 e4 ce 86 b2 26 44 67 da M.x(kBtBCC0w..s.....kFP.....&Dg.
7ea0 b4 a9 98 3c 79 62 50 44 c5 0a bf c3 88 e1 c3 2c cf 47 c1 c4 24 9c 3c 79 d2 ea 9f 87 df a0 ac 89 ...<ybPD.......,.G..$.<y........
7ec0 29 94 35 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c ).5!....}...),...',....&..@....l
7ee0 db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 .......MHp..m.(kb..4!....}...),.
7f00 84 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 ..',....&..@....l.......MHp..m.(
7f20 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c kb..4!....}...),...',....&..@...
7f40 b0 6c db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d 1f 28 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 .l.......MHp..m.(kb..4!....}...)
7f60 2c d0 84 04 27 2c db f6 81 b2 26 a6 b0 40 13 12 9c b0 6c db 07 ca 9a 98 c2 02 4d 48 70 c2 b2 6d ,...',....&..@....l.......MHp..m
7f80 1f 28 6b 62 0a 0b 34 21 c1 09 cb b6 7d a0 ac 89 29 2c d0 84 04 27 2c db f6 81 b2 26 4e b4 6e dd .(kb..4!....}...),...',....&N.n.
7fa0 1a 8f 3f fe b8 d3 3e d7 02 fd cd 37 df 20 2a 2a aa b0 b3 46 08 29 60 28 6b fb 40 59 13 27 3e fb ..?...>....7..**...F.)`(k.@Y.'>.
7fc0 ec 33 14 2f 5e 1c 93 27 4f ce de 67 2c d0 27 4f 9e 44 b1 62 c5 30 69 d2 24 ab b2 48 08 29 20 28 .3./^..'O..g,.'O.D.b.0i.$..H.).(
7fe0 6b fb 40 59 93 1c 74 e8 d0 01 51 51 51 d9 c2 d6 0a f4 c9 93 27 51 a6 4c 19 28 c5 9f 0d 21 c1 00 k.@Y..t...QQQ.......'Q.L.(...!..
8000 65 6d 1f f8 bf 2e c9 c1 67 9f 7d 86 92 25 4b a2 7c f9 f2 98 3c 79 32 ea d4 a9 83 1d 3b 76 a0 6c em......g.}..%K.|...<y2.....;v.l
8020 d9 b2 08 0d 0d 65 ad 9a 90 20 81 b2 b6 0f 94 35 71 4b 87 0e 1d a0 94 42 f9 f2 e5 51 aa 54 29 94 .....e.........5qK.....B...Q.T).
8040 2a 55 0a 4a 29 d6 aa 09 09 22 28 6b fb 7e 93 a9 ef 00 00 0d 1f 49 44 41 54 c0 ff 79 89 5b b4 da *U.J)...."(k.~.......IDAT..y.[..
8060 b5 52 0a 91 91 91 50 4a 21 34 34 14 13 27 4e b4 3a 6b 84 90 02 82 b2 b6 0f 94 35 f1 88 56 bb 36 .R....PJ!44..'N.:k........5..V.6
8080 06 21 24 78 a0 ac ed 03 ff f7 25 1e 31 d6 ae d9 57 4d 48 f0 41 59 db 07 ca 9a 78 c5 58 bb 26 84 .!$x......%.1...WMH.AY....x.X.&.
80a0 04 17 94 b5 7d e0 ff c0 c4 2b 9f 7d f6 19 c2 c3 c3 59 ab 26 24 08 a1 ac ed c3 1d 2f eb cb 97 2f ....}....+.}.....Y.&$....../.../
80c0 63 fb f6 ed 0c 2f 31 75 ea 54 6c dc b8 d1 f2 7c 04 72 9c 3e 7d da ea 9f 32 21 79 86 b2 b6 0f 77 c..../1u.Tl....|.r.>}...2!y....w
80e0 bc ac bf fe fa 6b 44 96 08 43 f7 8e a5 18 0c 9f a2 f6 7d 11 98 37 6f 9e d5 3f 65 42 f2 0c 65 6d .....kD..C........}..7o..?eB..em
8100 1f 28 eb af bf 46 8d aa 51 80 43 31 18 3e c5 94 21 45 28 6b 62 4b 28 6b fb a0 ac ce 80 d5 50 d6 .(...F..Q.C1.>..!E(kbK(k......P.
8120 8c fc 06 65 4d ec 0a 65 6d 1f 94 d5 19 b0 1a ca 9a 91 df a0 ac 89 5d a1 ac ed 83 b2 3a 03 56 43 ...eM..em.............].....:.VC
8140 59 33 f2 1b 94 35 b1 2b 94 b5 7d 50 56 67 c0 6a 28 6b 46 7e 83 b2 26 76 85 b2 b6 0f ca ea 0c 58 Y3...5.+..}PVg.j(kF~..&v.......X
8160 0d 65 cd c8 6f 50 d6 c4 ae 50 d6 f6 41 59 9d 01 ab a1 ac 19 f9 0d ca 9a d8 15 ca da 3e 28 ab 33 .e..oP...P..AY..............>(.3
8180 60 35 94 35 23 bf 41 59 13 bb 42 59 db 07 65 75 06 ac 26 37 b2 1e d5 4b a1 42 39 85 ba d5 15 5e `5.5#.AY..BY..eu..&7...K.B9....^
81a0 9b 5a 78 12 58 30 4e a1 ea 5d 0a f3 47 cb 76 5a b2 42 64 71 85 63 6b dd 9f ef d8 a8 f0 50 6d eb .Zx.X0N..]..G.vZ.Bdq.ck......Pm.
81c0 e5 15 08 71 6e 8f 42 42 8c 42 44 38 65 4d 88 27 28 6b fb 40 59 e7 b2 66 9d 10 a3 4b 33 3f d1 25 ...qn.BB.BD8eM.'(k.@Y..f...K3?.%
81e0 56 61 ed 8c dc 9f 3f 34 d5 f9 ba 35 ee f1 2c eb 4b 1f 2a bc bb d0 7a 51 06 4a fc b0 9b b2 26 c4 Va....?4...5..,.K.*...zQ.J....&.
8200 1b 94 b5 7d 50 56 67 c0 6a 82 49 d6 0c e7 a0 ac 09 f1 0e 65 6d 1f 94 d5 19 b0 1a 5f 64 7d 60 b9 ...}PVg.j.I........em......_d}`.
8220 c2 5d bf 53 68 fc 80 c2 b4 a1 0a d5 ee 56 68 54 47 e1 ec 2e fd fc 09 03 15 1e 8d 57 e8 db 59 21 .].Sh........VhTG..........W..Y!
8240 39 4e e1 1f fb a4 59 bb 62 79 85 86 b5 15 52 db 28 ec 7b 59 e1 c2 7e f9 3b 2d 59 a1 7f 92 c2 53 9N....Y.by....R.(.{Y..~.;-Y....S
8260 fd 15 6e 9d c8 bb ac 2f 1f 96 eb 28 a5 f0 eb 47 b9 cb a3 31 b4 26 f6 29 43 14 3a b7 54 78 f0 7e ..n..../...(...G...1.&.)C.:.Tx.~
8280 85 67 d2 14 b2 32 a5 c6 5e bd b2 a4 bd 71 b6 1c 53 4a e1 f0 6a 85 8b 87 14 06 a7 c8 fb 4c 6d 23 .g...2..^....q..SJ..j........Lm#
82a0 ef 11 0e e7 66 e8 b9 23 15 3a 36 53 a8 5f 43 61 cb 73 fa 35 2f 1e 52 18 d8 45 5e db b5 b5 c2 aa ....f..#.:6S._Ca.s.5/.R..E^.....
82c0 69 39 3f df 19 c3 15 ee ad a8 10 1a 9a b7 3c bb 93 f5 ff 4d 56 e8 d6 56 f2 db a3 bd c2 89 f5 fa i9?...........<....MV..V........
82e0 b1 ac 4c f9 9c bb b5 95 ef a1 43 33 85 f4 d5 de f3 49 59 13 bb 43 59 db 07 ca da c7 9a f5 de 65 ..L.......C3.....IY..CY........e
8300 22 8a 43 2b 65 bb 67 7b 85 49 83 e4 ef 63 6b 15 5a 45 eb e7 3e d5 5f fa 93 e1 c8 59 b3 3e bf 4f ".C+e.g{.I...ck.ZE..>._....Y.>.O
8320 d2 d2 b6 c7 3c aa b0 69 4e de 65 0d 87 c2 d5 23 ba ac cd f2 e8 2e 6a dc a3 30 a8 ab fc 7d 25 5d ....<..iN.e....#......j..0...}%]
8340 a1 56 55 85 cd 73 9d d3 9e 33 52 b6 17 8c 53 c8 dc a0 30 20 49 4f f3 46 86 08 f6 8d 79 ba 2c 95 .VU..s...3R...S...0.IO.F....y.,.
8360 d2 df ef e9 6d 0a c5 22 14 ce ec 94 ed fe 49 0a e3 fb ca df bf a5 2b 54 a9 a4 90 b1 ce 39 ef 7b ....m.."......I.......+T.....9.{
8380 97 89 48 fb 24 e4 3d cf ae b2 de 3c 57 e1 da 31 f9 fb e7 83 72 ae 76 6c cd 74 f9 ce b4 1b a5 a5 ..H.$.=....<W..1....r.vl.t......
83a0 4f eb 9f bb b7 7c 52 d6 c4 ce 50 d6 f6 81 b2 ce 87 ac ef ab ac 6f 2f 1a af f0 48 47 f9 fb d3 37 O....|R...P..........o/...HG...7
83c0 15 a2 4a 28 ac 9e ae 8b 53 0b 57 59 67 65 2a bc 38 56 21 b1 a5 d4 4c eb 56 57 18 db bb e0 64 ed ..J(....S.WYge*.8V!...L.VW....d.
83e0 29 8f 9e c4 b7 67 a9 be 3d 71 a0 d4 d6 8d 69 7f b7 43 3f 7e ed 98 d4 78 33 37 e8 fb e6 8c 54 e8 )....g..=q....i..C?~...x37....T.
8400 d4 dc 59 d6 57 d2 f5 e3 cd ea 29 2c 1c af bf d6 28 bd e1 3d e4 66 45 cb 7b d5 bb bc 7f 27 66 79 ..Y.W.....),....(..=.fE.{....'fy
8420 76 95 f5 df de 52 e8 d5 49 6a c7 a9 6d 14 42 42 14 fe f3 67 39 16 fb 90 de 2a 00 87 d4 a6 bf 79 v....R..Ij..m.BB...g9....*.....y
8440 d7 3c 9f 94 35 b1 33 94 b5 7d a0 ac f3 21 eb c6 0f e8 db 2b 26 8b 00 b4 ed 77 17 2a c4 34 90 da .<..5.3..}...!.....+&....w.*.4..
8460 e1 13 8f 48 8d cc 9d ac 57 4d 53 88 ae a5 0b 6d fe 68 11 74 41 c9 da 5b 1e dd 89 cf 98 f6 0b 63 ...H....WMS....m.h.tA..[.......c
8480 14 9a d4 75 9f 36 1c 52 43 56 4a e1 db 3f e9 fb 5e 7d 46 e1 81 fb dc cb 12 0e b9 29 79 7a 80 fe ...u.6.RCVJ..?..^}F........)yz..
84a0 da e4 38 e9 2e 78 34 5e a1 6d 63 85 d1 bd dc e7 dd 97 3c 1b af 7f eb 84 d4 88 b5 5a 37 1c 72 ec ..8..x4^.mc.......<........Z7.r.
84c0 87 dd f2 77 b5 bb 15 5e 7f 36 67 fa 66 f9 cc ab ac bf ff fe 7b 3f ff a2 09 c9 3d 94 b5 7d a0 ac ...w...^.6g.f.......{?....=..}..
84e0 fd 20 eb df d2 45 6e 70 28 7c be 45 9a 5b 17 8d 77 2f eb 21 29 32 35 4c db 9e fd b8 b5 b2 36 d6 .....Enp(|.E.[..w/.!)25L......6.
8500 52 27 b8 a9 59 1b 65 ed ae 66 3d fb 71 ef 35 eb a6 2e 35 eb cf b6 e8 c7 6e 64 78 ce bb 2f 79 36 R'..Y.e..f=.q.5...5.....ndx../y6
8520 ca fa ec 2e c9 cb cf 07 65 3b 2b 53 a1 68 a8 2e eb d6 0d 15 5e 7a 52 4f e7 f2 61 85 ef 77 99 e7 ........e;+S.h......^zRO..a..w..
8540 33 b7 b2 3e 73 e6 0c fa f6 ed 8b 88 88 08 9c 3f 7f be 90 7e dd 84 78 87 b2 b6 0f 94 b5 1f 64 fd 3..>s..........?...~..x.......d.
8560 f6 0b ce ff f1 f7 ed ac b0 6c 82 fc dd 3b 5e 6a 9f e7 f6 28 4c 1d a2 f0 dc 28 a9 81 df 3a 21 02 .........l...;^j...(L....(...:!.
8580 69 df d4 5a 59 0f eb a6 cb aa 66 95 9c 7d d6 ae cd fa 03 92 a4 e9 59 93 58 a3 3a ce 7d d6 45 8a i..ZY.....f..}........Y.X.:.}.E.
85a0 28 6c 98 25 db a7 b6 39 f7 59 0f 48 52 98 39 5c 4f 6b e6 70 c9 63 5e 65 ed 29 cf 46 59 ff ef a8 (l.%...9.Y.HR.9\Ok.p.c^e.).FY...
85c0 42 c9 48 7d 7c c0 a1 95 f2 7e 34 59 af 99 2e df c3 cd e3 b2 fd fc 18 f9 9e cc f2 69 26 6b 4d d2 B.H}|....~4Y...............i&kM.
85e0 a5 4b 97 46 58 58 18 be fd f6 db 42 fe 85 13 e2 19 ca da 3e 50 d6 b9 90 f5 d8 de 32 8a bb 7e 0d .K.FXX.....B.......>P......2..~.
8600 e9 87 3e b9 55 fa 38 cb 96 52 98 35 42 e4 d9 b0 b6 c2 dd bf 97 81 49 7f 7b 4b e4 de 27 41 fa 88 ..>.U.8..R.5B.........I.{K..'A..
8620 07 76 d1 6b da 7b 97 c9 c2 25 89 2d 15 f6 2f 97 91 d6 29 71 0a cd eb 8b c8 bb c4 4a 93 ec da 19 .v.k.{...%.-../...)q.......J....
8640 0a 8b ff 20 7f d7 af a1 b0 ed 05 91 52 64 71 85 76 4d 44 7c c6 3c 5e 49 57 e8 de 4e 04 d4 ad ad ............Rdq.vMD|.<^IW..N....
8660 42 e6 46 ef 79 f4 24 be 17 c6 48 9f ee 83 f7 cb c0 31 6d 64 b5 31 6d 6d b0 1c 1c d2 b7 9b 96 2c B.F.y.$...H......1md.1mm.......,
8680 7d c1 5d 62 9d fb 7d 35 59 2e 9f a4 10 df 42 a1 9e 9b d1 e0 69 c9 f2 19 3d 1a 2f b5 e2 5b 27 9c }.]b..}5Y.....B.....i...=./..['.
86a0 3f df 9e ed f5 cf 2e 2f 79 fe 71 af 42 52 2b e9 97 ee d5 49 ce dd f6 82 42 ed aa 92 e6 d8 de 0a ?....../y.q.BR+....I....B.......
86c0 61 45 e5 9c 2b e9 f2 9a e7 46 49 3a bd e3 a5 b5 43 13 b7 a7 7c 7a 93 b5 51 d2 c5 8a 15 43 44 44 aE..+....FI:....C...|z..Q....CDD
86e0 04 45 4d 02 0e ca da 3e 50 d6 5c 6e d4 49 7c 05 39 87 bb 30 e6 39 07 c2 bc 73 a3 ac 5d 25 ad 94 .EM....>P.\n.I|.9..0.9...s..]%..
8700 a2 a8 49 c0 42 59 db 07 65 75 06 ac 86 b2 f6 9f f8 ee 24 59 cf 99 33 07 dd bb 77 77 92 b4 52 0a ..I.BY..eu........$Y..3...ww..R.
8720 45 8b 16 c5 a2 45 8b b0 69 d3 26 06 23 e0 a2 4a 95 2a 94 b5 4d 50 56 67 c0 6a 28 6b 09 6d 81 91 E....E..i.&.#..J.*..MPVg.j(k.m..
8740 b8 46 0a 5f bc 9d ff f4 b4 45 51 42 42 64 01 12 3b e4 d9 d7 98 32 a4 08 66 ce 9c 89 62 c5 8a a1 .F._.....EQBBd..;....2..f...b...
8760 68 d1 a2 d9 a2 56 4a a1 5c b9 72 e8 d7 af 1f 83 11 90 31 7b f6 6c 5c bf 7e dd ea ff 86 49 2e 50 h....VJ.\.r.......1{.l\.~....I.P
8780 56 67 c0 6a 28 6b 46 7e c3 d8 0c be 68 d1 22 44 46 46 22 2c 2c 0c 4a 29 84 85 85 a1 5a b5 6a 16 Vg.j(kF~....h."DFF",,.J)....Z.j.
87a0 ff ca 09 21 76 47 59 9d 01 ab a1 ac 19 f9 0d 77 03 cc 8c d2 2e 5a b4 28 85 4d 08 c9 17 ca ea 0c ...!vGY........w.....Z.(.M......
87c0 58 0d 65 cd c8 6f 78 9b ba a5 49 3b 3c 3c 1c f7 de 7b 6f 21 ff ba 09 21 c1 82 b2 3a 03 56 43 59 X.e..ox...I;<<...{o!...!...:.VCY
87e0 33 f2 1b b9 59 14 65 d1 a2 45 28 51 a2 04 4a 97 2e 5d 48 bf 6c 42 48 30 a1 ac ce 80 d5 50 d6 8c 3...Y.e..E(Q..J..]H.lBH0.....P..
8800 fc 46 5e 96 1b 5d b6 6c 19 ce 9e 3d eb e7 5f 35 21 24 d8 50 56 67 c0 6a 02 49 d6 9f bc 21 0b 9e .F^..].l...=.._5!$.PVg.j.I...!..
8820 74 6b 2b 8b 88 58 9d 1f 77 61 7c f4 65 41 a7 7d 23 43 1e c5 69 5c 6b dc 0e c1 07 79 10 42 fc 8d tk+..X..wa|.eA.}#C..i\k....y.B..
8840 b2 3a 03 56 13 48 b2 7e b8 83 fe 30 09 6d 89 ce 40 0c 7f ce 9f de 3a 5f 7f 8c a5 5d 82 b2 26 84 .:.V.H.~...0.m..@.....:_...]..&.
8860 f8 1b 65 75 06 ac 26 90 64 dd e2 41 85 9d 8b ad cf 87 59 14 c6 62 27 76 0a ca 9a 10 e2 6f 94 d5 ..eu..&.d..A......Y..b'v.....o..
8880 19 b0 9a 40 91 f5 b8 be b2 16 76 8b 07 e5 61 1b d7 33 64 4d ea c1 29 f2 20 90 d4 36 fa ba db 97 ...@......v...a..3dM..)....6....
88a0 3e 94 e6 62 a5 14 36 ce 96 35 b1 95 52 38 bc da 39 cd 05 e3 e4 99 d0 43 52 e4 49 54 cd ea 49 13 >..b..6..5..R8..9......CR.IT..I.
88c0 fb 2f 1f c8 f1 0b fb 25 dd b4 64 85 fe 49 0a 4f f5 77 5e f3 7a d7 12 59 c3 7c 60 17 79 2c e4 9a ./.....%..d..I.O.w^.z..Y.|`.y,..
88e0 e9 39 65 9d b1 4e 56 11 8b 69 20 0f d0 30 4b f3 e8 eb f2 b0 8f 36 8d 15 1e ef 29 0f eb 68 f1 a0 .9e..NV..i...0K......6....)..h..
8900 ec d7 3e 83 9d 8b 9d df e3 fa 59 b2 ae f8 bd 15 65 3d 75 2d ad f3 fb e4 09 5f 31 0d 64 e1 95 7e ..>.......Y.....e=u-....._1.d..~
8920 89 0a f7 df ab f0 da 54 ca 9a 10 12 5c 50 d6 01 22 6b 38 e4 61 1e c6 9a f5 80 24 79 30 05 1c d2 .......T....\P.."k8.a.....$y0...
8940 9f db f8 01 fd 89 56 da 53 b0 e6 8c d4 c5 6c 7c 54 a5 16 43 53 e5 f9 d2 da 63 2a fb 27 29 3c d6 ......V.S.....l|T..CS....c*.')<.
8960 5d 97 9d f6 14 2a 38 14 c6 3c aa b0 69 8e fc 7d 7a 9b 42 b9 d2 fa 23 25 3f 7d 53 a1 73 cb 9c b2 ]....*8..<..i..}z.B...#%?}S.s...
8980 4e 5f 2d 0f 18 d1 84 ec 2d cd df d2 e5 81 28 ef 2e 94 ed cc 0d f2 54 2e e3 7b 36 7e 06 da 7b d4 N_-.....-.....(.......T..{6~..{.
89a0 9e 60 f6 f2 04 39 ae 9d 9b 1c 27 82 87 43 e1 bf 87 14 ee a9 28 37 07 85 fd bd 51 d6 84 10 7f 43 .`...9....'..C......(7....Q....C
89c0 59 07 a8 ac dd 3d 2b 7a ce 48 fd 59 d1 9a c8 be db e1 3d cd a1 a9 fa 23 2c e1 90 67 3f 97 8c 94 Y....=+z.H.Y......=....#,..g?...
89e0 bf b3 32 15 5e 1c 2b b5 e7 d4 36 0a 75 ab cb d3 a8 e0 50 98 36 54 9e 40 65 4c eb 2f 9b 9c 65 9d ..2.^.+...6.u.....P.6T.@eL./..e.
8a00 b9 41 6a dc 37 32 f4 73 bc a5 b9 ef 65 85 a8 12 fa 93 bc e0 90 47 5a 9a c9 fa fb 5d b2 fd d7 4d .Aj.72.s....e........GZ....]...M
8a20 0a bf 2f ab 1f 2b 52 c4 f9 f3 79 ac 3b 65 4d 08 09 4e 28 eb 00 95 f5 99 9d 22 2a e3 c8 e8 57 9f ../..+R...y.;eM..N(......"*...W.
8a40 91 5a b2 51 64 ae cf 97 76 27 6b e3 f3 b0 8f af 93 d7 5d 3e ac b0 6a 9a 42 74 2d bd d6 3d 7f b4 .Z.Qd...v'k.......]>..j.Bt-..=..
8a60 fe 2c ed b4 64 69 fe 76 97 e6 0f bb e5 46 22 b5 8d c8 f7 f3 2d fa 31 6f 69 ae 9d a1 50 a5 92 e7 .,..di.v.....F".....-.1oi...P...
8a80 f7 ec 49 d6 da 7b 3c b5 4d a1 74 94 fc fd dd 8e 9c 9f cf a4 41 94 35 21 24 38 a1 ac 03 54 d6 ee ..I..{<.M.t.........A.5!$8...T..
8aa0 6a d6 b3 1f cf 59 b3 ce 8d ac 8d 35 eb dd 86 9a f5 90 14 79 6e b3 31 7d 4d ac d3 87 c9 f3 a9 8d j....Y.....5.......yn.1}M.......
8ac0 69 69 0f cb f8 61 b7 3c 0b fa 4a ba c2 8c e1 d2 e7 ac 35 83 7b 4b f3 bd 57 7c ab 59 bb 93 b5 56 ii...a.<..J.......5.{K..W|.Y...V
8ae0 b3 3e b1 5e 7f 2d 6b d6 84 90 60 85 b2 0e 50 59 c3 21 7d d6 9a 68 6f 64 c8 c0 2c d7 3e eb dc c8 .>.^.-k...`...PY.!}..hod..,.>...
8b00 ba 41 4d e9 2f 86 43 06 ab 69 7d d6 cf 8d 92 c1 59 b7 4e 88 40 db 37 d5 c5 fa e5 76 19 ec 75 61 .AM./.C..i}.....Y.N.@.7....v..ua
8b20 bf 6c 67 ac 53 e8 d5 49 97 b5 d6 67 7d ed 98 34 75 bf 3c c1 3c cd ab 47 14 ee fa 9d c2 3b 2f c9 .lg.S..I...g}..4u.<.<..G.....;/.
8b40 76 e6 06 85 f0 30 df 64 0d 87 0c 96 d3 9a d8 ff 7b 48 a1 da dd 94 35 21 24 38 a1 ac 03 44 d6 4f v....0.d........{H....5!$8...D.O
8b60 0f 90 01 5d ad a2 f5 51 df 17 0f 49 73 74 af 4e 52 cb d5 f6 c3 a1 d0 bd 9d 88 ac 5b 5b 05 c7 46 ...]...Q...Ist.NR..........[[..F
8b80 ef b2 1e db 5b e6 70 37 ad 27 4d d7 da 68 f0 4b 1f 2a a4 c4 89 20 7b c7 cb 35 aa dd 2d cd d5 70 ....[.p7.'M..h.K.*....{..5..-..p
8ba0 c8 68 f0 f8 16 32 ca fa e1 0e 32 78 ec 97 0f 14 92 5a c9 a3 2f 07 76 51 f8 ea 1d 69 f6 8e 2a a1 .h...2....2x.....Z../.vQ...i..*.
8bc0 30 ba 97 79 9a 19 eb e4 a6 a3 6d 63 69 b6 6e 56 4f ae e3 fa 19 9c 58 af bf c7 1e ed 25 dd f8 16 0..y......mci.nVO.....X.....%...
8be0 52 a3 1f de 43 ce ff e9 3d d9 17 d3 40 bf 09 79 7a 00 65 4d 08 09 3e 28 eb 00 91 b5 bf c2 b5 cf R...C...=...@..yz.eM..>(........
8c00 da ea b8 7c d8 79 bb 66 15 e7 a6 ec bc 84 d6 2f ae c5 63 dd 65 70 5b 61 bf 27 ca 9a 10 e2 6f 94 ...|.y.f......./..c.ep[a.'....o.
8c20 d5 19 b0 1a ca ba 70 a3 73 4b 5d b2 5f 6e 57 a8 5c 41 6f a2 cf 6b 3c d5 5f 17 fd ff 8e ca 1c eb ......p.sK]._nW.\Ao..k<._.......
8c40 bf 6e 2a fc f7 44 59 13 42 fc 8d b2 3a 03 56 13 cc b2 d6 16 45 a9 5b 5d e1 ad e7 ad cf 8f 88 4d .n*..DY.B...:.V.....E.[].......M
8c60 9a c0 07 24 89 b8 8f be ee 7b 5a 6f 3d 2f 4d e0 5a 5a ab a7 5b f5 9e 28 6b 42 88 7f 51 56 67 c0 ...$.....{Zo=/M.ZZ..[..(kB..QVg.
8c80 6a 82 59 d6 8c c2 09 ca 9a 10 e2 6f 94 d5 19 b0 9a af bf fe 1a 15 ca 17 c3 eb cf 2a 06 c3 a7 e8 j.Y........o...............*....
8ca0 da 9a b2 26 84 f8 97 3b 5e d6 17 2e 5c c0 e0 b4 be 18 3c a8 17 83 e1 73 ec da b5 cb ea 9f 32 21 ...&...;^...\.....<....s......2!
8cc0 24 88 b9 e3 65 4d 08 21 84 04 3a 94 35 21 84 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 $...eM.!..:.5!....P...BH.CY.B.!.
8ce0 0e 65 4d 08 21 84 04 38 94 35 21 84 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 0e 65 4d .eM.!..8.5!....P...BH.CY.B.!..eM
8d00 08 21 84 04 38 94 35 21 84 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 0e 65 4d 08 21 84 .!..8.5!....P...BH.CY.B.!..eM.!.
8d20 04 38 94 35 21 84 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 0e 65 4d 08 21 84 04 38 94 .8.5!....P...BH.CY.B.!..eM.!..8.
8d40 35 21 84 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 0e 65 4d 08 21 84 04 38 94 35 21 84 5!....P...BH.CY.B.!..eM.!..8.5!.
8d60 10 12 e0 50 d6 84 10 42 48 80 43 59 13 42 08 21 01 ce ff 03 12 34 d3 1c 62 46 60 93 00 00 00 00 ...P...BH.CY.B.!.....4..bF`.....
8d80 49 45 4e 44 ae 42 60 82 IEND.B`.
``0``. The error indicator may or may not be + cleared if it was previously set. + + +.. cfunction:: void PyErr_SetInterrupt() + + .. index:: + single: SIGINT + single: KeyboardInterrupt (built-in exception) + + This function simulates the effect of a :const:`SIGINT` signal arriving --- the + next time :cfunc:`PyErr_CheckSignals` is called, :exc:`KeyboardInterrupt` will + be raised. It may be called without holding the interpreter lock. + + .. % XXX This was described as obsolete, but is used in + .. % thread.interrupt_main() (used from IDLE), so it's still needed. + + +.. cfunction:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict) + + This utility function creates and returns a new exception object. The *name* + argument must be the name of the new exception, a C string of the form + ``module.class``. The *base* and *dict* arguments are normally *NULL*. This + creates a class object derived from :exc:`Exception` (accessible in C as + :cdata:`PyExc_Exception`). + + The :attr:`__module__` attribute of the new class is set to the first part (up + to the last dot) of the *name* argument, and the class name is set to the last + part (after the last dot). The *base* argument can be used to specify alternate + base classes; it can either be only one class or a tuple of classes. The *dict* + argument can be used to specify a dictionary of class variables and methods. + + +.. cfunction:: void PyErr_WriteUnraisable(PyObject *obj) + + This utility function prints a warning message to ``sys.stderr`` when an + exception has been set but it is impossible for the interpreter to actually + raise the exception. It is used, for example, when an exception occurs in an + :meth:`__del__` method. + + The function is called with a single argument *obj* that identifies the context + in which the unraisable exception occurred. The repr of *obj* will be printed in + the warning message. + + +.. _standardexceptions: + +Standard Exceptions +=================== + +All standard Python exceptions are available as global variables whose names are +``PyExc_`` followed by the Python exception name. These have the type +:ctype:`PyObject\*`; they are all class objects. For completeness, here are all +the variables: + ++------------------------------------+----------------------------+----------+ +| C Name | Python Name | Notes | ++====================================+============================+==========+ +| :cdata:`PyExc_BaseException` | :exc:`BaseException` | (1), (4) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_Exception` | :exc:`Exception` | \(1) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_LookupError` | :exc:`LookupError` | \(1) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_AssertionError` | :exc:`AssertionError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_AttributeError` | :exc:`AttributeError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_EOFError` | :exc:`EOFError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_EnvironmentError` | :exc:`EnvironmentError` | \(1) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_IOError` | :exc:`IOError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_ImportError` | :exc:`ImportError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_IndexError` | :exc:`IndexError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_KeyError` | :exc:`KeyError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_MemoryError` | :exc:`MemoryError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_NameError` | :exc:`NameError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_OSError` | :exc:`OSError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_OverflowError` | :exc:`OverflowError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_RuntimeError` | :exc:`RuntimeError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_SyntaxError` | :exc:`SyntaxError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_SystemError` | :exc:`SystemError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_SystemExit` | :exc:`SystemExit` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_TypeError` | :exc:`TypeError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_ValueError` | :exc:`ValueError` | | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_WindowsError` | :exc:`WindowsError` | \(3) | ++------------------------------------+----------------------------+----------+ +| :cdata:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | ++------------------------------------+----------------------------+----------+ + +.. index:: + single: PyExc_BaseException + single: PyExc_Exception + single: PyExc_ArithmeticError + single: PyExc_LookupError + single: PyExc_AssertionError + single: PyExc_AttributeError + single: PyExc_EOFError + single: PyExc_EnvironmentError + single: PyExc_FloatingPointError + single: PyExc_IOError + single: PyExc_ImportError + single: PyExc_IndexError + single: PyExc_KeyError + single: PyExc_KeyboardInterrupt + single: PyExc_MemoryError + single: PyExc_NameError + single: PyExc_NotImplementedError + single: PyExc_OSError + single: PyExc_OverflowError + single: PyExc_ReferenceError + single: PyExc_RuntimeError + single: PyExc_SyntaxError + single: PyExc_SystemError + single: PyExc_SystemExit + single: PyExc_TypeError + single: PyExc_ValueError + single: PyExc_WindowsError + single: PyExc_ZeroDivisionError + +Notes: + +(1) + This is a base class for other standard exceptions. + +(2) + This is the same as :exc:`weakref.ReferenceError`. + +(3) + Only defined on Windows; protect code that uses this by testing that the + preprocessor macro ``MS_WINDOWS`` is defined. + +(4) + .. versionadded:: 2.5 + + +Deprecation of String Exceptions +================================ + +.. index:: single: BaseException (built-in exception) + +All exceptions built into Python or provided in the standard library are derived +from :exc:`BaseException`. + +String exceptions are still supported in the interpreter to allow existing code +to run unmodified, but this will also change in a future release. + diff --git a/Doc/c-api/index.rst b/Doc/c-api/index.rst new file mode 100644 index 0000000..c643312 --- /dev/null +++ b/Doc/c-api/index.rst @@ -0,0 +1,33 @@ +.. _c-api-index: + +################################## + Python/C API Reference Manual +################################## + +:Release: |version| +:Date: |today| + +This manual documents the API used by C and C++ programmers who want to write +extension modules or embed Python. It is a companion to :ref:`extending-index`, +which describes the general principles of extension writing but does not +document the API functions in detail. + +.. warning:: + + The current version of this document is somewhat incomplete. However, most of + the important functions, types and structures are described. + + +.. toctree:: + :maxdepth: 2 + + intro.rst + veryhigh.rst + refcounting.rst + exceptions.rst + utilities.rst + abstract.rst + concrete.rst + init.rst + memory.rst + newtypes.rst diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst new file mode 100644 index 0000000..2509e0b --- /dev/null +++ b/Doc/c-api/init.rst @@ -0,0 +1,936 @@ +.. highlightlang:: c + + +.. _initialization: + +***************************************** +Initialization, Finalization, and Threads +***************************************** + + +.. cfunction:: void Py_Initialize() + + .. index:: + single: Py_SetProgramName() + single: PyEval_InitThreads() + single: PyEval_ReleaseLock() + single: PyEval_AcquireLock() + single: modules (in module sys) + single: path (in module sys) + module: __builtin__ + module: __main__ + module: sys + triple: module; search; path + single: PySys_SetArgv() + single: Py_Finalize() + + Initialize the Python interpreter. In an application embedding Python, this + should be called before using any other Python/C API functions; with the + exception of :cfunc:`Py_SetProgramName`, :cfunc:`PyEval_InitThreads`, + :cfunc:`PyEval_ReleaseLock`, and :cfunc:`PyEval_AcquireLock`. This initializes + the table of loaded modules (``sys.modules``), and creates the fundamental + modules :mod:`__builtin__`, :mod:`__main__` and :mod:`sys`. It also initializes + the module search path (``sys.path``). It does not set ``sys.argv``; use + :cfunc:`PySys_SetArgv` for that. This is a no-op when called for a second time + (without calling :cfunc:`Py_Finalize` first). There is no return value; it is a + fatal error if the initialization fails. + + +.. cfunction:: void Py_InitializeEx(int initsigs) + + This function works like :cfunc:`Py_Initialize` if *initsigs* is 1. If + *initsigs* is 0, it skips initialization registration of signal handlers, which + might be useful when Python is embedded. + + .. versionadded:: 2.4 + + +.. cfunction:: int Py_IsInitialized() + + Return true (nonzero) when the Python interpreter has been initialized, false + (zero) if not. After :cfunc:`Py_Finalize` is called, this returns false until + :cfunc:`Py_Initialize` is called again. + + +.. cfunction:: void Py_Finalize() + + Undo all initializations made by :cfunc:`Py_Initialize` and subsequent use of + Python/C API functions, and destroy all sub-interpreters (see + :cfunc:`Py_NewInterpreter` below) that were created and not yet destroyed since + the last call to :cfunc:`Py_Initialize`. Ideally, this frees all memory + allocated by the Python interpreter. This is a no-op when called for a second + time (without calling :cfunc:`Py_Initialize` again first). There is no return + value; errors during finalization are ignored. + + This function is provided for a number of reasons. An embedding application + might want to restart Python without having to restart the application itself. + An application that has loaded the Python interpreter from a dynamically + loadable library (or DLL) might want to free all memory allocated by Python + before unloading the DLL. During a hunt for memory leaks in an application a + developer might want to free all memory allocated by Python before exiting from + the application. + + **Bugs and caveats:** The destruction of modules and objects in modules is done + in random order; this may cause destructors (:meth:`__del__` methods) to fail + when they depend on other objects (even functions) or modules. Dynamically + loaded extension modules loaded by Python are not unloaded. Small amounts of + memory allocated by the Python interpreter may not be freed (if you find a leak, + please report it). Memory tied up in circular references between objects is not + freed. Some memory allocated by extension modules may not be freed. Some + extensions may not work properly if their initialization routine is called more + than once; this can happen if an application calls :cfunc:`Py_Initialize` and + :cfunc:`Py_Finalize` more than once. + + +.. cfunction:: PyThreadState* Py_NewInterpreter() + + .. index:: + module: __builtin__ + module: __main__ + module: sys + single: stdout (in module sys) + single: stderr (in module sys) + single: stdin (in module sys) + + Create a new sub-interpreter. This is an (almost) totally separate environment + for the execution of Python code. In particular, the new interpreter has + separate, independent versions of all imported modules, including the + fundamental modules :mod:`__builtin__`, :mod:`__main__` and :mod:`sys`. The + table of loaded modules (``sys.modules``) and the module search path + (``sys.path``) are also separate. The new environment has no ``sys.argv`` + variable. It has new standard I/O stream file objects ``sys.stdin``, + ``sys.stdout`` and ``sys.stderr`` (however these refer to the same underlying + :ctype:`FILE` structures in the C library). + + The return value points to the first thread state created in the new + sub-interpreter. This thread state is made in the current thread state. + Note that no actual thread is created; see the discussion of thread states + below. If creation of the new interpreter is unsuccessful, *NULL* is + returned; no exception is set since the exception state is stored in the + current thread state and there may not be a current thread state. (Like all + other Python/C API functions, the global interpreter lock must be held before + calling this function and is still held when it returns; however, unlike most + other Python/C API functions, there needn't be a current thread state on + entry.) + + .. index:: + single: Py_Finalize() + single: Py_Initialize() + + Extension modules are shared between (sub-)interpreters as follows: the first + time a particular extension is imported, it is initialized normally, and a + (shallow) copy of its module's dictionary is squirreled away. When the same + extension is imported by another (sub-)interpreter, a new module is initialized + and filled with the contents of this copy; the extension's ``init`` function is + not called. Note that this is different from what happens when an extension is + imported after the interpreter has been completely re-initialized by calling + :cfunc:`Py_Finalize` and :cfunc:`Py_Initialize`; in that case, the extension's + ``initmodule`` function *is* called again. + + .. index:: single: close() (in module os) + + **Bugs and caveats:** Because sub-interpreters (and the main interpreter) are + part of the same process, the insulation between them isn't perfect --- for + example, using low-level file operations like :func:`os.close` they can + (accidentally or maliciously) affect each other's open files. Because of the + way extensions are shared between (sub-)interpreters, some extensions may not + work properly; this is especially likely when the extension makes use of + (static) global variables, or when the extension manipulates its module's + dictionary after its initialization. It is possible to insert objects created + in one sub-interpreter into a namespace of another sub-interpreter; this should + be done with great care to avoid sharing user-defined functions, methods, + instances or classes between sub-interpreters, since import operations executed + by such objects may affect the wrong (sub-)interpreter's dictionary of loaded + modules. (XXX This is a hard-to-fix bug that will be addressed in a future + release.) + + Also note that the use of this functionality is incompatible with extension + modules such as PyObjC and ctypes that use the :cfunc:`PyGILState_\*` APIs (and + this is inherent in the way the :cfunc:`PyGILState_\*` functions work). Simple + things may work, but confusing behavior will always be near. + + +.. cfunction:: void Py_EndInterpreter(PyThreadState *tstate) + + .. index:: single: Py_Finalize() + + Destroy the (sub-)interpreter represented by the given thread state. The given + thread state must be the current thread state. See the discussion of thread + states below. When the call returns, the current thread state is *NULL*. All + thread states associated with this interpreter are destroyed. (The global + interpreter lock must be held before calling this function and is still held + when it returns.) :cfunc:`Py_Finalize` will destroy all sub-interpreters that + haven't been explicitly destroyed at that point. + + +.. cfunction:: void Py_SetProgramName(char *name) + + .. index:: + single: Py_Initialize() + single: main() + single: Py_GetPath() + + This function should be called before :cfunc:`Py_Initialize` is called for + the first time, if it is called at all. It tells the interpreter the value + of the ``argv[0]`` argument to the :cfunc:`main` function of the program. + This is used by :cfunc:`Py_GetPath` and some other functions below to find + the Python run-time libraries relative to the interpreter executable. The + default value is ``'python'``. The argument should point to a + zero-terminated character string in static storage whose contents will not + change for the duration of the program's execution. No code in the Python + interpreter will change the contents of this storage. + + +.. cfunction:: char* Py_GetProgramName() + + .. index:: single: Py_SetProgramName() + + Return the program name set with :cfunc:`Py_SetProgramName`, or the default. + The returned string points into static storage; the caller should not modify its + value. + + +.. cfunction:: char* Py_GetPrefix() + + Return the *prefix* for installed platform-independent files. This is derived + through a number of complicated rules from the program name set with + :cfunc:`Py_SetProgramName` and some environment variables; for example, if the + program name is ``'/usr/local/bin/python'``, the prefix is ``'/usr/local'``. The + returned string points into static storage; the caller should not modify its + value. This corresponds to the :makevar:`prefix` variable in the top-level + :file:`Makefile` and the :option:`--prefix` argument to the :program:`configure` + script at build time. The value is available to Python code as ``sys.prefix``. + It is only useful on Unix. See also the next function. + + +.. cfunction:: char* Py_GetExecPrefix() + + Return the *exec-prefix* for installed platform-*dependent* files. This is + derived through a number of complicated rules from the program name set with + :cfunc:`Py_SetProgramName` and some environment variables; for example, if the + program name is ``'/usr/local/bin/python'``, the exec-prefix is + ``'/usr/local'``. The returned string points into static storage; the caller + should not modify its value. This corresponds to the :makevar:`exec_prefix` + variable in the top-level :file:`Makefile` and the :option:`--exec-prefix` + argument to the :program:`configure` script at build time. The value is + available to Python code as ``sys.exec_prefix``. It is only useful on Unix. + + Background: The exec-prefix differs from the prefix when platform dependent + files (such as executables and shared libraries) are installed in a different + directory tree. In a typical installation, platform dependent files may be + installed in the :file:`/usr/local/plat` subtree while platform independent may + be installed in :file:`/usr/local`. + + Generally speaking, a platform is a combination of hardware and software + families, e.g. Sparc machines running the Solaris 2.x operating system are + considered the same platform, but Intel machines running Solaris 2.x are another + platform, and Intel machines running Linux are yet another platform. Different + major revisions of the same operating system generally also form different + platforms. Non-Unix operating systems are a different story; the installation + strategies on those systems are so different that the prefix and exec-prefix are + meaningless, and set to the empty string. Note that compiled Python bytecode + files are platform independent (but not independent from the Python version by + which they were compiled!). + + System administrators will know how to configure the :program:`mount` or + :program:`automount` programs to share :file:`/usr/local` between platforms + while having :file:`/usr/local/plat` be a different filesystem for each + platform. + + +.. cfunction:: char* Py_GetProgramFullPath() + + .. index:: + single: Py_SetProgramName() + single: executable (in module sys) + + Return the full program name of the Python executable; this is computed as a + side-effect of deriving the default module search path from the program name + (set by :cfunc:`Py_SetProgramName` above). The returned string points into + static storage; the caller should not modify its value. The value is available + to Python code as ``sys.executable``. + + +.. cfunction:: char* Py_GetPath() + + .. index:: + triple: module; search; path + single: path (in module sys) + + Return the default module search path; this is computed from the program name + (set by :cfunc:`Py_SetProgramName` above) and some environment variables. The + returned string consists of a series of directory names separated by a platform + dependent delimiter character. The delimiter character is ``':'`` on Unix and + Mac OS X, ``';'`` on Windows. The returned string points into static storage; + the caller should not modify its value. The value is available to Python code + as the list ``sys.path``, which may be modified to change the future search path + for loaded modules. + + .. % XXX should give the exact rules + + +.. cfunction:: const char* Py_GetVersion() + + Return the version of this Python interpreter. This is a string that looks + something like :: + + "1.5 (#67, Dec 31 1997, 22:34:28) [GCC 2.7.2.2]" + + .. index:: single: version (in module sys) + + The first word (up to the first space character) is the current Python version; + the first three characters are the major and minor version separated by a + period. The returned string points into static storage; the caller should not + modify its value. The value is available to Python code as ``sys.version``. + + +.. cfunction:: const char* Py_GetBuildNumber() + + Return a string representing the Subversion revision that this Python executable + was built from. This number is a string because it may contain a trailing 'M' + if Python was built from a mixed revision source tree. + + .. versionadded:: 2.5 + + +.. cfunction:: const char* Py_GetPlatform() + + .. index:: single: platform (in module sys) + + Return the platform identifier for the current platform. On Unix, this is + formed from the "official" name of the operating system, converted to lower + case, followed by the major revision number; e.g., for Solaris 2.x, which is + also known as SunOS 5.x, the value is ``'sunos5'``. On Mac OS X, it is + ``'darwin'``. On Windows, it is ``'win'``. The returned string points into + static storage; the caller should not modify its value. The value is available + to Python code as ``sys.platform``. + + +.. cfunction:: const char* Py_GetCopyright() + + Return the official copyright string for the current Python version, for example + + ``'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'`` + + .. index:: single: copyright (in module sys) + + The returned string points into static storage; the caller should not modify its + value. The value is available to Python code as ``sys.copyright``. + + +.. cfunction:: const char* Py_GetCompiler() + + Return an indication of the compiler used to build the current Python version, + in square brackets, for example:: + + "[GCC 2.7.2.2]" + + .. index:: single: version (in module sys) + + The returned string points into static storage; the caller should not modify its + value. The value is available to Python code as part of the variable + ``sys.version``. + + +.. cfunction:: const char* Py_GetBuildInfo() + + Return information about the sequence number and build date and time of the + current Python interpreter instance, for example :: + + "#67, Aug 1 1997, 22:34:28" + + .. index:: single: version (in module sys) + + The returned string points into static storage; the caller should not modify its + value. The value is available to Python code as part of the variable + ``sys.version``. + + +.. cfunction:: void PySys_SetArgv(int argc, char **argv) + + .. index:: + single: main() + single: Py_FatalError() + single: argv (in module sys) + + Set ``sys.argv`` based on *argc* and *argv*. These parameters are similar to + those passed to the program's :cfunc:`main` function with the difference that + the first entry should refer to the script file to be executed rather than the + executable hosting the Python interpreter. If there isn't a script that will be + run, the first entry in *argv* can be an empty string. If this function fails + to initialize ``sys.argv``, a fatal condition is signalled using + :cfunc:`Py_FatalError`. + + .. % XXX impl. doesn't seem consistent in allowing 0/NULL for the params; + .. % check w/ Guido. + +.. % XXX Other PySys thingies (doesn't really belong in this chapter) + + +.. _threads: + +Thread State and the Global Interpreter Lock +============================================ + +.. index:: + single: global interpreter lock + single: interpreter lock + single: lock, interpreter + +The Python interpreter is not fully thread safe. In order to support +multi-threaded Python programs, there's a global lock that must be held by the +current thread before it can safely access Python objects. Without the lock, +even the simplest operations could cause problems in a multi-threaded program: +for example, when two threads simultaneously increment the reference count of +the same object, the reference count could end up being incremented only once +instead of twice. + +.. index:: single: setcheckinterval() (in module sys) + +Therefore, the rule exists that only the thread that has acquired the global +interpreter lock may operate on Python objects or call Python/C API functions. +In order to support multi-threaded Python programs, the interpreter regularly +releases and reacquires the lock --- by default, every 100 bytecode instructions +(this can be changed with :func:`sys.setcheckinterval`). The lock is also +released and reacquired around potentially blocking I/O operations like reading +or writing a file, so that other threads can run while the thread that requests +the I/O is waiting for the I/O operation to complete. + +.. index:: + single: PyThreadState + single: PyThreadState + +The Python interpreter needs to keep some bookkeeping information separate per +thread --- for this it uses a data structure called :ctype:`PyThreadState`. +There's one global variable, however: the pointer to the current +:ctype:`PyThreadState` structure. While most thread packages have a way to +store "per-thread global data," Python's internal platform independent thread +abstraction doesn't support this yet. Therefore, the current thread state must +be manipulated explicitly. + +This is easy enough in most cases. Most code manipulating the global +interpreter lock has the following simple structure:: + + Save the thread state in a local variable. + Release the interpreter lock. + ...Do some blocking I/O operation... + Reacquire the interpreter lock. + Restore the thread state from the local variable. + +This is so common that a pair of macros exists to simplify it:: + + Py_BEGIN_ALLOW_THREADS + ...Do some blocking I/O operation... + Py_END_ALLOW_THREADS + +.. index:: + single: Py_BEGIN_ALLOW_THREADS + single: Py_END_ALLOW_THREADS + +The :cmacro:`Py_BEGIN_ALLOW_THREADS` macro opens a new block and declares a +hidden local variable; the :cmacro:`Py_END_ALLOW_THREADS` macro closes the +block. Another advantage of using these two macros is that when Python is +compiled without thread support, they are defined empty, thus saving the thread +state and lock manipulations. + +When thread support is enabled, the block above expands to the following code:: + + PyThreadState *_save; + + _save = PyEval_SaveThread(); + ...Do some blocking I/O operation... + PyEval_RestoreThread(_save); + +Using even lower level primitives, we can get roughly the same effect as +follows:: + + PyThreadState *_save; + + _save = PyThreadState_Swap(NULL); + PyEval_ReleaseLock(); + ...Do some blocking I/O operation... + PyEval_AcquireLock(); + PyThreadState_Swap(_save); + +.. index:: + single: PyEval_RestoreThread() + single: errno + single: PyEval_SaveThread() + single: PyEval_ReleaseLock() + single: PyEval_AcquireLock() + +There are some subtle differences; in particular, :cfunc:`PyEval_RestoreThread` +saves and restores the value of the global variable :cdata:`errno`, since the +lock manipulation does not guarantee that :cdata:`errno` is left alone. Also, +when thread support is disabled, :cfunc:`PyEval_SaveThread` and +:cfunc:`PyEval_RestoreThread` don't manipulate the lock; in this case, +:cfunc:`PyEval_ReleaseLock` and :cfunc:`PyEval_AcquireLock` are not available. +This is done so that dynamically loaded extensions compiled with thread support +enabled can be loaded by an interpreter that was compiled with disabled thread +support. + +The global interpreter lock is used to protect the pointer to the current thread +state. When releasing the lock and saving the thread state, the current thread +state pointer must be retrieved before the lock is released (since another +thread could immediately acquire the lock and store its own thread state in the +global variable). Conversely, when acquiring the lock and restoring the thread +state, the lock must be acquired before storing the thread state pointer. + +Why am I going on with so much detail about this? Because when threads are +created from C, they don't have the global interpreter lock, nor is there a +thread state data structure for them. Such threads must bootstrap themselves +into existence, by first creating a thread state data structure, then acquiring +the lock, and finally storing their thread state pointer, before they can start +using the Python/C API. When they are done, they should reset the thread state +pointer, release the lock, and finally free their thread state data structure. + +Beginning with version 2.3, threads can now take advantage of the +:cfunc:`PyGILState_\*` functions to do all of the above automatically. The +typical idiom for calling into Python from a C thread is now:: + + PyGILState_STATE gstate; + gstate = PyGILState_Ensure(); + + /* Perform Python actions here. */ + result = CallSomeFunction(); + /* evaluate result */ + + /* Release the thread. No Python API allowed beyond this point. */ + PyGILState_Release(gstate); + +Note that the :cfunc:`PyGILState_\*` functions assume there is only one global +interpreter (created automatically by :cfunc:`Py_Initialize`). Python still +supports the creation of additional interpreters (using +:cfunc:`Py_NewInterpreter`), but mixing multiple interpreters and the +:cfunc:`PyGILState_\*` API is unsupported. + + +.. ctype:: PyInterpreterState + + This data structure represents the state shared by a number of cooperating + threads. Threads belonging to the same interpreter share their module + administration and a few other internal items. There are no public members in + this structure. + + Threads belonging to different interpreters initially share nothing, except + process state like available memory, open file descriptors and such. The global + interpreter lock is also shared by all threads, regardless of to which + interpreter they belong. + + +.. ctype:: PyThreadState + + This data structure represents the state of a single thread. The only public + data member is :ctype:`PyInterpreterState \*`:attr:`interp`, which points to + this thread's interpreter state. + + +.. cfunction:: void PyEval_InitThreads() + + .. index:: + single: PyEval_ReleaseLock() + single: PyEval_ReleaseThread() + single: PyEval_SaveThread() + single: PyEval_RestoreThread() + + Initialize and acquire the global interpreter lock. It should be called in the + main thread before creating a second thread or engaging in any other thread + operations such as :cfunc:`PyEval_ReleaseLock` or + ``PyEval_ReleaseThread(tstate)``. It is not needed before calling + :cfunc:`PyEval_SaveThread` or :cfunc:`PyEval_RestoreThread`. + + .. index:: single: Py_Initialize() + + This is a no-op when called for a second time. It is safe to call this function + before calling :cfunc:`Py_Initialize`. + + .. index:: module: thread + + When only the main thread exists, no lock operations are needed. This is a + common situation (most Python programs do not use threads), and the lock + operations slow the interpreter down a bit. Therefore, the lock is not created + initially. This situation is equivalent to having acquired the lock: when + there is only a single thread, all object accesses are safe. Therefore, when + this function initializes the lock, it also acquires it. Before the Python + :mod:`thread` module creates a new thread, knowing that either it has the lock + or the lock hasn't been created yet, it calls :cfunc:`PyEval_InitThreads`. When + this call returns, it is guaranteed that the lock has been created and that the + calling thread has acquired it. + + It is **not** safe to call this function when it is unknown which thread (if + any) currently has the global interpreter lock. + + This function is not available when thread support is disabled at compile time. + + +.. cfunction:: int PyEval_ThreadsInitialized() + + Returns a non-zero value if :cfunc:`PyEval_InitThreads` has been called. This + function can be called without holding the lock, and therefore can be used to + avoid calls to the locking API when running single-threaded. This function is + not available when thread support is disabled at compile time. + + .. versionadded:: 2.4 + + +.. cfunction:: void PyEval_AcquireLock() + + Acquire the global interpreter lock. The lock must have been created earlier. + If this thread already has the lock, a deadlock ensues. This function is not + available when thread support is disabled at compile time. + + +.. cfunction:: void PyEval_ReleaseLock() + + Release the global interpreter lock. The lock must have been created earlier. + This function is not available when thread support is disabled at compile time. + + +.. cfunction:: void PyEval_AcquireThread(PyThreadState *tstate) + + Acquire the global interpreter lock and set the current thread state to + *tstate*, which should not be *NULL*. The lock must have been created earlier. + If this thread already has the lock, deadlock ensues. This function is not + available when thread support is disabled at compile time. + + +.. cfunction:: void PyEval_ReleaseThread(PyThreadState *tstate) + + Reset the current thread state to *NULL* and release the global interpreter + lock. The lock must have been created earlier and must be held by the current + thread. The *tstate* argument, which must not be *NULL*, is only used to check + that it represents the current thread state --- if it isn't, a fatal error is + reported. This function is not available when thread support is disabled at + compile time. + + +.. cfunction:: PyThreadState* PyEval_SaveThread() + + Release the interpreter lock (if it has been created and thread support is + enabled) and reset the thread state to *NULL*, returning the previous thread + state (which is not *NULL*). If the lock has been created, the current thread + must have acquired it. (This function is available even when thread support is + disabled at compile time.) + + +.. cfunction:: void PyEval_RestoreThread(PyThreadState *tstate) + + Acquire the interpreter lock (if it has been created and thread support is + enabled) and set the thread state to *tstate*, which must not be *NULL*. If the + lock has been created, the current thread must not have acquired it, otherwise + deadlock ensues. (This function is available even when thread support is + disabled at compile time.) + +The following macros are normally used without a trailing semicolon; look for +example usage in the Python source distribution. + + +.. cmacro:: Py_BEGIN_ALLOW_THREADS + + This macro expands to ``{ PyThreadState *_save; _save = PyEval_SaveThread();``. + Note that it contains an opening brace; it must be matched with a following + :cmacro:`Py_END_ALLOW_THREADS` macro. See above for further discussion of this + macro. It is a no-op when thread support is disabled at compile time. + + +.. cmacro:: Py_END_ALLOW_THREADS + + This macro expands to ``PyEval_RestoreThread(_save); }``. Note that it contains + a closing brace; it must be matched with an earlier + :cmacro:`Py_BEGIN_ALLOW_THREADS` macro. See above for further discussion of + this macro. It is a no-op when thread support is disabled at compile time. + + +.. cmacro:: Py_BLOCK_THREADS + + This macro expands to ``PyEval_RestoreThread(_save);``: it is equivalent to + :cmacro:`Py_END_ALLOW_THREADS` without the closing brace. It is a no-op when + thread support is disabled at compile time. + + +.. cmacro:: Py_UNBLOCK_THREADS + + This macro expands to ``_save = PyEval_SaveThread();``: it is equivalent to + :cmacro:`Py_BEGIN_ALLOW_THREADS` without the opening brace and variable + declaration. It is a no-op when thread support is disabled at compile time. + +All of the following functions are only available when thread support is enabled +at compile time, and must be called only when the interpreter lock has been +created. + + +.. cfunction:: PyInterpreterState* PyInterpreterState_New() + + Create a new interpreter state object. The interpreter lock need not be held, + but may be held if it is necessary to serialize calls to this function. + + +.. cfunction:: void PyInterpreterState_Clear(PyInterpreterState *interp) + + Reset all information in an interpreter state object. The interpreter lock must + be held. + + +.. cfunction:: void PyInterpreterState_Delete(PyInterpreterState *interp) + + Destroy an interpreter state object. The interpreter lock need not be held. + The interpreter state must have been reset with a previous call to + :cfunc:`PyInterpreterState_Clear`. + + +.. cfunction:: PyThreadState* PyThreadState_New(PyInterpreterState *interp) + + Create a new thread state object belonging to the given interpreter object. The + interpreter lock need not be held, but may be held if it is necessary to + serialize calls to this function. + + +.. cfunction:: void PyThreadState_Clear(PyThreadState *tstate) + + Reset all information in a thread state object. The interpreter lock must be + held. + + +.. cfunction:: void PyThreadState_Delete(PyThreadState *tstate) + + Destroy a thread state object. The interpreter lock need not be held. The + thread state must have been reset with a previous call to + :cfunc:`PyThreadState_Clear`. + + +.. cfunction:: PyThreadState* PyThreadState_Get() + + Return the current thread state. The interpreter lock must be held. When the + current thread state is *NULL*, this issues a fatal error (so that the caller + needn't check for *NULL*). + + +.. cfunction:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate) + + Swap the current thread state with the thread state given by the argument + *tstate*, which may be *NULL*. The interpreter lock must be held. + + +.. cfunction:: PyObject* PyThreadState_GetDict() + + Return a dictionary in which extensions can store thread-specific state + information. Each extension should use a unique key to use to store state in + the dictionary. It is okay to call this function when no current thread state + is available. If this function returns *NULL*, no exception has been raised and + the caller should assume no current thread state is available. + + .. versionchanged:: 2.3 + Previously this could only be called when a current thread is active, and *NULL* + meant that an exception was raised. + + +.. cfunction:: int PyThreadState_SetAsyncExc(long id, PyObject *exc) + + Asynchronously raise an exception in a thread. The *id* argument is the thread + id of the target thread; *exc* is the exception object to be raised. This + function does not steal any references to *exc*. To prevent naive misuse, you + must write your own C extension to call this. Must be called with the GIL held. + Returns the number of thread states modified; this is normally one, but will be + zero if the thread id isn't found. If *exc* is :const:`NULL`, the pending + exception (if any) for the thread is cleared. This raises no exceptions. + + .. versionadded:: 2.3 + + +.. cfunction:: PyGILState_STATE PyGILState_Ensure() + + Ensure that the current thread is ready to call the Python C API regardless of + the current state of Python, or of its thread lock. This may be called as many + times as desired by a thread as long as each call is matched with a call to + :cfunc:`PyGILState_Release`. In general, other thread-related APIs may be used + between :cfunc:`PyGILState_Ensure` and :cfunc:`PyGILState_Release` calls as long + as the thread state is restored to its previous state before the Release(). For + example, normal usage of the :cmacro:`Py_BEGIN_ALLOW_THREADS` and + :cmacro:`Py_END_ALLOW_THREADS` macros is acceptable. + + The return value is an opaque "handle" to the thread state when + :cfunc:`PyGILState_Acquire` was called, and must be passed to + :cfunc:`PyGILState_Release` to ensure Python is left in the same state. Even + though recursive calls are allowed, these handles *cannot* be shared - each + unique call to :cfunc:`PyGILState_Ensure` must save the handle for its call to + :cfunc:`PyGILState_Release`. + + When the function returns, the current thread will hold the GIL. Failure is a + fatal error. + + .. versionadded:: 2.3 + + +.. cfunction:: void PyGILState_Release(PyGILState_STATE) + + Release any resources previously acquired. After this call, Python's state will + be the same as it was prior to the corresponding :cfunc:`PyGILState_Ensure` call + (but generally this state will be unknown to the caller, hence the use of the + GILState API.) + + Every call to :cfunc:`PyGILState_Ensure` must be matched by a call to + :cfunc:`PyGILState_Release` on the same thread. + + .. versionadded:: 2.3 + + +.. _profiling: + +Profiling and Tracing +===================== + +.. sectionauthor:: Fred L. Drake, Jr. + + +The Python interpreter provides some low-level support for attaching profiling +and execution tracing facilities. These are used for profiling, debugging, and +coverage analysis tools. + +Starting with Python 2.2, the implementation of this facility was substantially +revised, and an interface from C was added. This C interface allows the +profiling or tracing code to avoid the overhead of calling through Python-level +callable objects, making a direct C function call instead. The essential +attributes of the facility have not changed; the interface allows trace +functions to be installed per-thread, and the basic events reported to the trace +function are the same as had been reported to the Python-level trace functions +in previous versions. + + +.. ctype:: int (*Py_tracefunc)(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg) + + The type of the trace function registered using :cfunc:`PyEval_SetProfile` and + :cfunc:`PyEval_SetTrace`. The first parameter is the object passed to the + registration function as *obj*, *frame* is the frame object to which the event + pertains, *what* is one of the constants :const:`PyTrace_CALL`, + :const:`PyTrace_EXCEPTION`, :const:`PyTrace_LINE`, :const:`PyTrace_RETURN`, + :const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION`, or + :const:`PyTrace_C_RETURN`, and *arg* depends on the value of *what*: + + +------------------------------+--------------------------------------+ + | Value of *what* | Meaning of *arg* | + +==============================+======================================+ + | :const:`PyTrace_CALL` | Always *NULL*. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_EXCEPTION` | Exception information as returned by | + | | :func:`sys.exc_info`. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_LINE` | Always *NULL*. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_RETURN` | Value being returned to the caller. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_C_CALL` | Name of function being called. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_C_EXCEPTION` | Always *NULL*. | + +------------------------------+--------------------------------------+ + | :const:`PyTrace_C_RETURN` | Always *NULL*. | + +------------------------------+--------------------------------------+ + + +.. cvar:: int PyTrace_CALL + + The value of the *what* parameter to a :ctype:`Py_tracefunc` function when a new + call to a function or method is being reported, or a new entry into a generator. + Note that the creation of the iterator for a generator function is not reported + as there is no control transfer to the Python bytecode in the corresponding + frame. + + +.. cvar:: int PyTrace_EXCEPTION + + The value of the *what* parameter to a :ctype:`Py_tracefunc` function when an + exception has been raised. The callback function is called with this value for + *what* when after any bytecode is processed after which the exception becomes + set within the frame being executed. The effect of this is that as exception + propagation causes the Python stack to unwind, the callback is called upon + return to each frame as the exception propagates. Only trace functions receives + these events; they are not needed by the profiler. + + +.. cvar:: int PyTrace_LINE + + The value passed as the *what* parameter to a trace function (but not a + profiling function) when a line-number event is being reported. + + +.. cvar:: int PyTrace_RETURN + + The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a + call is returning without propagating an exception. + + +.. cvar:: int PyTrace_C_CALL + + The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C + function is about to be called. + + +.. cvar:: int PyTrace_C_EXCEPTION + + The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C + function has thrown an exception. + + +.. cvar:: int PyTrace_C_RETURN + + The value for the *what* parameter to :ctype:`Py_tracefunc` functions when a C + function has returned. + + +.. cfunction:: void PyEval_SetProfile(Py_tracefunc func, PyObject *obj) + + Set the profiler function to *func*. The *obj* parameter is passed to the + function as its first parameter, and may be any Python object, or *NULL*. If + the profile function needs to maintain state, using a different value for *obj* + for each thread provides a convenient and thread-safe place to store it. The + profile function is called for all monitored events except the line-number + events. + + +.. cfunction:: void PyEval_SetTrace(Py_tracefunc func, PyObject *obj) + + Set the tracing function to *func*. This is similar to + :cfunc:`PyEval_SetProfile`, except the tracing function does receive line-number + events. + + +.. _advanced-debugging: + +Advanced Debugger Support +========================= + +.. sectionauthor:: Fred L. Drake, Jr. + + +These functions are only intended to be used by advanced debugging tools. + + +.. cfunction:: PyInterpreterState* PyInterpreterState_Head() + + Return the interpreter state object at the head of the list of all such objects. + + .. versionadded:: 2.2 + + +.. cfunction:: PyInterpreterState* PyInterpreterState_Next(PyInterpreterState *interp) + + Return the next interpreter state object after *interp* from the list of all + such objects. + + .. versionadded:: 2.2 + + +.. cfunction:: PyThreadState * PyInterpreterState_ThreadHead(PyInterpreterState *interp) + + Return the a pointer to the first :ctype:`PyThreadState` object in the list of + threads associated with the interpreter *interp*. + + .. versionadded:: 2.2 + + +.. cfunction:: PyThreadState* PyThreadState_Next(PyThreadState *tstate) + + Return the next thread state object after *tstate* from the list of all such + objects belonging to the same :ctype:`PyInterpreterState` object. + + .. versionadded:: 2.2 + diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst new file mode 100644 index 0000000..60b0052 --- /dev/null +++ b/Doc/c-api/intro.rst @@ -0,0 +1,630 @@ +.. highlightlang:: c + + +.. _api-intro: + +************ +Introduction +************ + +The Application Programmer's Interface to Python gives C and C++ programmers +access to the Python interpreter at a variety of levels. The API is equally +usable from C++, but for brevity it is generally referred to as the Python/C +API. There are two fundamentally different reasons for using the Python/C API. +The first reason is to write *extension modules* for specific purposes; these +are C modules that extend the Python interpreter. This is probably the most +common use. The second reason is to use Python as a component in a larger +application; this technique is generally referred to as :dfn:`embedding` Python +in an application. + +Writing an extension module is a relatively well-understood process, where a +"cookbook" approach works well. There are several tools that automate the +process to some extent. While people have embedded Python in other +applications since its early existence, the process of embedding Python is less +straightforward than writing an extension. + +Many API functions are useful independent of whether you're embedding or +extending Python; moreover, most applications that embed Python will need to +provide a custom extension as well, so it's probably a good idea to become +familiar with writing an extension before attempting to embed Python in a real +application. + + +.. _api-includes: + +Include Files +============= + +All function, type and macro definitions needed to use the Python/C API are +included in your code by the following line:: + + #include "Python.h" + +This implies inclusion of the following standard headers: ````, +````, ````, ````, and ```` (if +available). + +.. warning:: + + Since Python may define some pre-processor definitions which affect the standard + headers on some systems, you *must* include :file:`Python.h` before any standard + headers are included. + +All user visible names defined by Python.h (except those defined by the included +standard headers) have one of the prefixes ``Py`` or ``_Py``. Names beginning +with ``_Py`` are for internal use by the Python implementation and should not be +used by extension writers. Structure member names do not have a reserved prefix. + +**Important:** user code should never define names that begin with ``Py`` or +``_Py``. This confuses the reader, and jeopardizes the portability of the user +code to future Python versions, which may define additional names beginning with +one of these prefixes. + +The header files are typically installed with Python. On Unix, these are +located in the directories :file:`{prefix}/include/pythonversion/` and +:file:`{exec_prefix}/include/pythonversion/`, where :envvar:`prefix` and +:envvar:`exec_prefix` are defined by the corresponding parameters to Python's +:program:`configure` script and *version* is ``sys.version[:3]``. On Windows, +the headers are installed in :file:`{prefix}/include`, where :envvar:`prefix` is +the installation directory specified to the installer. + +To include the headers, place both directories (if different) on your compiler's +search path for includes. Do *not* place the parent directories on the search +path and then use ``#include ``; this will break on +multi-platform builds since the platform independent headers under +:envvar:`prefix` include the platform specific headers from +:envvar:`exec_prefix`. + +C++ users should note that though the API is defined entirely using C, the +header files do properly declare the entry points to be ``extern "C"``, so there +is no need to do anything special to use the API from C++. + + +.. _api-objects: + +Objects, Types and Reference Counts +=================================== + +.. index:: object: type + +Most Python/C API functions have one or more arguments as well as a return value +of type :ctype:`PyObject\*`. This type is a pointer to an opaque data type +representing an arbitrary Python object. Since all Python object types are +treated the same way by the Python language in most situations (e.g., +assignments, scope rules, and argument passing), it is only fitting that they +should be represented by a single C type. Almost all Python objects live on the +heap: you never declare an automatic or static variable of type +:ctype:`PyObject`, only pointer variables of type :ctype:`PyObject\*` can be +declared. The sole exception are the type objects; since these must never be +deallocated, they are typically static :ctype:`PyTypeObject` objects. + +All Python objects (even Python integers) have a :dfn:`type` and a +:dfn:`reference count`. An object's type determines what kind of object it is +(e.g., an integer, a list, or a user-defined function; there are many more as +explained in :ref:`types`). For each of the well-known types there is a macro +to check whether an object is of that type; for instance, ``PyList_Check(a)`` is +true if (and only if) the object pointed to by *a* is a Python list. + + +.. _api-refcounts: + +Reference Counts +---------------- + +The reference count is important because today's computers have a finite (and +often severely limited) memory size; it counts how many different places there +are that have a reference to an object. Such a place could be another object, +or a global (or static) C variable, or a local variable in some C function. +When an object's reference count becomes zero, the object is deallocated. If +it contains references to other objects, their reference count is decremented. +Those other objects may be deallocated in turn, if this decrement makes their +reference count become zero, and so on. (There's an obvious problem with +objects that reference each other here; for now, the solution is "don't do +that.") + +.. index:: + single: Py_INCREF() + single: Py_DECREF() + +Reference counts are always manipulated explicitly. The normal way is to use +the macro :cfunc:`Py_INCREF` to increment an object's reference count by one, +and :cfunc:`Py_DECREF` to decrement it by one. The :cfunc:`Py_DECREF` macro +is considerably more complex than the incref one, since it must check whether +the reference count becomes zero and then cause the object's deallocator to be +called. The deallocator is a function pointer contained in the object's type +structure. The type-specific deallocator takes care of decrementing the +reference counts for other objects contained in the object if this is a compound +object type, such as a list, as well as performing any additional finalization +that's needed. There's no chance that the reference count can overflow; at +least as many bits are used to hold the reference count as there are distinct +memory locations in virtual memory (assuming ``sizeof(long) >= sizeof(char*)``). +Thus, the reference count increment is a simple operation. + +It is not necessary to increment an object's reference count for every local +variable that contains a pointer to an object. In theory, the object's +reference count goes up by one when the variable is made to point to it and it +goes down by one when the variable goes out of scope. However, these two +cancel each other out, so at the end the reference count hasn't changed. The +only real reason to use the reference count is to prevent the object from being +deallocated as long as our variable is pointing to it. If we know that there +is at least one other reference to the object that lives at least as long as +our variable, there is no need to increment the reference count temporarily. +An important situation where this arises is in objects that are passed as +arguments to C functions in an extension module that are called from Python; +the call mechanism guarantees to hold a reference to every argument for the +duration of the call. + +However, a common pitfall is to extract an object from a list and hold on to it +for a while without incrementing its reference count. Some other operation might +conceivably remove the object from the list, decrementing its reference count +and possible deallocating it. The real danger is that innocent-looking +operations may invoke arbitrary Python code which could do this; there is a code +path which allows control to flow back to the user from a :cfunc:`Py_DECREF`, so +almost any operation is potentially dangerous. + +A safe approach is to always use the generic operations (functions whose name +begins with ``PyObject_``, ``PyNumber_``, ``PySequence_`` or ``PyMapping_``). +These operations always increment the reference count of the object they return. +This leaves the caller with the responsibility to call :cfunc:`Py_DECREF` when +they are done with the result; this soon becomes second nature. + + +.. _api-refcountdetails: + +Reference Count Details +^^^^^^^^^^^^^^^^^^^^^^^ + +The reference count behavior of functions in the Python/C API is best explained +in terms of *ownership of references*. Ownership pertains to references, never +to objects (objects are not owned: they are always shared). "Owning a +reference" means being responsible for calling Py_DECREF on it when the +reference is no longer needed. Ownership can also be transferred, meaning that +the code that receives ownership of the reference then becomes responsible for +eventually decref'ing it by calling :cfunc:`Py_DECREF` or :cfunc:`Py_XDECREF` +when it's no longer needed---or passing on this responsibility (usually to its +caller). When a function passes ownership of a reference on to its caller, the +caller is said to receive a *new* reference. When no ownership is transferred, +the caller is said to *borrow* the reference. Nothing needs to be done for a +borrowed reference. + +Conversely, when a calling function passes it a reference to an object, there +are two possibilities: the function *steals* a reference to the object, or it +does not. *Stealing a reference* means that when you pass a reference to a +function, that function assumes that it now owns that reference, and you are not +responsible for it any longer. + +.. index:: + single: PyList_SetItem() + single: PyTuple_SetItem() + +Few functions steal references; the two notable exceptions are +:cfunc:`PyList_SetItem` and :cfunc:`PyTuple_SetItem`, which steal a reference +to the item (but not to the tuple or list into which the item is put!). These +functions were designed to steal a reference because of a common idiom for +populating a tuple or list with newly created objects; for example, the code to +create the tuple ``(1, 2, "three")`` could look like this (forgetting about +error handling for the moment; a better way to code this is shown below):: + + PyObject *t; + + t = PyTuple_New(3); + PyTuple_SetItem(t, 0, PyInt_FromLong(1L)); + PyTuple_SetItem(t, 1, PyInt_FromLong(2L)); + PyTuple_SetItem(t, 2, PyString_FromString("three")); + +Here, :cfunc:`PyInt_FromLong` returns a new reference which is immediately +stolen by :cfunc:`PyTuple_SetItem`. When you want to keep using an object +although the reference to it will be stolen, use :cfunc:`Py_INCREF` to grab +another reference before calling the reference-stealing function. + +Incidentally, :cfunc:`PyTuple_SetItem` is the *only* way to set tuple items; +:cfunc:`PySequence_SetItem` and :cfunc:`PyObject_SetItem` refuse to do this +since tuples are an immutable data type. You should only use +:cfunc:`PyTuple_SetItem` for tuples that you are creating yourself. + +Equivalent code for populating a list can be written using :cfunc:`PyList_New` +and :cfunc:`PyList_SetItem`. + +However, in practice, you will rarely use these ways of creating and populating +a tuple or list. There's a generic function, :cfunc:`Py_BuildValue`, that can +create most common objects from C values, directed by a :dfn:`format string`. +For example, the above two blocks of code could be replaced by the following +(which also takes care of the error checking):: + + PyObject *tuple, *list; + + tuple = Py_BuildValue("(iis)", 1, 2, "three"); + list = Py_BuildValue("[iis]", 1, 2, "three"); + +It is much more common to use :cfunc:`PyObject_SetItem` and friends with items +whose references you are only borrowing, like arguments that were passed in to +the function you are writing. In that case, their behaviour regarding reference +counts is much saner, since you don't have to increment a reference count so you +can give a reference away ("have it be stolen"). For example, this function +sets all items of a list (actually, any mutable sequence) to a given item:: + + int + set_all(PyObject *target, PyObject *item) + { + int i, n; + + n = PyObject_Length(target); + if (n < 0) + return -1; + for (i = 0; i < n; i++) { + PyObject *index = PyInt_FromLong(i); + if (!index) + return -1; + if (PyObject_SetItem(target, index, item) < 0) + return -1; + Py_DECREF(index); + } + return 0; + } + +.. index:: single: set_all() + +The situation is slightly different for function return values. While passing +a reference to most functions does not change your ownership responsibilities +for that reference, many functions that return a reference to an object give +you ownership of the reference. The reason is simple: in many cases, the +returned object is created on the fly, and the reference you get is the only +reference to the object. Therefore, the generic functions that return object +references, like :cfunc:`PyObject_GetItem` and :cfunc:`PySequence_GetItem`, +always return a new reference (the caller becomes the owner of the reference). + +It is important to realize that whether you own a reference returned by a +function depends on which function you call only --- *the plumage* (the type of +the object passed as an argument to the function) *doesn't enter into it!* +Thus, if you extract an item from a list using :cfunc:`PyList_GetItem`, you +don't own the reference --- but if you obtain the same item from the same list +using :cfunc:`PySequence_GetItem` (which happens to take exactly the same +arguments), you do own a reference to the returned object. + +.. index:: + single: PyList_GetItem() + single: PySequence_GetItem() + +Here is an example of how you could write a function that computes the sum of +the items in a list of integers; once using :cfunc:`PyList_GetItem`, and once +using :cfunc:`PySequence_GetItem`. :: + + long + sum_list(PyObject *list) + { + int i, n; + long total = 0; + PyObject *item; + + n = PyList_Size(list); + if (n < 0) + return -1; /* Not a list */ + for (i = 0; i < n; i++) { + item = PyList_GetItem(list, i); /* Can't fail */ + if (!PyInt_Check(item)) continue; /* Skip non-integers */ + total += PyInt_AsLong(item); + } + return total; + } + +.. index:: single: sum_list() + +:: + + long + sum_sequence(PyObject *sequence) + { + int i, n; + long total = 0; + PyObject *item; + n = PySequence_Length(sequence); + if (n < 0) + return -1; /* Has no length */ + for (i = 0; i < n; i++) { + item = PySequence_GetItem(sequence, i); + if (item == NULL) + return -1; /* Not a sequence, or other failure */ + if (PyInt_Check(item)) + total += PyInt_AsLong(item); + Py_DECREF(item); /* Discard reference ownership */ + } + return total; + } + +.. index:: single: sum_sequence() + + +.. _api-types: + +Types +----- + +There are few other data types that play a significant role in the Python/C +API; most are simple C types such as :ctype:`int`, :ctype:`long`, +:ctype:`double` and :ctype:`char\*`. A few structure types are used to +describe static tables used to list the functions exported by a module or the +data attributes of a new object type, and another is used to describe the value +of a complex number. These will be discussed together with the functions that +use them. + + +.. _api-exceptions: + +Exceptions +========== + +The Python programmer only needs to deal with exceptions if specific error +handling is required; unhandled exceptions are automatically propagated to the +caller, then to the caller's caller, and so on, until they reach the top-level +interpreter, where they are reported to the user accompanied by a stack +traceback. + +.. index:: single: PyErr_Occurred() + +For C programmers, however, error checking always has to be explicit. All +functions in the Python/C API can raise exceptions, unless an explicit claim is +made otherwise in a function's documentation. In general, when a function +encounters an error, it sets an exception, discards any object references that +it owns, and returns an error indicator --- usually *NULL* or ``-1``. A few +functions return a Boolean true/false result, with false indicating an error. +Very few functions return no explicit error indicator or have an ambiguous +return value, and require explicit testing for errors with +:cfunc:`PyErr_Occurred`. + +.. index:: + single: PyErr_SetString() + single: PyErr_Clear() + +Exception state is maintained in per-thread storage (this is equivalent to +using global storage in an unthreaded application). A thread can be in one of +two states: an exception has occurred, or not. The function +:cfunc:`PyErr_Occurred` can be used to check for this: it returns a borrowed +reference to the exception type object when an exception has occurred, and +*NULL* otherwise. There are a number of functions to set the exception state: +:cfunc:`PyErr_SetString` is the most common (though not the most general) +function to set the exception state, and :cfunc:`PyErr_Clear` clears the +exception state. + +The full exception state consists of three objects (all of which can be +*NULL*): the exception type, the corresponding exception value, and the +traceback. These have the same meanings as the Python result of +``sys.exc_info()``; however, they are not the same: the Python objects represent +the last exception being handled by a Python :keyword:`try` ... +:keyword:`except` statement, while the C level exception state only exists while +an exception is being passed on between C functions until it reaches the Python +bytecode interpreter's main loop, which takes care of transferring it to +``sys.exc_info()`` and friends. + +.. index:: single: exc_info() (in module sys) + +Note that starting with Python 1.5, the preferred, thread-safe way to access the +exception state from Python code is to call the function :func:`sys.exc_info`, +which returns the per-thread exception state for Python code. Also, the +semantics of both ways to access the exception state have changed so that a +function which catches an exception will save and restore its thread's exception +state so as to preserve the exception state of its caller. This prevents common +bugs in exception handling code caused by an innocent-looking function +overwriting the exception being handled; it also reduces the often unwanted +lifetime extension for objects that are referenced by the stack frames in the +traceback. + +As a general principle, a function that calls another function to perform some +task should check whether the called function raised an exception, and if so, +pass the exception state on to its caller. It should discard any object +references that it owns, and return an error indicator, but it should *not* set +another exception --- that would overwrite the exception that was just raised, +and lose important information about the exact cause of the error. + +.. index:: single: sum_sequence() + +A simple example of detecting exceptions and passing them on is shown in the +:cfunc:`sum_sequence` example above. It so happens that that example doesn't +need to clean up any owned references when it detects an error. The following +example function shows some error cleanup. First, to remind you why you like +Python, we show the equivalent Python code:: + + def incr_item(dict, key): + try: + item = dict[key] + except KeyError: + item = 0 + dict[key] = item + 1 + +.. index:: single: incr_item() + +Here is the corresponding C code, in all its glory:: + + int + incr_item(PyObject *dict, PyObject *key) + { + /* Objects all initialized to NULL for Py_XDECREF */ + PyObject *item = NULL, *const_one = NULL, *incremented_item = NULL; + int rv = -1; /* Return value initialized to -1 (failure) */ + + item = PyObject_GetItem(dict, key); + if (item == NULL) { + /* Handle KeyError only: */ + if (!PyErr_ExceptionMatches(PyExc_KeyError)) + goto error; + + /* Clear the error and use zero: */ + PyErr_Clear(); + item = PyInt_FromLong(0L); + if (item == NULL) + goto error; + } + const_one = PyInt_FromLong(1L); + if (const_one == NULL) + goto error; + + incremented_item = PyNumber_Add(item, const_one); + if (incremented_item == NULL) + goto error; + + if (PyObject_SetItem(dict, key, incremented_item) < 0) + goto error; + rv = 0; /* Success */ + /* Continue with cleanup code */ + + error: + /* Cleanup code, shared by success and failure path */ + + /* Use Py_XDECREF() to ignore NULL references */ + Py_XDECREF(item); + Py_XDECREF(const_one); + Py_XDECREF(incremented_item); + + return rv; /* -1 for error, 0 for success */ + } + +.. index:: single: incr_item() + +.. index:: + single: PyErr_ExceptionMatches() + single: PyErr_Clear() + single: Py_XDECREF() + +This example represents an endorsed use of the :keyword:`goto` statement in C! +It illustrates the use of :cfunc:`PyErr_ExceptionMatches` and +:cfunc:`PyErr_Clear` to handle specific exceptions, and the use of +:cfunc:`Py_XDECREF` to dispose of owned references that may be *NULL* (note the +``'X'`` in the name; :cfunc:`Py_DECREF` would crash when confronted with a +*NULL* reference). It is important that the variables used to hold owned +references are initialized to *NULL* for this to work; likewise, the proposed +return value is initialized to ``-1`` (failure) and only set to success after +the final call made is successful. + + +.. _api-embedding: + +Embedding Python +================ + +The one important task that only embedders (as opposed to extension writers) of +the Python interpreter have to worry about is the initialization, and possibly +the finalization, of the Python interpreter. Most functionality of the +interpreter can only be used after the interpreter has been initialized. + +.. index:: + single: Py_Initialize() + module: __builtin__ + module: __main__ + module: sys + module: exceptions + triple: module; search; path + single: path (in module sys) + +The basic initialization function is :cfunc:`Py_Initialize`. This initializes +the table of loaded modules, and creates the fundamental modules +:mod:`__builtin__`, :mod:`__main__`, :mod:`sys`, and :mod:`exceptions`. It also +initializes the module search path (``sys.path``). + +.. index:: single: PySys_SetArgv() + +:cfunc:`Py_Initialize` does not set the "script argument list" (``sys.argv``). +If this variable is needed by Python code that will be executed later, it must +be set explicitly with a call to ``PySys_SetArgv(argc, argv)`` subsequent to +the call to :cfunc:`Py_Initialize`. + +On most systems (in particular, on Unix and Windows, although the details are +slightly different), :cfunc:`Py_Initialize` calculates the module search path +based upon its best guess for the location of the standard Python interpreter +executable, assuming that the Python library is found in a fixed location +relative to the Python interpreter executable. In particular, it looks for a +directory named :file:`lib/python{X.Y}` relative to the parent directory +where the executable named :file:`python` is found on the shell command search +path (the environment variable :envvar:`PATH`). + +For instance, if the Python executable is found in +:file:`/usr/local/bin/python`, it will assume that the libraries are in +:file:`/usr/local/lib/python{X.Y}`. (In fact, this particular path is also +the "fallback" location, used when no executable file named :file:`python` is +found along :envvar:`PATH`.) The user can override this behavior by setting the +environment variable :envvar:`PYTHONHOME`, or insert additional directories in +front of the standard path by setting :envvar:`PYTHONPATH`. + +.. index:: + single: Py_SetProgramName() + single: Py_GetPath() + single: Py_GetPrefix() + single: Py_GetExecPrefix() + single: Py_GetProgramFullPath() + +The embedding application can steer the search by calling +``Py_SetProgramName(file)`` *before* calling :cfunc:`Py_Initialize`. Note that +:envvar:`PYTHONHOME` still overrides this and :envvar:`PYTHONPATH` is still +inserted in front of the standard path. An application that requires total +control has to provide its own implementation of :cfunc:`Py_GetPath`, +:cfunc:`Py_GetPrefix`, :cfunc:`Py_GetExecPrefix`, and +:cfunc:`Py_GetProgramFullPath` (all defined in :file:`Modules/getpath.c`). + +.. index:: single: Py_IsInitialized() + +Sometimes, it is desirable to "uninitialize" Python. For instance, the +application may want to start over (make another call to +:cfunc:`Py_Initialize`) or the application is simply done with its use of +Python and wants to free memory allocated by Python. This can be accomplished +by calling :cfunc:`Py_Finalize`. The function :cfunc:`Py_IsInitialized` returns +true if Python is currently in the initialized state. More information about +these functions is given in a later chapter. Notice that :cfunc:`Py_Finalize` +does *not* free all memory allocated by the Python interpreter, e.g. memory +allocated by extension modules currently cannot be released. + + +.. _api-debugging: + +Debugging Builds +================ + +Python can be built with several macros to enable extra checks of the +interpreter and extension modules. These checks tend to add a large amount of +overhead to the runtime so they are not enabled by default. + +A full list of the various types of debugging builds is in the file +:file:`Misc/SpecialBuilds.txt` in the Python source distribution. Builds are +available that support tracing of reference counts, debugging the memory +allocator, or low-level profiling of the main interpreter loop. Only the most +frequently-used builds will be described in the remainder of this section. + +Compiling the interpreter with the :cmacro:`Py_DEBUG` macro defined produces +what is generally meant by "a debug build" of Python. :cmacro:`Py_DEBUG` is +enabled in the Unix build by adding :option:`--with-pydebug` to the +:file:`configure` command. It is also implied by the presence of the +not-Python-specific :cmacro:`_DEBUG` macro. When :cmacro:`Py_DEBUG` is enabled +in the Unix build, compiler optimization is disabled. + +In addition to the reference count debugging described below, the following +extra checks are performed: + +* Extra checks are added to the object allocator. + +* Extra checks are added to the parser and compiler. + +* Downcasts from wide types to narrow types are checked for loss of information. + +* A number of assertions are added to the dictionary and set implementations. + In addition, the set object acquires a :meth:`test_c_api` method. + +* Sanity checks of the input arguments are added to frame creation. + +* The storage for long ints is initialized with a known invalid pattern to catch + reference to uninitialized digits. + +* Low-level tracing and extra exception checking are added to the runtime + virtual machine. + +* Extra checks are added to the memory arena implementation. + +* Extra debugging is added to the thread module. + +There may be additional checks not mentioned here. + +Defining :cmacro:`Py_TRACE_REFS` enables reference tracing. When defined, a +circular doubly linked list of active objects is maintained by adding two extra +fields to every :ctype:`PyObject`. Total allocations are tracked as well. Upon +exit, all existing references are printed. (In interactive mode this happens +after every statement run by the interpreter.) Implied by :cmacro:`Py_DEBUG`. + +Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution +for more detailed information. + diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst new file mode 100644 index 0000000..1dcb115 --- /dev/null +++ b/Doc/c-api/memory.rst @@ -0,0 +1,207 @@ +.. highlightlang:: c + + +.. _memory: + +***************** +Memory Management +***************** + +.. sectionauthor:: Vladimir Marangozov + + + +.. _memoryoverview: + +Overview +======== + +Memory management in Python involves a private heap containing all Python +objects and data structures. The management of this private heap is ensured +internally by the *Python memory manager*. The Python memory manager has +different components which deal with various dynamic storage management aspects, +like sharing, segmentation, preallocation or caching. + +At the lowest level, a raw memory allocator ensures that there is enough room in +the private heap for storing all Python-related data by interacting with the +memory manager of the operating system. On top of the raw memory allocator, +several object-specific allocators operate on the same heap and implement +distinct memory management policies adapted to the peculiarities of every object +type. For example, integer objects are managed differently within the heap than +strings, tuples or dictionaries because integers imply different storage +requirements and speed/space tradeoffs. The Python memory manager thus delegates +some of the work to the object-specific allocators, but ensures that the latter +operate within the bounds of the private heap. + +It is important to understand that the management of the Python heap is +performed by the interpreter itself and that the user has no control over it, +even if she regularly manipulates object pointers to memory blocks inside that +heap. The allocation of heap space for Python objects and other internal +buffers is performed on demand by the Python memory manager through the Python/C +API functions listed in this document. + +.. index:: + single: malloc() + single: calloc() + single: realloc() + single: free() + +To avoid memory corruption, extension writers should never try to operate on +Python objects with the functions exported by the C library: :cfunc:`malloc`, +:cfunc:`calloc`, :cfunc:`realloc` and :cfunc:`free`. This will result in mixed +calls between the C allocator and the Python memory manager with fatal +consequences, because they implement different algorithms and operate on +different heaps. However, one may safely allocate and release memory blocks +with the C library allocator for individual purposes, as shown in the following +example:: + + PyObject *res; + char *buf = (char *) malloc(BUFSIZ); /* for I/O */ + + if (buf == NULL) + return PyErr_NoMemory(); + ...Do some I/O operation involving buf... + res = PyString_FromString(buf); + free(buf); /* malloc'ed */ + return res; + +In this example, the memory request for the I/O buffer is handled by the C +library allocator. The Python memory manager is involved only in the allocation +of the string object returned as a result. + +In most situations, however, it is recommended to allocate memory from the +Python heap specifically because the latter is under control of the Python +memory manager. For example, this is required when the interpreter is extended +with new object types written in C. Another reason for using the Python heap is +the desire to *inform* the Python memory manager about the memory needs of the +extension module. Even when the requested memory is used exclusively for +internal, highly-specific purposes, delegating all memory requests to the Python +memory manager causes the interpreter to have a more accurate image of its +memory footprint as a whole. Consequently, under certain circumstances, the +Python memory manager may or may not trigger appropriate actions, like garbage +collection, memory compaction or other preventive procedures. Note that by using +the C library allocator as shown in the previous example, the allocated memory +for the I/O buffer escapes completely the Python memory manager. + + +.. _memoryinterface: + +Memory Interface +================ + +The following function sets, modeled after the ANSI C standard, but specifying +behavior when requesting zero bytes, are available for allocating and releasing +memory from the Python heap: + + +.. cfunction:: void* PyMem_Malloc(size_t n) + + Allocates *n* bytes and returns a pointer of type :ctype:`void\*` to the + allocated memory, or *NULL* if the request fails. Requesting zero bytes returns + a distinct non-*NULL* pointer if possible, as if :cfunc:`PyMem_Malloc(1)` had + been called instead. The memory will not have been initialized in any way. + + +.. cfunction:: void* PyMem_Realloc(void *p, size_t n) + + Resizes the memory block pointed to by *p* to *n* bytes. The contents will be + unchanged to the minimum of the old and the new sizes. If *p* is *NULL*, the + call is equivalent to :cfunc:`PyMem_Malloc(n)`; else if *n* is equal to zero, + the memory block is resized but is not freed, and the returned pointer is + non-*NULL*. Unless *p* is *NULL*, it must have been returned by a previous call + to :cfunc:`PyMem_Malloc` or :cfunc:`PyMem_Realloc`. If the request fails, + :cfunc:`PyMem_Realloc` returns *NULL* and *p* remains a valid pointer to the + previous memory area. + + +.. cfunction:: void PyMem_Free(void *p) + + Frees the memory block pointed to by *p*, which must have been returned by a + previous call to :cfunc:`PyMem_Malloc` or :cfunc:`PyMem_Realloc`. Otherwise, or + if :cfunc:`PyMem_Free(p)` has been called before, undefined behavior occurs. If + *p* is *NULL*, no operation is performed. + +The following type-oriented macros are provided for convenience. Note that +*TYPE* refers to any C type. + + +.. cfunction:: TYPE* PyMem_New(TYPE, size_t n) + + Same as :cfunc:`PyMem_Malloc`, but allocates ``(n * sizeof(TYPE))`` bytes of + memory. Returns a pointer cast to :ctype:`TYPE\*`. The memory will not have + been initialized in any way. + + +.. cfunction:: TYPE* PyMem_Resize(void *p, TYPE, size_t n) + + Same as :cfunc:`PyMem_Realloc`, but the memory block is resized to ``(n * + sizeof(TYPE))`` bytes. Returns a pointer cast to :ctype:`TYPE\*`. On return, + *p* will be a pointer to the new memory area, or *NULL* in the event of failure. + + +.. cfunction:: void PyMem_Del(void *p) + + Same as :cfunc:`PyMem_Free`. + +In addition, the following macro sets are provided for calling the Python memory +allocator directly, without involving the C API functions listed above. However, +note that their use does not preserve binary compatibility across Python +versions and is therefore deprecated in extension modules. + +:cfunc:`PyMem_MALLOC`, :cfunc:`PyMem_REALLOC`, :cfunc:`PyMem_FREE`. + +:cfunc:`PyMem_NEW`, :cfunc:`PyMem_RESIZE`, :cfunc:`PyMem_DEL`. + + +.. _memoryexamples: + +Examples +======== + +Here is the example from section :ref:`memoryoverview`, rewritten so that the +I/O buffer is allocated from the Python heap by using the first function set:: + + PyObject *res; + char *buf = (char *) PyMem_Malloc(BUFSIZ); /* for I/O */ + + if (buf == NULL) + return PyErr_NoMemory(); + /* ...Do some I/O operation involving buf... */ + res = PyString_FromString(buf); + PyMem_Free(buf); /* allocated with PyMem_Malloc */ + return res; + +The same code using the type-oriented function set:: + + PyObject *res; + char *buf = PyMem_New(char, BUFSIZ); /* for I/O */ + + if (buf == NULL) + return PyErr_NoMemory(); + /* ...Do some I/O operation involving buf... */ + res = PyString_FromString(buf); + PyMem_Del(buf); /* allocated with PyMem_New */ + return res; + +Note that in the two examples above, the buffer is always manipulated via +functions belonging to the same set. Indeed, it is required to use the same +memory API family for a given memory block, so that the risk of mixing different +allocators is reduced to a minimum. The following code sequence contains two +errors, one of which is labeled as *fatal* because it mixes two different +allocators operating on different heaps. :: + + char *buf1 = PyMem_New(char, BUFSIZ); + char *buf2 = (char *) malloc(BUFSIZ); + char *buf3 = (char *) PyMem_Malloc(BUFSIZ); + ... + PyMem_Del(buf3); /* Wrong -- should be PyMem_Free() */ + free(buf2); /* Right -- allocated via malloc() */ + free(buf1); /* Fatal -- should be PyMem_Del() */ + +In addition to the functions aimed at handling raw memory blocks from the Python +heap, objects in Python are allocated and released with :cfunc:`PyObject_New`, +:cfunc:`PyObject_NewVar` and :cfunc:`PyObject_Del`. + +These will be explained in the next chapter on defining and implementing new +object types in C. + diff --git a/Doc/c-api/newtypes.rst b/Doc/c-api/newtypes.rst new file mode 100644 index 0000000..5933f99 --- /dev/null +++ b/Doc/c-api/newtypes.rst @@ -0,0 +1,1740 @@ +.. highlightlang:: c + + +.. _newtypes: + +***************************** +Object Implementation Support +***************************** + +This chapter describes the functions, types, and macros used when defining new +object types. + + +.. _allocating-objects: + +Allocating Objects on the Heap +============================== + + +.. cfunction:: PyObject* _PyObject_New(PyTypeObject *type) + + +.. cfunction:: PyVarObject* _PyObject_NewVar(PyTypeObject *type, Py_ssize_t size) + + +.. cfunction:: void _PyObject_Del(PyObject *op) + + +.. cfunction:: PyObject* PyObject_Init(PyObject *op, PyTypeObject *type) + + Initialize a newly-allocated object *op* with its type and initial reference. + Returns the initialized object. If *type* indicates that the object + participates in the cyclic garbage detector, it is added to the detector's set + of observed objects. Other fields of the object are not affected. + + +.. cfunction:: PyVarObject* PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size) + + This does everything :cfunc:`PyObject_Init` does, and also initializes the + length information for a variable-size object. + + +.. cfunction:: TYPE* PyObject_New(TYPE, PyTypeObject *type) + + Allocate a new Python object using the C structure type *TYPE* and the Python + type object *type*. Fields not defined by the Python object header are not + initialized; the object's reference count will be one. The size of the memory + allocation is determined from the :attr:`tp_basicsize` field of the type object. + + +.. cfunction:: TYPE* PyObject_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size) + + Allocate a new Python object using the C structure type *TYPE* and the Python + type object *type*. Fields not defined by the Python object header are not + initialized. The allocated memory allows for the *TYPE* structure plus *size* + fields of the size given by the :attr:`tp_itemsize` field of *type*. This is + useful for implementing objects like tuples, which are able to determine their + size at construction time. Embedding the array of fields into the same + allocation decreases the number of allocations, improving the memory management + efficiency. + + +.. cfunction:: void PyObject_Del(PyObject *op) + + Releases memory allocated to an object using :cfunc:`PyObject_New` or + :cfunc:`PyObject_NewVar`. This is normally called from the :attr:`tp_dealloc` + handler specified in the object's type. The fields of the object should not be + accessed after this call as the memory is no longer a valid Python object. + + +.. cfunction:: PyObject* Py_InitModule(char *name, PyMethodDef *methods) + + Create a new module object based on a name and table of functions, returning the + new module object. + + .. versionchanged:: 2.3 + Older versions of Python did not support *NULL* as the value for the *methods* + argument. + + +.. cfunction:: PyObject* Py_InitModule3(char *name, PyMethodDef *methods, char *doc) + + Create a new module object based on a name and table of functions, returning the + new module object. If *doc* is non-*NULL*, it will be used to define the + docstring for the module. + + .. versionchanged:: 2.3 + Older versions of Python did not support *NULL* as the value for the *methods* + argument. + + +.. cfunction:: PyObject* Py_InitModule4(char *name, PyMethodDef *methods, char *doc, PyObject *self, int apiver) + + Create a new module object based on a name and table of functions, returning the + new module object. If *doc* is non-*NULL*, it will be used to define the + docstring for the module. If *self* is non-*NULL*, it will passed to the + functions of the module as their (otherwise *NULL*) first parameter. (This was + added as an experimental feature, and there are no known uses in the current + version of Python.) For *apiver*, the only value which should be passed is + defined by the constant :const:`PYTHON_API_VERSION`. + + .. note:: + + Most uses of this function should probably be using the :cfunc:`Py_InitModule3` + instead; only use this if you are sure you need it. + + .. versionchanged:: 2.3 + Older versions of Python did not support *NULL* as the value for the *methods* + argument. + + +.. cvar:: PyObject _Py_NoneStruct + + Object which is visible in Python as ``None``. This should only be accessed + using the ``Py_None`` macro, which evaluates to a pointer to this object. + + +.. _common-structs: + +Common Object Structures +======================== + +There are a large number of structures which are used in the definition of +object types for Python. This section describes these structures and how they +are used. + +All Python objects ultimately share a small number of fields at the beginning of +the object's representation in memory. These are represented by the +:ctype:`PyObject` and :ctype:`PyVarObject` types, which are defined, in turn, by +the expansions of some macros also used, whether directly or indirectly, in the +definition of all other Python objects. + + +.. ctype:: PyObject + + All object types are extensions of this type. This is a type which contains the + information Python needs to treat a pointer to an object as an object. In a + normal "release" build, it contains only the objects reference count and a + pointer to the corresponding type object. It corresponds to the fields defined + by the expansion of the ``PyObject_HEAD`` macro. + + +.. ctype:: PyVarObject + + This is an extension of :ctype:`PyObject` that adds the :attr:`ob_size` field. + This is only used for objects that have some notion of *length*. This type does + not often appear in the Python/C API. It corresponds to the fields defined by + the expansion of the ``PyObject_VAR_HEAD`` macro. + +These macros are used in the definition of :ctype:`PyObject` and +:ctype:`PyVarObject`: + + +.. cmacro:: PyObject_HEAD + + This is a macro which expands to the declarations of the fields of the + :ctype:`PyObject` type; it is used when declaring new types which represent + objects without a varying length. The specific fields it expands to depend on + the definition of :cmacro:`Py_TRACE_REFS`. By default, that macro is not + defined, and :cmacro:`PyObject_HEAD` expands to:: + + Py_ssize_t ob_refcnt; + PyTypeObject *ob_type; + + When :cmacro:`Py_TRACE_REFS` is defined, it expands to:: + + PyObject *_ob_next, *_ob_prev; + Py_ssize_t ob_refcnt; + PyTypeObject *ob_type; + + +.. cmacro:: PyObject_VAR_HEAD + + This is a macro which expands to the declarations of the fields of the + :ctype:`PyVarObject` type; it is used when declaring new types which represent + objects with a length that varies from instance to instance. This macro always + expands to:: + + PyObject_HEAD + Py_ssize_t ob_size; + + Note that :cmacro:`PyObject_HEAD` is part of the expansion, and that its own + expansion varies depending on the definition of :cmacro:`Py_TRACE_REFS`. + +PyObject_HEAD_INIT + + +.. ctype:: PyCFunction + + Type of the functions used to implement most Python callables in C. Functions of + this type take two :ctype:`PyObject\*` parameters and return one such value. If + the return value is *NULL*, an exception shall have been set. If not *NULL*, + the return value is interpreted as the return value of the function as exposed + in Python. The function must return a new reference. + + +.. ctype:: PyMethodDef + + Structure used to describe a method of an extension type. This structure has + four fields: + + +------------------+-------------+-------------------------------+ + | Field | C Type | Meaning | + +==================+=============+===============================+ + | :attr:`ml_name` | char \* | name of the method | + +------------------+-------------+-------------------------------+ + | :attr:`ml_meth` | PyCFunction | pointer to the C | + | | | implementation | + +------------------+-------------+-------------------------------+ + | :attr:`ml_flags` | int | flag bits indicating how the | + | | | call should be constructed | + +------------------+-------------+-------------------------------+ + | :attr:`ml_doc` | char \* | points to the contents of the | + | | | docstring | + +------------------+-------------+-------------------------------+ + +The :attr:`ml_meth` is a C function pointer. The functions may be of different +types, but they always return :ctype:`PyObject\*`. If the function is not of +the :ctype:`PyCFunction`, the compiler will require a cast in the method table. +Even though :ctype:`PyCFunction` defines the first parameter as +:ctype:`PyObject\*`, it is common that the method implementation uses a the +specific C type of the *self* object. + +The :attr:`ml_flags` field is a bitfield which can include the following flags. +The individual flags indicate either a calling convention or a binding +convention. Of the calling convention flags, only :const:`METH_VARARGS` and +:const:`METH_KEYWORDS` can be combined (but note that :const:`METH_KEYWORDS` +alone is equivalent to ``METH_VARARGS | METH_KEYWORDS``). Any of the calling +convention flags can be combined with a binding flag. + + +.. data:: METH_VARARGS + + This is the typical calling convention, where the methods have the type + :ctype:`PyCFunction`. The function expects two :ctype:`PyObject\*` values. The + first one is the *self* object for methods; for module functions, it has the + value given to :cfunc:`Py_InitModule4` (or *NULL* if :cfunc:`Py_InitModule` was + used). The second parameter (often called *args*) is a tuple object + representing all arguments. This parameter is typically processed using + :cfunc:`PyArg_ParseTuple` or :cfunc:`PyArg_UnpackTuple`. + + +.. data:: METH_KEYWORDS + + Methods with these flags must be of type :ctype:`PyCFunctionWithKeywords`. The + function expects three parameters: *self*, *args*, and a dictionary of all the + keyword arguments. The flag is typically combined with :const:`METH_VARARGS`, + and the parameters are typically processed using + :cfunc:`PyArg_ParseTupleAndKeywords`. + + +.. data:: METH_NOARGS + + Methods without parameters don't need to check whether arguments are given if + they are listed with the :const:`METH_NOARGS` flag. They need to be of type + :ctype:`PyCFunction`. When used with object methods, the first parameter is + typically named ``self`` and will hold a reference to the object instance. In + all cases the second parameter will be *NULL*. + + +.. data:: METH_O + + Methods with a single object argument can be listed with the :const:`METH_O` + flag, instead of invoking :cfunc:`PyArg_ParseTuple` with a ``"O"`` argument. + They have the type :ctype:`PyCFunction`, with the *self* parameter, and a + :ctype:`PyObject\*` parameter representing the single argument. + + +.. data:: METH_OLDARGS + + This calling convention is deprecated. The method must be of type + :ctype:`PyCFunction`. The second argument is *NULL* if no arguments are given, + a single object if exactly one argument is given, and a tuple of objects if more + than one argument is given. There is no way for a function using this + convention to distinguish between a call with multiple arguments and a call with + a tuple as the only argument. + +These two constants are not used to indicate the calling convention but the +binding when use with methods of classes. These may not be used for functions +defined for modules. At most one of these flags may be set for any given +method. + + +.. data:: METH_CLASS + + .. index:: builtin: classmethod + + The method will be passed the type object as the first parameter rather than an + instance of the type. This is used to create *class methods*, similar to what + is created when using the :func:`classmethod` built-in function. + + .. versionadded:: 2.3 + + +.. data:: METH_STATIC + + .. index:: builtin: staticmethod + + The method will be passed *NULL* as the first parameter rather than an instance + of the type. This is used to create *static methods*, similar to what is + created when using the :func:`staticmethod` built-in function. + + .. versionadded:: 2.3 + +One other constant controls whether a method is loaded in place of another +definition with the same method name. + + +.. data:: METH_COEXIST + + The method will be loaded in place of existing definitions. Without + *METH_COEXIST*, the default is to skip repeated definitions. Since slot + wrappers are loaded before the method table, the existence of a *sq_contains* + slot, for example, would generate a wrapped method named :meth:`__contains__` + and preclude the loading of a corresponding PyCFunction with the same name. + With the flag defined, the PyCFunction will be loaded in place of the wrapper + object and will co-exist with the slot. This is helpful because calls to + PyCFunctions are optimized more than wrapper object calls. + + .. versionadded:: 2.4 + + +.. cfunction:: PyObject* Py_FindMethod(PyMethodDef table[], PyObject *ob, char *name) + + Return a bound method object for an extension type implemented in C. This can + be useful in the implementation of a :attr:`tp_getattro` or :attr:`tp_getattr` + handler that does not use the :cfunc:`PyObject_GenericGetAttr` function. + + +.. _type-structs: + +Type Objects +============ + +Perhaps one of the most important structures of the Python object system is the +structure that defines a new type: the :ctype:`PyTypeObject` structure. Type +objects can be handled using any of the :cfunc:`PyObject_\*` or +:cfunc:`PyType_\*` functions, but do not offer much that's interesting to most +Python applications. These objects are fundamental to how objects behave, so +they are very important to the interpreter itself and to any extension module +that implements new types. + +Type objects are fairly large compared to most of the standard types. The reason +for the size is that each type object stores a large number of values, mostly C +function pointers, each of which implements a small part of the type's +functionality. The fields of the type object are examined in detail in this +section. The fields will be described in the order in which they occur in the +structure. + +Typedefs: unaryfunc, binaryfunc, ternaryfunc, inquiry, coercion, intargfunc, +intintargfunc, intobjargproc, intintobjargproc, objobjargproc, destructor, +freefunc, printfunc, getattrfunc, getattrofunc, setattrfunc, setattrofunc, +cmpfunc, reprfunc, hashfunc + +The structure definition for :ctype:`PyTypeObject` can be found in +:file:`Include/object.h`. For convenience of reference, this repeats the +definition found there: + +.. literalinclude:: ../includes/typestruct.h + + +The type object structure extends the :ctype:`PyVarObject` structure. The +:attr:`ob_size` field is used for dynamic types (created by :func:`type_new`, +usually called from a class statement). Note that :cdata:`PyType_Type` (the +metatype) initializes :attr:`tp_itemsize`, which means that its instances (i.e. +type objects) *must* have the :attr:`ob_size` field. + + +.. cmember:: PyObject* PyObject._ob_next + PyObject* PyObject._ob_prev + + These fields are only present when the macro ``Py_TRACE_REFS`` is defined. + Their initialization to *NULL* is taken care of by the ``PyObject_HEAD_INIT`` + macro. For statically allocated objects, these fields always remain *NULL*. + For dynamically allocated objects, these two fields are used to link the object + into a doubly-linked list of *all* live objects on the heap. This could be used + for various debugging purposes; currently the only use is to print the objects + that are still alive at the end of a run when the environment variable + :envvar:`PYTHONDUMPREFS` is set. + + These fields are not inherited by subtypes. + + +.. cmember:: Py_ssize_t PyObject.ob_refcnt + + This is the type object's reference count, initialized to ``1`` by the + ``PyObject_HEAD_INIT`` macro. Note that for statically allocated type objects, + the type's instances (objects whose :attr:`ob_type` points back to the type) do + *not* count as references. But for dynamically allocated type objects, the + instances *do* count as references. + + This field is not inherited by subtypes. + + +.. cmember:: PyTypeObject* PyObject.ob_type + + This is the type's type, in other words its metatype. It is initialized by the + argument to the ``PyObject_HEAD_INIT`` macro, and its value should normally be + ``&PyType_Type``. However, for dynamically loadable extension modules that must + be usable on Windows (at least), the compiler complains that this is not a valid + initializer. Therefore, the convention is to pass *NULL* to the + ``PyObject_HEAD_INIT`` macro and to initialize this field explicitly at the + start of the module's initialization function, before doing anything else. This + is typically done like this:: + + Foo_Type.ob_type = &PyType_Type; + + This should be done before any instances of the type are created. + :cfunc:`PyType_Ready` checks if :attr:`ob_type` is *NULL*, and if so, + initializes it: in Python 2.2, it is set to ``&PyType_Type``; in Python 2.2.1 + and later it is initialized to the :attr:`ob_type` field of the base class. + :cfunc:`PyType_Ready` will not change this field if it is non-zero. + + In Python 2.2, this field is not inherited by subtypes. In 2.2.1, and in 2.3 + and beyond, it is inherited by subtypes. + + +.. cmember:: Py_ssize_t PyVarObject.ob_size + + For statically allocated type objects, this should be initialized to zero. For + dynamically allocated type objects, this field has a special internal meaning. + + This field is not inherited by subtypes. + + +.. cmember:: char* PyTypeObject.tp_name + + Pointer to a NUL-terminated string containing the name of the type. For types + that are accessible as module globals, the string should be the full module + name, followed by a dot, followed by the type name; for built-in types, it + should be just the type name. If the module is a submodule of a package, the + full package name is part of the full module name. For example, a type named + :class:`T` defined in module :mod:`M` in subpackage :mod:`Q` in package :mod:`P` + should have the :attr:`tp_name` initializer ``"P.Q.M.T"``. + + For dynamically allocated type objects, this should just be the type name, and + the module name explicitly stored in the type dict as the value for key + ``'__module__'``. + + For statically allocated type objects, the tp_name field should contain a dot. + Everything before the last dot is made accessible as the :attr:`__module__` + attribute, and everything after the last dot is made accessible as the + :attr:`__name__` attribute. + + If no dot is present, the entire :attr:`tp_name` field is made accessible as the + :attr:`__name__` attribute, and the :attr:`__module__` attribute is undefined + (unless explicitly set in the dictionary, as explained above). This means your + type will be impossible to pickle. + + This field is not inherited by subtypes. + + +.. cmember:: Py_ssize_t PyTypeObject.tp_basicsize + Py_ssize_t PyTypeObject.tp_itemsize + + These fields allow calculating the size in bytes of instances of the type. + + There are two kinds of types: types with fixed-length instances have a zero + :attr:`tp_itemsize` field, types with variable-length instances have a non-zero + :attr:`tp_itemsize` field. For a type with fixed-length instances, all + instances have the same size, given in :attr:`tp_basicsize`. + + For a type with variable-length instances, the instances must have an + :attr:`ob_size` field, and the instance size is :attr:`tp_basicsize` plus N + times :attr:`tp_itemsize`, where N is the "length" of the object. The value of + N is typically stored in the instance's :attr:`ob_size` field. There are + exceptions: for example, long ints use a negative :attr:`ob_size` to indicate a + negative number, and N is ``abs(ob_size)`` there. Also, the presence of an + :attr:`ob_size` field in the instance layout doesn't mean that the instance + structure is variable-length (for example, the structure for the list type has + fixed-length instances, yet those instances have a meaningful :attr:`ob_size` + field). + + The basic size includes the fields in the instance declared by the macro + :cmacro:`PyObject_HEAD` or :cmacro:`PyObject_VAR_HEAD` (whichever is used to + declare the instance struct) and this in turn includes the :attr:`_ob_prev` and + :attr:`_ob_next` fields if they are present. This means that the only correct + way to get an initializer for the :attr:`tp_basicsize` is to use the + :keyword:`sizeof` operator on the struct used to declare the instance layout. + The basic size does not include the GC header size (this is new in Python 2.2; + in 2.1 and 2.0, the GC header size was included in :attr:`tp_basicsize`). + + These fields are inherited separately by subtypes. If the base type has a + non-zero :attr:`tp_itemsize`, it is generally not safe to set + :attr:`tp_itemsize` to a different non-zero value in a subtype (though this + depends on the implementation of the base type). + + A note about alignment: if the variable items require a particular alignment, + this should be taken care of by the value of :attr:`tp_basicsize`. Example: + suppose a type implements an array of ``double``. :attr:`tp_itemsize` is + ``sizeof(double)``. It is the programmer's responsibility that + :attr:`tp_basicsize` is a multiple of ``sizeof(double)`` (assuming this is the + alignment requirement for ``double``). + + +.. cmember:: destructor PyTypeObject.tp_dealloc + + A pointer to the instance destructor function. This function must be defined + unless the type guarantees that its instances will never be deallocated (as is + the case for the singletons ``None`` and ``Ellipsis``). + + The destructor function is called by the :cfunc:`Py_DECREF` and + :cfunc:`Py_XDECREF` macros when the new reference count is zero. At this point, + the instance is still in existence, but there are no references to it. The + destructor function should free all references which the instance owns, free all + memory buffers owned by the instance (using the freeing function corresponding + to the allocation function used to allocate the buffer), and finally (as its + last action) call the type's :attr:`tp_free` function. If the type is not + subtypable (doesn't have the :const:`Py_TPFLAGS_BASETYPE` flag bit set), it is + permissible to call the object deallocator directly instead of via + :attr:`tp_free`. The object deallocator should be the one used to allocate the + instance; this is normally :cfunc:`PyObject_Del` if the instance was allocated + using :cfunc:`PyObject_New` or :cfunc:`PyObject_VarNew`, or + :cfunc:`PyObject_GC_Del` if the instance was allocated using + :cfunc:`PyObject_GC_New` or :cfunc:`PyObject_GC_VarNew`. + + This field is inherited by subtypes. + + +.. cmember:: printfunc PyTypeObject.tp_print + + An optional pointer to the instance print function. + + The print function is only called when the instance is printed to a *real* file; + when it is printed to a pseudo-file (like a :class:`StringIO` instance), the + instance's :attr:`tp_repr` or :attr:`tp_str` function is called to convert it to + a string. These are also called when the type's :attr:`tp_print` field is + *NULL*. A type should never implement :attr:`tp_print` in a way that produces + different output than :attr:`tp_repr` or :attr:`tp_str` would. + + The print function is called with the same signature as :cfunc:`PyObject_Print`: + ``int tp_print(PyObject *self, FILE *file, int flags)``. The *self* argument is + the instance to be printed. The *file* argument is the stdio file to which it + is to be printed. The *flags* argument is composed of flag bits. The only flag + bit currently defined is :const:`Py_PRINT_RAW`. When the :const:`Py_PRINT_RAW` + flag bit is set, the instance should be printed the same way as :attr:`tp_str` + would format it; when the :const:`Py_PRINT_RAW` flag bit is clear, the instance + should be printed the same was as :attr:`tp_repr` would format it. It should + return ``-1`` and set an exception condition when an error occurred during the + comparison. + + It is possible that the :attr:`tp_print` field will be deprecated. In any case, + it is recommended not to define :attr:`tp_print`, but instead to rely on + :attr:`tp_repr` and :attr:`tp_str` for printing. + + This field is inherited by subtypes. + + +.. cmember:: getattrfunc PyTypeObject.tp_getattr + + An optional pointer to the get-attribute-string function. + + This field is deprecated. When it is defined, it should point to a function + that acts the same as the :attr:`tp_getattro` function, but taking a C string + instead of a Python string object to give the attribute name. The signature is + the same as for :cfunc:`PyObject_GetAttrString`. + + This field is inherited by subtypes together with :attr:`tp_getattro`: a subtype + inherits both :attr:`tp_getattr` and :attr:`tp_getattro` from its base type when + the subtype's :attr:`tp_getattr` and :attr:`tp_getattro` are both *NULL*. + + +.. cmember:: setattrfunc PyTypeObject.tp_setattr + + An optional pointer to the set-attribute-string function. + + This field is deprecated. When it is defined, it should point to a function + that acts the same as the :attr:`tp_setattro` function, but taking a C string + instead of a Python string object to give the attribute name. The signature is + the same as for :cfunc:`PyObject_SetAttrString`. + + This field is inherited by subtypes together with :attr:`tp_setattro`: a subtype + inherits both :attr:`tp_setattr` and :attr:`tp_setattro` from its base type when + the subtype's :attr:`tp_setattr` and :attr:`tp_setattro` are both *NULL*. + + +.. cmember:: cmpfunc PyTypeObject.tp_compare + + An optional pointer to the three-way comparison function. + + The signature is the same as for :cfunc:`PyObject_Compare`. The function should + return ``1`` if *self* greater than *other*, ``0`` if *self* is equal to + *other*, and ``-1`` if *self* less than *other*. It should return ``-1`` and + set an exception condition when an error occurred during the comparison. + + This field is inherited by subtypes together with :attr:`tp_richcompare` and + :attr:`tp_hash`: a subtypes inherits all three of :attr:`tp_compare`, + :attr:`tp_richcompare`, and :attr:`tp_hash` when the subtype's + :attr:`tp_compare`, :attr:`tp_richcompare`, and :attr:`tp_hash` are all *NULL*. + + +.. cmember:: reprfunc PyTypeObject.tp_repr + + .. index:: builtin: repr + + An optional pointer to a function that implements the built-in function + :func:`repr`. + + The signature is the same as for :cfunc:`PyObject_Repr`; it must return a string + or a Unicode object. Ideally, this function should return a string that, when + passed to :func:`eval`, given a suitable environment, returns an object with the + same value. If this is not feasible, it should return a string starting with + ``'<'`` and ending with ``'>'`` from which both the type and the value of the + object can be deduced. + + When this field is not set, a string of the form ``<%s object at %p>`` is + returned, where ``%s`` is replaced by the type name, and ``%p`` by the object's + memory address. + + This field is inherited by subtypes. + +.. cmember:: PyNumberMethods *tp_as_number; + + XXX + +.. cmember:: PySequenceMethods *tp_as_sequence; + + XXX + +.. cmember:: PyMappingMethods *tp_as_mapping; + + XXX + + +.. cmember:: hashfunc PyTypeObject.tp_hash + + .. index:: builtin: hash + + An optional pointer to a function that implements the built-in function + :func:`hash`. + + The signature is the same as for :cfunc:`PyObject_Hash`; it must return a C + long. The value ``-1`` should not be returned as a normal return value; when an + error occurs during the computation of the hash value, the function should set + an exception and return ``-1``. + + When this field is not set, two possibilities exist: if the :attr:`tp_compare` + and :attr:`tp_richcompare` fields are both *NULL*, a default hash value based on + the object's address is returned; otherwise, a :exc:`TypeError` is raised. + + This field is inherited by subtypes together with :attr:`tp_richcompare` and + :attr:`tp_compare`: a subtypes inherits all three of :attr:`tp_compare`, + :attr:`tp_richcompare`, and :attr:`tp_hash`, when the subtype's + :attr:`tp_compare`, :attr:`tp_richcompare` and :attr:`tp_hash` are all *NULL*. + + +.. cmember:: ternaryfunc PyTypeObject.tp_call + + An optional pointer to a function that implements calling the object. This + should be *NULL* if the object is not callable. The signature is the same as + for :cfunc:`PyObject_Call`. + + This field is inherited by subtypes. + + +.. cmember:: reprfunc PyTypeObject.tp_str + + An optional pointer to a function that implements the built-in operation + :func:`str`. (Note that :class:`str` is a type now, and :func:`str` calls the + constructor for that type. This constructor calls :cfunc:`PyObject_Str` to do + the actual work, and :cfunc:`PyObject_Str` will call this handler.) + + The signature is the same as for :cfunc:`PyObject_Str`; it must return a string + or a Unicode object. This function should return a "friendly" string + representation of the object, as this is the representation that will be used by + the print statement. + + When this field is not set, :cfunc:`PyObject_Repr` is called to return a string + representation. + + This field is inherited by subtypes. + + +.. cmember:: getattrofunc PyTypeObject.tp_getattro + + An optional pointer to the get-attribute function. + + The signature is the same as for :cfunc:`PyObject_GetAttr`. It is usually + convenient to set this field to :cfunc:`PyObject_GenericGetAttr`, which + implements the normal way of looking for object attributes. + + This field is inherited by subtypes together with :attr:`tp_getattr`: a subtype + inherits both :attr:`tp_getattr` and :attr:`tp_getattro` from its base type when + the subtype's :attr:`tp_getattr` and :attr:`tp_getattro` are both *NULL*. + + +.. cmember:: setattrofunc PyTypeObject.tp_setattro + + An optional pointer to the set-attribute function. + + The signature is the same as for :cfunc:`PyObject_SetAttr`. It is usually + convenient to set this field to :cfunc:`PyObject_GenericSetAttr`, which + implements the normal way of setting object attributes. + + This field is inherited by subtypes together with :attr:`tp_setattr`: a subtype + inherits both :attr:`tp_setattr` and :attr:`tp_setattro` from its base type when + the subtype's :attr:`tp_setattr` and :attr:`tp_setattro` are both *NULL*. + + +.. cmember:: PyBufferProcs* PyTypeObject.tp_as_buffer + + Pointer to an additional structure that contains fields relevant only to objects + which implement the buffer interface. These fields are documented in + :ref:`buffer-structs`. + + The :attr:`tp_as_buffer` field is not inherited, but the contained fields are + inherited individually. + + +.. cmember:: long PyTypeObject.tp_flags + + This field is a bit mask of various flags. Some flags indicate variant + semantics for certain situations; others are used to indicate that certain + fields in the type object (or in the extension structures referenced via + :attr:`tp_as_number`, :attr:`tp_as_sequence`, :attr:`tp_as_mapping`, and + :attr:`tp_as_buffer`) that were historically not always present are valid; if + such a flag bit is clear, the type fields it guards must not be accessed and + must be considered to have a zero or *NULL* value instead. + + Inheritance of this field is complicated. Most flag bits are inherited + individually, i.e. if the base type has a flag bit set, the subtype inherits + this flag bit. The flag bits that pertain to extension structures are strictly + inherited if the extension structure is inherited, i.e. the base type's value of + the flag bit is copied into the subtype together with a pointer to the extension + structure. The :const:`Py_TPFLAGS_HAVE_GC` flag bit is inherited together with + the :attr:`tp_traverse` and :attr:`tp_clear` fields, i.e. if the + :const:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the subtype and the + :attr:`tp_traverse` and :attr:`tp_clear` fields in the subtype exist (as + indicated by the :const:`Py_TPFLAGS_HAVE_RICHCOMPARE` flag bit) and have *NULL* + values. + + The following bit masks are currently defined; these can be or-ed together using + the ``|`` operator to form the value of the :attr:`tp_flags` field. The macro + :cfunc:`PyType_HasFeature` takes a type and a flags value, *tp* and *f*, and + checks whether ``tp->tp_flags & f`` is non-zero. + + + .. data:: Py_TPFLAGS_HAVE_GETCHARBUFFER + + If this bit is set, the :ctype:`PyBufferProcs` struct referenced by + :attr:`tp_as_buffer` has the :attr:`bf_getcharbuffer` field. + + + .. data:: Py_TPFLAGS_HAVE_SEQUENCE_IN + + If this bit is set, the :ctype:`PySequenceMethods` struct referenced by + :attr:`tp_as_sequence` has the :attr:`sq_contains` field. + + + .. data:: Py_TPFLAGS_GC + + This bit is obsolete. The bit it used to name is no longer in use. The symbol + is now defined as zero. + + + .. data:: Py_TPFLAGS_HAVE_INPLACEOPS + + If this bit is set, the :ctype:`PySequenceMethods` struct referenced by + :attr:`tp_as_sequence` and the :ctype:`PyNumberMethods` structure referenced by + :attr:`tp_as_number` contain the fields for in-place operators. In particular, + this means that the :ctype:`PyNumberMethods` structure has the fields + :attr:`nb_inplace_add`, :attr:`nb_inplace_subtract`, + :attr:`nb_inplace_multiply`, :attr:`nb_inplace_divide`, + :attr:`nb_inplace_remainder`, :attr:`nb_inplace_power`, + :attr:`nb_inplace_lshift`, :attr:`nb_inplace_rshift`, :attr:`nb_inplace_and`, + :attr:`nb_inplace_xor`, and :attr:`nb_inplace_or`; and the + :ctype:`PySequenceMethods` struct has the fields :attr:`sq_inplace_concat` and + :attr:`sq_inplace_repeat`. + + + .. data:: Py_TPFLAGS_CHECKTYPES + + If this bit is set, the binary and ternary operations in the + :ctype:`PyNumberMethods` structure referenced by :attr:`tp_as_number` accept + arguments of arbitrary object types, and do their own type conversions if + needed. If this bit is clear, those operations require that all arguments have + the current type as their type, and the caller is supposed to perform a coercion + operation first. This applies to :attr:`nb_add`, :attr:`nb_subtract`, + :attr:`nb_multiply`, :attr:`nb_divide`, :attr:`nb_remainder`, :attr:`nb_divmod`, + :attr:`nb_power`, :attr:`nb_lshift`, :attr:`nb_rshift`, :attr:`nb_and`, + :attr:`nb_xor`, and :attr:`nb_or`. + + + .. data:: Py_TPFLAGS_HAVE_RICHCOMPARE + + If this bit is set, the type object has the :attr:`tp_richcompare` field, as + well as the :attr:`tp_traverse` and the :attr:`tp_clear` fields. + + + .. data:: Py_TPFLAGS_HAVE_WEAKREFS + + If this bit is set, the :attr:`tp_weaklistoffset` field is defined. Instances + of a type are weakly referenceable if the type's :attr:`tp_weaklistoffset` field + has a value greater than zero. + + + .. data:: Py_TPFLAGS_HAVE_ITER + + If this bit is set, the type object has the :attr:`tp_iter` and + :attr:`tp_iternext` fields. + + + .. data:: Py_TPFLAGS_HAVE_CLASS + + If this bit is set, the type object has several new fields defined starting in + Python 2.2: :attr:`tp_methods`, :attr:`tp_members`, :attr:`tp_getset`, + :attr:`tp_base`, :attr:`tp_dict`, :attr:`tp_descr_get`, :attr:`tp_descr_set`, + :attr:`tp_dictoffset`, :attr:`tp_init`, :attr:`tp_alloc`, :attr:`tp_new`, + :attr:`tp_free`, :attr:`tp_is_gc`, :attr:`tp_bases`, :attr:`tp_mro`, + :attr:`tp_cache`, :attr:`tp_subclasses`, and :attr:`tp_weaklist`. + + + .. data:: Py_TPFLAGS_HEAPTYPE + + This bit is set when the type object itself is allocated on the heap. In this + case, the :attr:`ob_type` field of its instances is considered a reference to + the type, and the type object is INCREF'ed when a new instance is created, and + DECREF'ed when an instance is destroyed (this does not apply to instances of + subtypes; only the type referenced by the instance's ob_type gets INCREF'ed or + DECREF'ed). + + + .. data:: Py_TPFLAGS_BASETYPE + + This bit is set when the type can be used as the base type of another type. If + this bit is clear, the type cannot be subtyped (similar to a "final" class in + Java). + + + .. data:: Py_TPFLAGS_READY + + This bit is set when the type object has been fully initialized by + :cfunc:`PyType_Ready`. + + + .. data:: Py_TPFLAGS_READYING + + This bit is set while :cfunc:`PyType_Ready` is in the process of initializing + the type object. + + + .. data:: Py_TPFLAGS_HAVE_GC + + This bit is set when the object supports garbage collection. If this bit + is set, instances must be created using :cfunc:`PyObject_GC_New` and + destroyed using :cfunc:`PyObject_GC_Del`. More information in section + :ref:`supporting-cycle-detection`. This bit also implies that the + GC-related fields :attr:`tp_traverse` and :attr:`tp_clear` are present in + the type object; but those fields also exist when + :const:`Py_TPFLAGS_HAVE_GC` is clear but + :const:`Py_TPFLAGS_HAVE_RICHCOMPARE` is set. + + + .. data:: Py_TPFLAGS_DEFAULT + + This is a bitmask of all the bits that pertain to the existence of certain + fields in the type object and its extension structures. Currently, it includes + the following bits: :const:`Py_TPFLAGS_HAVE_GETCHARBUFFER`, + :const:`Py_TPFLAGS_HAVE_SEQUENCE_IN`, :const:`Py_TPFLAGS_HAVE_INPLACEOPS`, + :const:`Py_TPFLAGS_HAVE_RICHCOMPARE`, :const:`Py_TPFLAGS_HAVE_WEAKREFS`, + :const:`Py_TPFLAGS_HAVE_ITER`, and :const:`Py_TPFLAGS_HAVE_CLASS`. + + +.. cmember:: char* PyTypeObject.tp_doc + + An optional pointer to a NUL-terminated C string giving the docstring for this + type object. This is exposed as the :attr:`__doc__` attribute on the type and + instances of the type. + + This field is *not* inherited by subtypes. + +The following three fields only exist if the +:const:`Py_TPFLAGS_HAVE_RICHCOMPARE` flag bit is set. + + +.. cmember:: traverseproc PyTypeObject.tp_traverse + + An optional pointer to a traversal function for the garbage collector. This is + only used if the :const:`Py_TPFLAGS_HAVE_GC` flag bit is set. More information + about Python's garbage collection scheme can be found in section + :ref:`supporting-cycle-detection`. + + The :attr:`tp_traverse` pointer is used by the garbage collector to detect + reference cycles. A typical implementation of a :attr:`tp_traverse` function + simply calls :cfunc:`Py_VISIT` on each of the instance's members that are Python + objects. For exampe, this is function :cfunc:`local_traverse` from the + :mod:`thread` extension module:: + + static int + local_traverse(localobject *self, visitproc visit, void *arg) + { + Py_VISIT(self->args); + Py_VISIT(self->kw); + Py_VISIT(self->dict); + return 0; + } + + Note that :cfunc:`Py_VISIT` is called only on those members that can participate + in reference cycles. Although there is also a ``self->key`` member, it can only + be *NULL* or a Python string and therefore cannot be part of a reference cycle. + + On the other hand, even if you know a member can never be part of a cycle, as a + debugging aid you may want to visit it anyway just so the :mod:`gc` module's + :func:`get_referents` function will include it. + + Note that :cfunc:`Py_VISIT` requires the *visit* and *arg* parameters to + :cfunc:`local_traverse` to have these specific names; don't name them just + anything. + + This field is inherited by subtypes together with :attr:`tp_clear` and the + :const:`Py_TPFLAGS_HAVE_GC` flag bit: the flag bit, :attr:`tp_traverse`, and + :attr:`tp_clear` are all inherited from the base type if they are all zero in + the subtype *and* the subtype has the :const:`Py_TPFLAGS_HAVE_RICHCOMPARE` flag + bit set. + + +.. cmember:: inquiry PyTypeObject.tp_clear + + An optional pointer to a clear function for the garbage collector. This is only + used if the :const:`Py_TPFLAGS_HAVE_GC` flag bit is set. + + The :attr:`tp_clear` member function is used to break reference cycles in cyclic + garbage detected by the garbage collector. Taken together, all :attr:`tp_clear` + functions in the system must combine to break all reference cycles. This is + subtle, and if in any doubt supply a :attr:`tp_clear` function. For example, + the tuple type does not implement a :attr:`tp_clear` function, because it's + possible to prove that no reference cycle can be composed entirely of tuples. + Therefore the :attr:`tp_clear` functions of other types must be sufficient to + break any cycle containing a tuple. This isn't immediately obvious, and there's + rarely a good reason to avoid implementing :attr:`tp_clear`. + + Implementations of :attr:`tp_clear` should drop the instance's references to + those of its members that may be Python objects, and set its pointers to those + members to *NULL*, as in the following example:: + + static int + local_clear(localobject *self) + { + Py_CLEAR(self->key); + Py_CLEAR(self->args); + Py_CLEAR(self->kw); + Py_CLEAR(self->dict); + return 0; + } + + The :cfunc:`Py_CLEAR` macro should be used, because clearing references is + delicate: the reference to the contained object must not be decremented until + after the pointer to the contained object is set to *NULL*. This is because + decrementing the reference count may cause the contained object to become trash, + triggering a chain of reclamation activity that may include invoking arbitrary + Python code (due to finalizers, or weakref callbacks, associated with the + contained object). If it's possible for such code to reference *self* again, + it's important that the pointer to the contained object be *NULL* at that time, + so that *self* knows the contained object can no longer be used. The + :cfunc:`Py_CLEAR` macro performs the operations in a safe order. + + Because the goal of :attr:`tp_clear` functions is to break reference cycles, + it's not necessary to clear contained objects like Python strings or Python + integers, which can't participate in reference cycles. On the other hand, it may + be convenient to clear all contained Python objects, and write the type's + :attr:`tp_dealloc` function to invoke :attr:`tp_clear`. + + More information about Python's garbage collection scheme can be found in + section :ref:`supporting-cycle-detection`. + + This field is inherited by subtypes together with :attr:`tp_traverse` and the + :const:`Py_TPFLAGS_HAVE_GC` flag bit: the flag bit, :attr:`tp_traverse`, and + :attr:`tp_clear` are all inherited from the base type if they are all zero in + the subtype *and* the subtype has the :const:`Py_TPFLAGS_HAVE_RICHCOMPARE` flag + bit set. + + +.. cmember:: richcmpfunc PyTypeObject.tp_richcompare + + An optional pointer to the rich comparison function. + + The signature is the same as for :cfunc:`PyObject_RichCompare`. The function + should return the result of the comparison (usually ``Py_True`` or + ``Py_False``). If the comparison is undefined, it must return + ``Py_NotImplemented``, if another error occurred it must return ``NULL`` and set + an exception condition. + + This field is inherited by subtypes together with :attr:`tp_compare` and + :attr:`tp_hash`: a subtype inherits all three of :attr:`tp_compare`, + :attr:`tp_richcompare`, and :attr:`tp_hash`, when the subtype's + :attr:`tp_compare`, :attr:`tp_richcompare`, and :attr:`tp_hash` are all *NULL*. + + The following constants are defined to be used as the third argument for + :attr:`tp_richcompare` and for :cfunc:`PyObject_RichCompare`: + + +----------------+------------+ + | Constant | Comparison | + +================+============+ + | :const:`Py_LT` | ``<`` | + +----------------+------------+ + | :const:`Py_LE` | ``<=`` | + +----------------+------------+ + | :const:`Py_EQ` | ``==`` | + +----------------+------------+ + | :const:`Py_NE` | ``!=`` | + +----------------+------------+ + | :const:`Py_GT` | ``>`` | + +----------------+------------+ + | :const:`Py_GE` | ``>=`` | + +----------------+------------+ + +The next field only exists if the :const:`Py_TPFLAGS_HAVE_WEAKREFS` flag bit is +set. + + +.. cmember:: long PyTypeObject.tp_weaklistoffset + + If the instances of this type are weakly referenceable, this field is greater + than zero and contains the offset in the instance structure of the weak + reference list head (ignoring the GC header, if present); this offset is used by + :cfunc:`PyObject_ClearWeakRefs` and the :cfunc:`PyWeakref_\*` functions. The + instance structure needs to include a field of type :ctype:`PyObject\*` which is + initialized to *NULL*. + + Do not confuse this field with :attr:`tp_weaklist`; that is the list head for + weak references to the type object itself. + + This field is inherited by subtypes, but see the rules listed below. A subtype + may override this offset; this means that the subtype uses a different weak + reference list head than the base type. Since the list head is always found via + :attr:`tp_weaklistoffset`, this should not be a problem. + + When a type defined by a class statement has no :attr:`__slots__` declaration, + and none of its base types are weakly referenceable, the type is made weakly + referenceable by adding a weak reference list head slot to the instance layout + and setting the :attr:`tp_weaklistoffset` of that slot's offset. + + When a type's :attr:`__slots__` declaration contains a slot named + :attr:`__weakref__`, that slot becomes the weak reference list head for + instances of the type, and the slot's offset is stored in the type's + :attr:`tp_weaklistoffset`. + + When a type's :attr:`__slots__` declaration does not contain a slot named + :attr:`__weakref__`, the type inherits its :attr:`tp_weaklistoffset` from its + base type. + +The next two fields only exist if the :const:`Py_TPFLAGS_HAVE_CLASS` flag bit is +set. + + +.. cmember:: getiterfunc PyTypeObject.tp_iter + + An optional pointer to a function that returns an iterator for the object. Its + presence normally signals that the instances of this type are iterable (although + sequences may be iterable without this function, and classic instances always + have this function, even if they don't define an :meth:`__iter__` method). + + This function has the same signature as :cfunc:`PyObject_GetIter`. + + This field is inherited by subtypes. + + +.. cmember:: iternextfunc PyTypeObject.tp_iternext + + An optional pointer to a function that returns the next item in an iterator, or + raises :exc:`StopIteration` when the iterator is exhausted. Its presence + normally signals that the instances of this type are iterators (although classic + instances always have this function, even if they don't define a + :meth:`__next__` method). + + Iterator types should also define the :attr:`tp_iter` function, and that + function should return the iterator instance itself (not a new iterator + instance). + + This function has the same signature as :cfunc:`PyIter_Next`. + + This field is inherited by subtypes. + +The next fields, up to and including :attr:`tp_weaklist`, only exist if the +:const:`Py_TPFLAGS_HAVE_CLASS` flag bit is set. + + +.. cmember:: struct PyMethodDef* PyTypeObject.tp_methods + + An optional pointer to a static *NULL*-terminated array of :ctype:`PyMethodDef` + structures, declaring regular methods of this type. + + For each entry in the array, an entry is added to the type's dictionary (see + :attr:`tp_dict` below) containing a method descriptor. + + This field is not inherited by subtypes (methods are inherited through a + different mechanism). + + +.. cmember:: struct PyMemberDef* PyTypeObject.tp_members + + An optional pointer to a static *NULL*-terminated array of :ctype:`PyMemberDef` + structures, declaring regular data members (fields or slots) of instances of + this type. + + For each entry in the array, an entry is added to the type's dictionary (see + :attr:`tp_dict` below) containing a member descriptor. + + This field is not inherited by subtypes (members are inherited through a + different mechanism). + + +.. cmember:: struct PyGetSetDef* PyTypeObject.tp_getset + + An optional pointer to a static *NULL*-terminated array of :ctype:`PyGetSetDef` + structures, declaring computed attributes of instances of this type. + + For each entry in the array, an entry is added to the type's dictionary (see + :attr:`tp_dict` below) containing a getset descriptor. + + This field is not inherited by subtypes (computed attributes are inherited + through a different mechanism). + + Docs for PyGetSetDef (XXX belong elsewhere):: + + typedef PyObject *(*getter)(PyObject *, void *); + typedef int (*setter)(PyObject *, PyObject *, void *); + + typedef struct PyGetSetDef { + char *name; /* attribute name */ + getter get; /* C function to get the attribute */ + setter set; /* C function to set the attribute */ + char *doc; /* optional doc string */ + void *closure; /* optional additional data for getter and setter */ + } PyGetSetDef; + + +.. cmember:: PyTypeObject* PyTypeObject.tp_base + + An optional pointer to a base type from which type properties are inherited. At + this level, only single inheritance is supported; multiple inheritance require + dynamically creating a type object by calling the metatype. + + This field is not inherited by subtypes (obviously), but it defaults to + ``&PyBaseObject_Type`` (which to Python programmers is known as the type + :class:`object`). + + +.. cmember:: PyObject* PyTypeObject.tp_dict + + The type's dictionary is stored here by :cfunc:`PyType_Ready`. + + This field should normally be initialized to *NULL* before PyType_Ready is + called; it may also be initialized to a dictionary containing initial attributes + for the type. Once :cfunc:`PyType_Ready` has initialized the type, extra + attributes for the type may be added to this dictionary only if they don't + correspond to overloaded operations (like :meth:`__add__`). + + This field is not inherited by subtypes (though the attributes defined in here + are inherited through a different mechanism). + + +.. cmember:: descrgetfunc PyTypeObject.tp_descr_get + + An optional pointer to a "descriptor get" function. + + The function signature is :: + + PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type); + + XXX blah, blah. + + This field is inherited by subtypes. + + +.. cmember:: descrsetfunc PyTypeObject.tp_descr_set + + An optional pointer to a "descriptor set" function. + + The function signature is :: + + int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value); + + This field is inherited by subtypes. + + XXX blah, blah. + + +.. cmember:: long PyTypeObject.tp_dictoffset + + If the instances of this type have a dictionary containing instance variables, + this field is non-zero and contains the offset in the instances of the type of + the instance variable dictionary; this offset is used by + :cfunc:`PyObject_GenericGetAttr`. + + Do not confuse this field with :attr:`tp_dict`; that is the dictionary for + attributes of the type object itself. + + If the value of this field is greater than zero, it specifies the offset from + the start of the instance structure. If the value is less than zero, it + specifies the offset from the *end* of the instance structure. A negative + offset is more expensive to use, and should only be used when the instance + structure contains a variable-length part. This is used for example to add an + instance variable dictionary to subtypes of :class:`str` or :class:`tuple`. Note + that the :attr:`tp_basicsize` field should account for the dictionary added to + the end in that case, even though the dictionary is not included in the basic + object layout. On a system with a pointer size of 4 bytes, + :attr:`tp_dictoffset` should be set to ``-4`` to indicate that the dictionary is + at the very end of the structure. + + The real dictionary offset in an instance can be computed from a negative + :attr:`tp_dictoffset` as follows:: + + dictoffset = tp_basicsize + abs(ob_size)*tp_itemsize + tp_dictoffset + if dictoffset is not aligned on sizeof(void*): + round up to sizeof(void*) + + where :attr:`tp_basicsize`, :attr:`tp_itemsize` and :attr:`tp_dictoffset` are + taken from the type object, and :attr:`ob_size` is taken from the instance. The + absolute value is taken because long ints use the sign of :attr:`ob_size` to + store the sign of the number. (There's never a need to do this calculation + yourself; it is done for you by :cfunc:`_PyObject_GetDictPtr`.) + + This field is inherited by subtypes, but see the rules listed below. A subtype + may override this offset; this means that the subtype instances store the + dictionary at a difference offset than the base type. Since the dictionary is + always found via :attr:`tp_dictoffset`, this should not be a problem. + + When a type defined by a class statement has no :attr:`__slots__` declaration, + and none of its base types has an instance variable dictionary, a dictionary + slot is added to the instance layout and the :attr:`tp_dictoffset` is set to + that slot's offset. + + When a type defined by a class statement has a :attr:`__slots__` declaration, + the type inherits its :attr:`tp_dictoffset` from its base type. + + (Adding a slot named :attr:`__dict__` to the :attr:`__slots__` declaration does + not have the expected effect, it just causes confusion. Maybe this should be + added as a feature just like :attr:`__weakref__` though.) + + +.. cmember:: initproc PyTypeObject.tp_init + + An optional pointer to an instance initialization function. + + This function corresponds to the :meth:`__init__` method of classes. Like + :meth:`__init__`, it is possible to create an instance without calling + :meth:`__init__`, and it is possible to reinitialize an instance by calling its + :meth:`__init__` method again. + + The function signature is :: + + int tp_init(PyObject *self, PyObject *args, PyObject *kwds) + + The self argument is the instance to be initialized; the *args* and *kwds* + arguments represent positional and keyword arguments of the call to + :meth:`__init__`. + + The :attr:`tp_init` function, if not *NULL*, is called when an instance is + created normally by calling its type, after the type's :attr:`tp_new` function + has returned an instance of the type. If the :attr:`tp_new` function returns an + instance of some other type that is not a subtype of the original type, no + :attr:`tp_init` function is called; if :attr:`tp_new` returns an instance of a + subtype of the original type, the subtype's :attr:`tp_init` is called. (VERSION + NOTE: described here is what is implemented in Python 2.2.1 and later. In + Python 2.2, the :attr:`tp_init` of the type of the object returned by + :attr:`tp_new` was always called, if not *NULL*.) + + This field is inherited by subtypes. + + +.. cmember:: allocfunc PyTypeObject.tp_alloc + + An optional pointer to an instance allocation function. + + The function signature is :: + + PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems) + + The purpose of this function is to separate memory allocation from memory + initialization. It should return a pointer to a block of memory of adequate + length for the instance, suitably aligned, and initialized to zeros, but with + :attr:`ob_refcnt` set to ``1`` and :attr:`ob_type` set to the type argument. If + the type's :attr:`tp_itemsize` is non-zero, the object's :attr:`ob_size` field + should be initialized to *nitems* and the length of the allocated memory block + should be ``tp_basicsize + nitems*tp_itemsize``, rounded up to a multiple of + ``sizeof(void*)``; otherwise, *nitems* is not used and the length of the block + should be :attr:`tp_basicsize`. + + Do not use this function to do any other instance initialization, not even to + allocate additional memory; that should be done by :attr:`tp_new`. + + This field is inherited by static subtypes, but not by dynamic subtypes + (subtypes created by a class statement); in the latter, this field is always set + to :cfunc:`PyType_GenericAlloc`, to force a standard heap allocation strategy. + That is also the recommended value for statically defined types. + + +.. cmember:: newfunc PyTypeObject.tp_new + + An optional pointer to an instance creation function. + + If this function is *NULL* for a particular type, that type cannot be called to + create new instances; presumably there is some other way to create instances, + like a factory function. + + The function signature is :: + + PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) + + The subtype argument is the type of the object being created; the *args* and + *kwds* arguments represent positional and keyword arguments of the call to the + type. Note that subtype doesn't have to equal the type whose :attr:`tp_new` + function is called; it may be a subtype of that type (but not an unrelated + type). + + The :attr:`tp_new` function should call ``subtype->tp_alloc(subtype, nitems)`` + to allocate space for the object, and then do only as much further + initialization as is absolutely necessary. Initialization that can safely be + ignored or repeated should be placed in the :attr:`tp_init` handler. A good + rule of thumb is that for immutable types, all initialization should take place + in :attr:`tp_new`, while for mutable types, most initialization should be + deferred to :attr:`tp_init`. + + This field is inherited by subtypes, except it is not inherited by static types + whose :attr:`tp_base` is *NULL* or ``&PyBaseObject_Type``. The latter exception + is a precaution so that old extension types don't become callable simply by + being linked with Python 2.2. + + +.. cmember:: destructor PyTypeObject.tp_free + + An optional pointer to an instance deallocation function. + + The signature of this function has changed slightly: in Python 2.2 and 2.2.1, + its signature is :ctype:`destructor`:: + + void tp_free(PyObject *) + + In Python 2.3 and beyond, its signature is :ctype:`freefunc`:: + + void tp_free(void *) + + The only initializer that is compatible with both versions is ``_PyObject_Del``, + whose definition has suitably adapted in Python 2.3. + + This field is inherited by static subtypes, but not by dynamic subtypes + (subtypes created by a class statement); in the latter, this field is set to a + deallocator suitable to match :cfunc:`PyType_GenericAlloc` and the value of the + :const:`Py_TPFLAGS_HAVE_GC` flag bit. + + +.. cmember:: inquiry PyTypeObject.tp_is_gc + + An optional pointer to a function called by the garbage collector. + + The garbage collector needs to know whether a particular object is collectible + or not. Normally, it is sufficient to look at the object's type's + :attr:`tp_flags` field, and check the :const:`Py_TPFLAGS_HAVE_GC` flag bit. But + some types have a mixture of statically and dynamically allocated instances, and + the statically allocated instances are not collectible. Such types should + define this function; it should return ``1`` for a collectible instance, and + ``0`` for a non-collectible instance. The signature is :: + + int tp_is_gc(PyObject *self) + + (The only example of this are types themselves. The metatype, + :cdata:`PyType_Type`, defines this function to distinguish between statically + and dynamically allocated types.) + + This field is inherited by subtypes. (VERSION NOTE: in Python 2.2, it was not + inherited. It is inherited in 2.2.1 and later versions.) + + +.. cmember:: PyObject* PyTypeObject.tp_bases + + Tuple of base types. + + This is set for types created by a class statement. It should be *NULL* for + statically defined types. + + This field is not inherited. + + +.. cmember:: PyObject* PyTypeObject.tp_mro + + Tuple containing the expanded set of base types, starting with the type itself + and ending with :class:`object`, in Method Resolution Order. + + This field is not inherited; it is calculated fresh by :cfunc:`PyType_Ready`. + + +.. cmember:: PyObject* PyTypeObject.tp_cache + + Unused. Not inherited. Internal use only. + + +.. cmember:: PyObject* PyTypeObject.tp_subclasses + + List of weak references to subclasses. Not inherited. Internal use only. + + +.. cmember:: PyObject* PyTypeObject.tp_weaklist + + Weak reference list head, for weak references to this type object. Not + inherited. Internal use only. + +The remaining fields are only defined if the feature test macro +:const:`COUNT_ALLOCS` is defined, and are for internal use only. They are +documented here for completeness. None of these fields are inherited by +subtypes. + + +.. cmember:: Py_ssize_t PyTypeObject.tp_allocs + + Number of allocations. + + +.. cmember:: Py_ssize_t PyTypeObject.tp_frees + + Number of frees. + + +.. cmember:: Py_ssize_t PyTypeObject.tp_maxalloc + + Maximum simultaneously allocated objects. + + +.. cmember:: PyTypeObject* PyTypeObject.tp_next + + Pointer to the next type object with a non-zero :attr:`tp_allocs` field. + +Also, note that, in a garbage collected Python, tp_dealloc may be called from +any Python thread, not just the thread which created the object (if the object +becomes part of a refcount cycle, that cycle might be collected by a garbage +collection on any thread). This is not a problem for Python API calls, since +the thread on which tp_dealloc is called will own the Global Interpreter Lock +(GIL). However, if the object being destroyed in turn destroys objects from some +other C or C++ library, care should be taken to ensure that destroying those +objects on the thread which called tp_dealloc will not violate any assumptions +of the library. + + +.. _mapping-structs: + +Mapping Object Structures +========================= + + +.. ctype:: PyMappingMethods + + Structure used to hold pointers to the functions used to implement the mapping + protocol for an extension type. + + +.. _number-structs: + +Number Object Structures +======================== + + +.. ctype:: PyNumberMethods + + Structure used to hold pointers to the functions an extension type uses to + implement the number protocol. + + +.. _sequence-structs: + +Sequence Object Structures +========================== + + +.. ctype:: PySequenceMethods + + Structure used to hold pointers to the functions which an object uses to + implement the sequence protocol. + + +.. _buffer-structs: + +Buffer Object Structures +======================== + +.. sectionauthor:: Greg J. Stein + + +The buffer interface exports a model where an object can expose its internal +data as a set of chunks of data, where each chunk is specified as a +pointer/length pair. These chunks are called :dfn:`segments` and are presumed +to be non-contiguous in memory. + +If an object does not export the buffer interface, then its :attr:`tp_as_buffer` +member in the :ctype:`PyTypeObject` structure should be *NULL*. Otherwise, the +:attr:`tp_as_buffer` will point to a :ctype:`PyBufferProcs` structure. + +.. note:: + + It is very important that your :ctype:`PyTypeObject` structure uses + :const:`Py_TPFLAGS_DEFAULT` for the value of the :attr:`tp_flags` member rather + than ``0``. This tells the Python runtime that your :ctype:`PyBufferProcs` + structure contains the :attr:`bf_getcharbuffer` slot. Older versions of Python + did not have this member, so a new Python interpreter using an old extension + needs to be able to test for its presence before using it. + + +.. ctype:: PyBufferProcs + + Structure used to hold the function pointers which define an implementation of + the buffer protocol. + + The first slot is :attr:`bf_getreadbuffer`, of type :ctype:`getreadbufferproc`. + If this slot is *NULL*, then the object does not support reading from the + internal data. This is non-sensical, so implementors should fill this in, but + callers should test that the slot contains a non-*NULL* value. + + The next slot is :attr:`bf_getwritebuffer` having type + :ctype:`getwritebufferproc`. This slot may be *NULL* if the object does not + allow writing into its returned buffers. + + The third slot is :attr:`bf_getsegcount`, with type :ctype:`getsegcountproc`. + This slot must not be *NULL* and is used to inform the caller how many segments + the object contains. Simple objects such as :ctype:`PyString_Type` and + :ctype:`PyBuffer_Type` objects contain a single segment. + + .. index:: single: PyType_HasFeature() + + The last slot is :attr:`bf_getcharbuffer`, of type :ctype:`getcharbufferproc`. + This slot will only be present if the :const:`Py_TPFLAGS_HAVE_GETCHARBUFFER` + flag is present in the :attr:`tp_flags` field of the object's + :ctype:`PyTypeObject`. Before using this slot, the caller should test whether it + is present by using the :cfunc:`PyType_HasFeature` function. If the flag is + present, :attr:`bf_getcharbuffer` may be *NULL*, indicating that the object's + contents cannot be used as *8-bit characters*. The slot function may also raise + an error if the object's contents cannot be interpreted as 8-bit characters. + For example, if the object is an array which is configured to hold floating + point values, an exception may be raised if a caller attempts to use + :attr:`bf_getcharbuffer` to fetch a sequence of 8-bit characters. This notion of + exporting the internal buffers as "text" is used to distinguish between objects + that are binary in nature, and those which have character-based content. + + .. note:: + + The current policy seems to state that these characters may be multi-byte + characters. This implies that a buffer size of *N* does not mean there are *N* + characters present. + + +.. data:: Py_TPFLAGS_HAVE_GETCHARBUFFER + + Flag bit set in the type structure to indicate that the :attr:`bf_getcharbuffer` + slot is known. This being set does not indicate that the object supports the + buffer interface or that the :attr:`bf_getcharbuffer` slot is non-*NULL*. + + +.. ctype:: Py_ssize_t (*readbufferproc) (PyObject *self, Py_ssize_t segment, void **ptrptr) + + Return a pointer to a readable segment of the buffer in ``*ptrptr``. This + function is allowed to raise an exception, in which case it must return ``-1``. + The *segment* which is specified must be zero or positive, and strictly less + than the number of segments returned by the :attr:`bf_getsegcount` slot + function. On success, it returns the length of the segment, and sets + ``*ptrptr`` to a pointer to that memory. + + +.. ctype:: Py_ssize_t (*writebufferproc) (PyObject *self, Py_ssize_t segment, void **ptrptr) + + Return a pointer to a writable memory buffer in ``*ptrptr``, and the length of + that segment as the function return value. The memory buffer must correspond to + buffer segment *segment*. Must return ``-1`` and set an exception on error. + :exc:`TypeError` should be raised if the object only supports read-only buffers, + and :exc:`SystemError` should be raised when *segment* specifies a segment that + doesn't exist. + + .. % Why doesn't it raise ValueError for this one? + .. % GJS: because you shouldn't be calling it with an invalid + .. % segment. That indicates a blatant programming error in the C + .. % code. + + +.. ctype:: Py_ssize_t (*segcountproc) (PyObject *self, Py_ssize_t *lenp) + + Return the number of memory segments which comprise the buffer. If *lenp* is + not *NULL*, the implementation must report the sum of the sizes (in bytes) of + all segments in ``*lenp``. The function cannot fail. + + +.. ctype:: Py_ssize_t (*charbufferproc) (PyObject *self, Py_ssize_t segment, const char **ptrptr) + + Return the size of the segment *segment* that *ptrptr* is set to. ``*ptrptr`` + is set to the memory buffer. Returns ``-1`` on error. + + +.. _supporting-iteration: + +Supporting the Iterator Protocol +================================ + + +.. _supporting-cycle-detection: + +Supporting Cyclic Garbage Collection +==================================== + +Python's support for detecting and collecting garbage which involves circular +references requires support from object types which are "containers" for other +objects which may also be containers. Types which do not store references to +other objects, or which only store references to atomic types (such as numbers +or strings), do not need to provide any explicit support for garbage collection. + +.. An example showing the use of these interfaces can be found in "Supporting the +.. Cycle Collector (XXX not found: ../ext/example-cycle-support.html)". + +To create a container type, the :attr:`tp_flags` field of the type object must +include the :const:`Py_TPFLAGS_HAVE_GC` and provide an implementation of the +:attr:`tp_traverse` handler. If instances of the type are mutable, a +:attr:`tp_clear` implementation must also be provided. + + +.. data:: Py_TPFLAGS_HAVE_GC + + Objects with a type with this flag set must conform with the rules documented + here. For convenience these objects will be referred to as container objects. + +Constructors for container types must conform to two rules: + +#. The memory for the object must be allocated using :cfunc:`PyObject_GC_New` or + :cfunc:`PyObject_GC_VarNew`. + +#. Once all the fields which may contain references to other containers are + initialized, it must call :cfunc:`PyObject_GC_Track`. + + +.. cfunction:: TYPE* PyObject_GC_New(TYPE, PyTypeObject *type) + + Analogous to :cfunc:`PyObject_New` but for container objects with the + :const:`Py_TPFLAGS_HAVE_GC` flag set. + + +.. cfunction:: TYPE* PyObject_GC_NewVar(TYPE, PyTypeObject *type, Py_ssize_t size) + + Analogous to :cfunc:`PyObject_NewVar` but for container objects with the + :const:`Py_TPFLAGS_HAVE_GC` flag set. + + +.. cfunction:: PyVarObject * PyObject_GC_Resize(PyVarObject *op, Py_ssize_t) + + Resize an object allocated by :cfunc:`PyObject_NewVar`. Returns the resized + object or *NULL* on failure. + + +.. cfunction:: void PyObject_GC_Track(PyObject *op) + + Adds the object *op* to the set of container objects tracked by the collector. + The collector can run at unexpected times so objects must be valid while being + tracked. This should be called once all the fields followed by the + :attr:`tp_traverse` handler become valid, usually near the end of the + constructor. + + +.. cfunction:: void _PyObject_GC_TRACK(PyObject *op) + + A macro version of :cfunc:`PyObject_GC_Track`. It should not be used for + extension modules. + +Similarly, the deallocator for the object must conform to a similar pair of +rules: + +#. Before fields which refer to other containers are invalidated, + :cfunc:`PyObject_GC_UnTrack` must be called. + +#. The object's memory must be deallocated using :cfunc:`PyObject_GC_Del`. + + +.. cfunction:: void PyObject_GC_Del(void *op) + + Releases memory allocated to an object using :cfunc:`PyObject_GC_New` or + :cfunc:`PyObject_GC_NewVar`. + + +.. cfunction:: void PyObject_GC_UnTrack(void *op) + + Remove the object *op* from the set of container objects tracked by the + collector. Note that :cfunc:`PyObject_GC_Track` can be called again on this + object to add it back to the set of tracked objects. The deallocator + (:attr:`tp_dealloc` handler) should call this for the object before any of the + fields used by the :attr:`tp_traverse` handler become invalid. + + +.. cfunction:: void _PyObject_GC_UNTRACK(PyObject *op) + + A macro version of :cfunc:`PyObject_GC_UnTrack`. It should not be used for + extension modules. + +The :attr:`tp_traverse` handler accepts a function parameter of this type: + + +.. ctype:: int (*visitproc)(PyObject *object, void *arg) + + Type of the visitor function passed to the :attr:`tp_traverse` handler. The + function should be called with an object to traverse as *object* and the third + parameter to the :attr:`tp_traverse` handler as *arg*. The Python core uses + several visitor functions to implement cyclic garbage detection; it's not + expected that users will need to write their own visitor functions. + +The :attr:`tp_traverse` handler must have the following type: + + +.. ctype:: int (*traverseproc)(PyObject *self, visitproc visit, void *arg) + + Traversal function for a container object. Implementations must call the + *visit* function for each object directly contained by *self*, with the + parameters to *visit* being the contained object and the *arg* value passed to + the handler. The *visit* function must not be called with a *NULL* object + argument. If *visit* returns a non-zero value that value should be returned + immediately. + +To simplify writing :attr:`tp_traverse` handlers, a :cfunc:`Py_VISIT` macro is +provided. In order to use this macro, the :attr:`tp_traverse` implementation +must name its arguments exactly *visit* and *arg*: + + +.. cfunction:: void Py_VISIT(PyObject *o) + + Call the *visit* callback, with arguments *o* and *arg*. If *visit* returns a + non-zero value, then return it. Using this macro, :attr:`tp_traverse` handlers + look like:: + + static int + my_traverse(Noddy *self, visitproc visit, void *arg) + { + Py_VISIT(self->foo); + Py_VISIT(self->bar); + return 0; + } + + .. versionadded:: 2.4 + +The :attr:`tp_clear` handler must be of the :ctype:`inquiry` type, or *NULL* if +the object is immutable. + + +.. ctype:: int (*inquiry)(PyObject *self) + + Drop references that may have created reference cycles. Immutable objects do + not have to define this method since they can never directly create reference + cycles. Note that the object must still be valid after calling this method + (don't just call :cfunc:`Py_DECREF` on a reference). The collector will call + this method if it detects that this object is involved in a reference cycle. + diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst new file mode 100644 index 0000000..9dc357f --- /dev/null +++ b/Doc/c-api/refcounting.rst @@ -0,0 +1,74 @@ +.. highlightlang:: c + + +.. _countingrefs: + +****************** +Reference Counting +****************** + +The macros in this section are used for managing reference counts of Python +objects. + + +.. cfunction:: void Py_INCREF(PyObject *o) + + Increment the reference count for object *o*. The object must not be *NULL*; if + you aren't sure that it isn't *NULL*, use :cfunc:`Py_XINCREF`. + + +.. cfunction:: void Py_XINCREF(PyObject *o) + + Increment the reference count for object *o*. The object may be *NULL*, in + which case the macro has no effect. + + +.. cfunction:: void Py_DECREF(PyObject *o) + + Decrement the reference count for object *o*. The object must not be *NULL*; if + you aren't sure that it isn't *NULL*, use :cfunc:`Py_XDECREF`. If the reference + count reaches zero, the object's type's deallocation function (which must not be + *NULL*) is invoked. + + .. warning:: + + The deallocation function can cause arbitrary Python code to be invoked (e.g. + when a class instance with a :meth:`__del__` method is deallocated). While + exceptions in such code are not propagated, the executed code has free access to + all Python global variables. This means that any object that is reachable from + a global variable should be in a consistent state before :cfunc:`Py_DECREF` is + invoked. For example, code to delete an object from a list should copy a + reference to the deleted object in a temporary variable, update the list data + structure, and then call :cfunc:`Py_DECREF` for the temporary variable. + + +.. cfunction:: void Py_XDECREF(PyObject *o) + + Decrement the reference count for object *o*. The object may be *NULL*, in + which case the macro has no effect; otherwise the effect is the same as for + :cfunc:`Py_DECREF`, and the same warning applies. + + +.. cfunction:: void Py_CLEAR(PyObject *o) + + Decrement the reference count for object *o*. The object may be *NULL*, in + which case the macro has no effect; otherwise the effect is the same as for + :cfunc:`Py_DECREF`, except that the argument is also set to *NULL*. The warning + for :cfunc:`Py_DECREF` does not apply with respect to the object passed because + the macro carefully uses a temporary variable and sets the argument to *NULL* + before decrementing its reference count. + + It is a good idea to use this macro whenever decrementing the value of a + variable that might be traversed during garbage collection. + + .. versionadded:: 2.4 + +The following functions are for runtime dynamic embedding of Python: +``Py_IncRef(PyObject \*o)``, `Py_DecRef(PyObject \*o)``. They are +simply exported function versions of :cfunc:`Py_XINCREF` and +:cfunc:`Py_XDECREF`, respectively. + +The following functions or macros are only for use within the interpreter core: +:cfunc:`_Py_Dealloc`, :cfunc:`_Py_ForgetReference`, :cfunc:`_Py_NewReference`, +as well as the global variable :cdata:`_Py_RefTotal`. + diff --git a/Doc/c-api/utilities.rst b/Doc/c-api/utilities.rst new file mode 100644 index 0000000..01c1ceb --- /dev/null +++ b/Doc/c-api/utilities.rst @@ -0,0 +1,1030 @@ +.. highlightlang:: c + + +.. _utilities: + +********* +Utilities +********* + +The functions in this chapter perform various utility tasks, ranging from +helping C code be more portable across platforms, using Python modules from C, +and parsing function arguments and constructing Python values from C values. + + +.. _os: + +Operating System Utilities +========================== + + +.. cfunction:: int Py_FdIsInteractive(FILE *fp, const char *filename) + + Return true (nonzero) if the standard I/O file *fp* with name *filename* is + deemed interactive. This is the case for files for which ``isatty(fileno(fp))`` + is true. If the global flag :cdata:`Py_InteractiveFlag` is true, this function + also returns true if the *filename* pointer is *NULL* or if the name is equal to + one of the strings ``''`` or ``'???'``. + + +.. cfunction:: long PyOS_GetLastModificationTime(char *filename) + + Return the time of last modification of the file *filename*. The result is + encoded in the same way as the timestamp returned by the standard C library + function :cfunc:`time`. + + +.. cfunction:: void PyOS_AfterFork() + + Function to update some internal state after a process fork; this should be + called in the new process if the Python interpreter will continue to be used. + If a new executable is loaded into the new process, this function does not need + to be called. + + +.. cfunction:: int PyOS_CheckStack() + + Return true when the interpreter runs out of stack space. This is a reliable + check, but is only available when :const:`USE_STACKCHECK` is defined (currently + on Windows using the Microsoft Visual C++ compiler). :const:`USE_STACKCHECK` + will be defined automatically; you should never change the definition in your + own code. + + +.. cfunction:: PyOS_sighandler_t PyOS_getsig(int i) + + Return the current signal handler for signal *i*. This is a thin wrapper around + either :cfunc:`sigaction` or :cfunc:`signal`. Do not call those functions + directly! :ctype:`PyOS_sighandler_t` is a typedef alias for :ctype:`void + (\*)(int)`. + + +.. cfunction:: PyOS_sighandler_t PyOS_setsig(int i, PyOS_sighandler_t h) + + Set the signal handler for signal *i* to be *h*; return the old signal handler. + This is a thin wrapper around either :cfunc:`sigaction` or :cfunc:`signal`. Do + not call those functions directly! :ctype:`PyOS_sighandler_t` is a typedef + alias for :ctype:`void (\*)(int)`. + + +.. _processcontrol: + +Process Control +=============== + + +.. cfunction:: void Py_FatalError(const char *message) + + .. index:: single: abort() + + Print a fatal error message and kill the process. No cleanup is performed. + This function should only be invoked when a condition is detected that would + make it dangerous to continue using the Python interpreter; e.g., when the + object administration appears to be corrupted. On Unix, the standard C library + function :cfunc:`abort` is called which will attempt to produce a :file:`core` + file. + + +.. cfunction:: void Py_Exit(int status) + + .. index:: + single: Py_Finalize() + single: exit() + + Exit the current process. This calls :cfunc:`Py_Finalize` and then calls the + standard C library function ``exit(status)``. + + +.. cfunction:: int Py_AtExit(void (*func) ()) + + .. index:: + single: Py_Finalize() + single: cleanup functions + + Register a cleanup function to be called by :cfunc:`Py_Finalize`. The cleanup + function will be called with no arguments and should return no value. At most + 32 cleanup functions can be registered. When the registration is successful, + :cfunc:`Py_AtExit` returns ``0``; on failure, it returns ``-1``. The cleanup + function registered last is called first. Each cleanup function will be called + at most once. Since Python's internal finalization will have completed before + the cleanup function, no Python APIs should be called by *func*. + + +.. _importing: + +Importing Modules +================= + + +.. cfunction:: PyObject* PyImport_ImportModule(const char *name) + + .. index:: + single: package variable; __all__ + single: __all__ (package variable) + + This is a simplified interface to :cfunc:`PyImport_ImportModuleEx` below, + leaving the *globals* and *locals* arguments set to *NULL*. When the *name* + argument contains a dot (when it specifies a submodule of a package), the + *fromlist* argument is set to the list ``['*']`` so that the return value is the + named module rather than the top-level package containing it as would otherwise + be the case. (Unfortunately, this has an additional side effect when *name* in + fact specifies a subpackage instead of a submodule: the submodules specified in + the package's ``__all__`` variable are loaded.) Return a new reference to the + imported module, or *NULL* with an exception set on failure. Before Python 2.4, + the module may still be created in the failure case --- examine ``sys.modules`` + to find out. Starting with Python 2.4, a failing import of a module no longer + leaves the module in ``sys.modules``. + + .. versionchanged:: 2.4 + failing imports remove incomplete module objects. + + .. index:: single: modules (in module sys) + + +.. cfunction:: PyObject* PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist) + + .. index:: builtin: __import__ + + Import a module. This is best described by referring to the built-in Python + function :func:`__import__`, as the standard :func:`__import__` function calls + this function directly. + + The return value is a new reference to the imported module or top-level package, + or *NULL* with an exception set on failure (before Python 2.4, the module may + still be created in this case). Like for :func:`__import__`, the return value + when a submodule of a package was requested is normally the top-level package, + unless a non-empty *fromlist* was given. + + .. versionchanged:: 2.4 + failing imports remove incomplete module objects. + + +.. cfunction:: PyObject* PyImport_Import(PyObject *name) + + .. index:: + module: rexec + module: ihooks + + This is a higher-level interface that calls the current "import hook function". + It invokes the :func:`__import__` function from the ``__builtins__`` of the + current globals. This means that the import is done using whatever import hooks + are installed in the current environment, e.g. by :mod:`rexec` or :mod:`ihooks`. + + +.. cfunction:: PyObject* PyImport_ReloadModule(PyObject *m) + + Reload a module. Return a new reference to the reloaded module, or *NULL* with + an exception set on failure (the module still exists in this case). + + +.. cfunction:: PyObject* PyImport_AddModule(const char *name) + + Return the module object corresponding to a module name. The *name* argument + may be of the form ``package.module``. First check the modules dictionary if + there's one there, and if not, create a new one and insert it in the modules + dictionary. Return *NULL* with an exception set on failure. + + .. note:: + + This function does not load or import the module; if the module wasn't already + loaded, you will get an empty module object. Use :cfunc:`PyImport_ImportModule` + or one of its variants to import a module. Package structures implied by a + dotted name for *name* are not created if not already present. + + +.. cfunction:: PyObject* PyImport_ExecCodeModule(char *name, PyObject *co) + + .. index:: builtin: compile + + Given a module name (possibly of the form ``package.module``) and a code object + read from a Python bytecode file or obtained from the built-in function + :func:`compile`, load the module. Return a new reference to the module object, + or *NULL* with an exception set if an error occurred. Before Python 2.4, the + module could still be created in error cases. Starting with Python 2.4, *name* + is removed from ``sys.modules`` in error cases, and even if *name* was already + in ``sys.modules`` on entry to :cfunc:`PyImport_ExecCodeModule`. Leaving + incompletely initialized modules in ``sys.modules`` is dangerous, as imports of + such modules have no way to know that the module object is an unknown (and + probably damaged with respect to the module author's intents) state. + + This function will reload the module if it was already imported. See + :cfunc:`PyImport_ReloadModule` for the intended way to reload a module. + + If *name* points to a dotted name of the form ``package.module``, any package + structures not already created will still not be created. + + .. versionchanged:: 2.4 + *name* is removed from ``sys.modules`` in error cases. + + +.. cfunction:: long PyImport_GetMagicNumber() + + Return the magic number for Python bytecode files (a.k.a. :file:`.pyc` and + :file:`.pyo` files). The magic number should be present in the first four bytes + of the bytecode file, in little-endian byte order. + + +.. cfunction:: PyObject* PyImport_GetModuleDict() + + Return the dictionary used for the module administration (a.k.a. + ``sys.modules``). Note that this is a per-interpreter variable. + + +.. cfunction:: void _PyImport_Init() + + Initialize the import mechanism. For internal use only. + + +.. cfunction:: void PyImport_Cleanup() + + Empty the module table. For internal use only. + + +.. cfunction:: void _PyImport_Fini() + + Finalize the import mechanism. For internal use only. + + +.. cfunction:: PyObject* _PyImport_FindExtension(char *, char *) + + For internal use only. + + +.. cfunction:: PyObject* _PyImport_FixupExtension(char *, char *) + + For internal use only. + + +.. cfunction:: int PyImport_ImportFrozenModule(char *name) + + Load a frozen module named *name*. Return ``1`` for success, ``0`` if the + module is not found, and ``-1`` with an exception set if the initialization + failed. To access the imported module on a successful load, use + :cfunc:`PyImport_ImportModule`. (Note the misnomer --- this function would + reload the module if it was already imported.) + + +.. ctype:: struct _frozen + + .. index:: single: freeze utility + + This is the structure type definition for frozen module descriptors, as + generated by the :program:`freeze` utility (see :file:`Tools/freeze/` in the + Python source distribution). Its definition, found in :file:`Include/import.h`, + is:: + + struct _frozen { + char *name; + unsigned char *code; + int size; + }; + + +.. cvar:: struct _frozen* PyImport_FrozenModules + + This pointer is initialized to point to an array of :ctype:`struct _frozen` + records, terminated by one whose members are all *NULL* or zero. When a frozen + module is imported, it is searched in this table. Third-party code could play + tricks with this to provide a dynamically created collection of frozen modules. + + +.. cfunction:: int PyImport_AppendInittab(char *name, void (*initfunc)(void)) + + Add a single module to the existing table of built-in modules. This is a + convenience wrapper around :cfunc:`PyImport_ExtendInittab`, returning ``-1`` if + the table could not be extended. The new module can be imported by the name + *name*, and uses the function *initfunc* as the initialization function called + on the first attempted import. This should be called before + :cfunc:`Py_Initialize`. + + +.. ctype:: struct _inittab + + Structure describing a single entry in the list of built-in modules. Each of + these structures gives the name and initialization function for a module built + into the interpreter. Programs which embed Python may use an array of these + structures in conjunction with :cfunc:`PyImport_ExtendInittab` to provide + additional built-in modules. The structure is defined in + :file:`Include/import.h` as:: + + struct _inittab { + char *name; + void (*initfunc)(void); + }; + + +.. cfunction:: int PyImport_ExtendInittab(struct _inittab *newtab) + + Add a collection of modules to the table of built-in modules. The *newtab* + array must end with a sentinel entry which contains *NULL* for the :attr:`name` + field; failure to provide the sentinel value can result in a memory fault. + Returns ``0`` on success or ``-1`` if insufficient memory could be allocated to + extend the internal table. In the event of failure, no modules are added to the + internal table. This should be called before :cfunc:`Py_Initialize`. + + +.. _marshalling-utils: + +Data marshalling support +======================== + +These routines allow C code to work with serialized objects using the same data +format as the :mod:`marshal` module. There are functions to write data into the +serialization format, and additional functions that can be used to read the data +back. Files used to store marshalled data must be opened in binary mode. + +Numeric values are stored with the least significant byte first. + +The module supports two versions of the data format: version 0 is the historical +version, version 1 (new in Python 2.4) shares interned strings in the file, and +upon unmarshalling. *Py_MARSHAL_VERSION* indicates the current file format +(currently 1). + + +.. cfunction:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version) + + Marshal a :ctype:`long` integer, *value*, to *file*. This will only write the + least-significant 32 bits of *value*; regardless of the size of the native + :ctype:`long` type. + + .. versionchanged:: 2.4 + *version* indicates the file format. + + +.. cfunction:: void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version) + + Marshal a Python object, *value*, to *file*. + + .. versionchanged:: 2.4 + *version* indicates the file format. + + +.. cfunction:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version) + + Return a string object containing the marshalled representation of *value*. + + .. versionchanged:: 2.4 + *version* indicates the file format. + + +The following functions allow marshalled values to be read back in. + +XXX What about error detection? It appears that reading past the end of the +file will always result in a negative numeric value (where that's relevant), but +it's not clear that negative values won't be handled properly when there's no +error. What's the right way to tell? Should only non-negative values be written +using these routines? + + +.. cfunction:: long PyMarshal_ReadLongFromFile(FILE *file) + + Return a C :ctype:`long` from the data stream in a :ctype:`FILE\*` opened for + reading. Only a 32-bit value can be read in using this function, regardless of + the native size of :ctype:`long`. + + +.. cfunction:: int PyMarshal_ReadShortFromFile(FILE *file) + + Return a C :ctype:`short` from the data stream in a :ctype:`FILE\*` opened for + reading. Only a 16-bit value can be read in using this function, regardless of + the native size of :ctype:`short`. + + +.. cfunction:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file) + + Return a Python object from the data stream in a :ctype:`FILE\*` opened for + reading. On error, sets the appropriate exception (:exc:`EOFError` or + :exc:`TypeError`) and returns *NULL*. + + +.. cfunction:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file) + + Return a Python object from the data stream in a :ctype:`FILE\*` opened for + reading. Unlike :cfunc:`PyMarshal_ReadObjectFromFile`, this function assumes + that no further objects will be read from the file, allowing it to aggressively + load file data into memory so that the de-serialization can operate from data in + memory rather than reading a byte at a time from the file. Only use these + variant if you are certain that you won't be reading anything else from the + file. On error, sets the appropriate exception (:exc:`EOFError` or + :exc:`TypeError`) and returns *NULL*. + + +.. cfunction:: PyObject* PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len) + + Return a Python object from the data stream in a character buffer containing + *len* bytes pointed to by *string*. On error, sets the appropriate exception + (:exc:`EOFError` or :exc:`TypeError`) and returns *NULL*. + + +.. _arg-parsing: + +Parsing arguments and building values +===================================== + +These functions are useful when creating your own extensions functions and +methods. Additional information and examples are available in +:ref:`extending-index`. + +The first three of these functions described, :cfunc:`PyArg_ParseTuple`, +:cfunc:`PyArg_ParseTupleAndKeywords`, and :cfunc:`PyArg_Parse`, all use *format +strings* which are used to tell the function about the expected arguments. The +format strings use the same syntax for each of these functions. + +A format string consists of zero or more "format units." A format unit +describes one Python object; it is usually a single character or a parenthesized +sequence of format units. With a few exceptions, a format unit that is not a +parenthesized sequence normally corresponds to a single address argument to +these functions. In the following description, the quoted form is the format +unit; the entry in (round) parentheses is the Python object type that matches +the format unit; and the entry in [square] brackets is the type of the C +variable(s) whose address should be passed. + +``s`` (string or Unicode object) [const char \*] + Convert a Python string or Unicode object to a C pointer to a character string. + You must not provide storage for the string itself; a pointer to an existing + string is stored into the character pointer variable whose address you pass. + The C string is NUL-terminated. The Python string must not contain embedded NUL + bytes; if it does, a :exc:`TypeError` exception is raised. Unicode objects are + converted to C strings using the default encoding. If this conversion fails, a + :exc:`UnicodeError` is raised. + +``s#`` (string, Unicode or any read buffer compatible object) [const char \*, int] + This variant on ``s`` stores into two C variables, the first one a pointer to a + character string, the second one its length. In this case the Python string may + contain embedded null bytes. Unicode objects pass back a pointer to the default + encoded string version of the object if such a conversion is possible. All + other read-buffer compatible objects pass back a reference to the raw internal + data representation. + +``y`` (bytes object) [const char \*] + This variant on ``s`` convert a Python bytes object to a C pointer to a + character string. The bytes object must not contain embedded NUL bytes; if it + does, a :exc:`TypeError` exception is raised. + +``y#`` (bytes object) [const char \*, int] + This variant on ``s#`` stores into two C variables, the first one a pointer to a + character string, the second one its length. This only accepts bytes objects. + +``z`` (string or ``None``) [const char \*] + Like ``s``, but the Python object may also be ``None``, in which case the C + pointer is set to *NULL*. + +``z#`` (string or ``None`` or any read buffer compatible object) [const char \*, int] + This is to ``s#`` as ``z`` is to ``s``. + +``u`` (Unicode object) [Py_UNICODE \*] + Convert a Python Unicode object to a C pointer to a NUL-terminated buffer of + 16-bit Unicode (UTF-16) data. As with ``s``, there is no need to provide + storage for the Unicode data buffer; a pointer to the existing Unicode data is + stored into the :ctype:`Py_UNICODE` pointer variable whose address you pass. + +``u#`` (Unicode object) [Py_UNICODE \*, int] + This variant on ``u`` stores into two C variables, the first one a pointer to a + Unicode data buffer, the second one its length. Non-Unicode objects are handled + by interpreting their read-buffer pointer as pointer to a :ctype:`Py_UNICODE` + array. + +``es`` (string, Unicode object or character buffer compatible object) [const char \*encoding, char \*\*buffer] + This variant on ``s`` is used for encoding Unicode and objects convertible to + Unicode into a character buffer. It only works for encoded data without embedded + NUL bytes. + + This format requires two arguments. The first is only used as input, and + must be a :ctype:`const char\*` which points to the name of an encoding as a + NUL-terminated string, or *NULL*, in which case the default encoding is used. + An exception is raised if the named encoding is not known to Python. The + second argument must be a :ctype:`char\*\*`; the value of the pointer it + references will be set to a buffer with the contents of the argument text. + The text will be encoded in the encoding specified by the first argument. + + :cfunc:`PyArg_ParseTuple` will allocate a buffer of the needed size, copy the + encoded data into this buffer and adjust *\*buffer* to reference the newly + allocated storage. The caller is responsible for calling :cfunc:`PyMem_Free` to + free the allocated buffer after use. + +``et`` (string, Unicode object or character buffer compatible object) [const char \*encoding, char \*\*buffer] + Same as ``es`` except that 8-bit string objects are passed through without + recoding them. Instead, the implementation assumes that the string object uses + the encoding passed in as parameter. + +``es#`` (string, Unicode object or character buffer compatible object) [const char \*encoding, char \*\*buffer, int \*buffer_length] + This variant on ``s#`` is used for encoding Unicode and objects convertible to + Unicode into a character buffer. Unlike the ``es`` format, this variant allows + input data which contains NUL characters. + + It requires three arguments. The first is only used as input, and must be a + :ctype:`const char\*` which points to the name of an encoding as a + NUL-terminated string, or *NULL*, in which case the default encoding is used. + An exception is raised if the named encoding is not known to Python. The + second argument must be a :ctype:`char\*\*`; the value of the pointer it + references will be set to a buffer with the contents of the argument text. + The text will be encoded in the encoding specified by the first argument. + The third argument must be a pointer to an integer; the referenced integer + will be set to the number of bytes in the output buffer. + + There are two modes of operation: + + If *\*buffer* points a *NULL* pointer, the function will allocate a buffer of + the needed size, copy the encoded data into this buffer and set *\*buffer* to + reference the newly allocated storage. The caller is responsible for calling + :cfunc:`PyMem_Free` to free the allocated buffer after usage. + + If *\*buffer* points to a non-*NULL* pointer (an already allocated buffer), + :cfunc:`PyArg_ParseTuple` will use this location as the buffer and interpret the + initial value of *\*buffer_length* as the buffer size. It will then copy the + encoded data into the buffer and NUL-terminate it. If the buffer is not large + enough, a :exc:`ValueError` will be set. + + In both cases, *\*buffer_length* is set to the length of the encoded data + without the trailing NUL byte. + +``et#`` (string, Unicode object or character buffer compatible object) [const char \*encoding, char \*\*buffer] + Same as ``es#`` except that string objects are passed through without recoding + them. Instead, the implementation assumes that the string object uses the + encoding passed in as parameter. + +``b`` (integer) [char] + Convert a Python integer to a tiny int, stored in a C :ctype:`char`. + +``B`` (integer) [unsigned char] + Convert a Python integer to a tiny int without overflow checking, stored in a C + :ctype:`unsigned char`. + + .. versionadded:: 2.3 + +``h`` (integer) [short int] + Convert a Python integer to a C :ctype:`short int`. + +``H`` (integer) [unsigned short int] + Convert a Python integer to a C :ctype:`unsigned short int`, without overflow + checking. + + .. versionadded:: 2.3 + +``i`` (integer) [int] + Convert a Python integer to a plain C :ctype:`int`. + +``I`` (integer) [unsigned int] + Convert a Python integer to a C :ctype:`unsigned int`, without overflow + checking. + + .. versionadded:: 2.3 + +``l`` (integer) [long int] + Convert a Python integer to a C :ctype:`long int`. + +``k`` (integer) [unsigned long] + Convert a Python integer or long integer to a C :ctype:`unsigned long` without + overflow checking. + + .. versionadded:: 2.3 + +``L`` (integer) [PY_LONG_LONG] + Convert a Python integer to a C :ctype:`long long`. This format is only + available on platforms that support :ctype:`long long` (or :ctype:`_int64` on + Windows). + +``K`` (integer) [unsigned PY_LONG_LONG] + Convert a Python integer or long integer to a C :ctype:`unsigned long long` + without overflow checking. This format is only available on platforms that + support :ctype:`unsigned long long` (or :ctype:`unsigned _int64` on Windows). + + .. versionadded:: 2.3 + +``n`` (integer) [Py_ssize_t] + Convert a Python integer or long integer to a C :ctype:`Py_ssize_t`. + + .. versionadded:: 2.5 + +``c`` (string of length 1) [char] + Convert a Python character, represented as a string of length 1, to a C + :ctype:`char`. + +``f`` (float) [float] + Convert a Python floating point number to a C :ctype:`float`. + +``d`` (float) [double] + Convert a Python floating point number to a C :ctype:`double`. + +``D`` (complex) [Py_complex] + Convert a Python complex number to a C :ctype:`Py_complex` structure. + +``O`` (object) [PyObject \*] + Store a Python object (without any conversion) in a C object pointer. The C + program thus receives the actual object that was passed. The object's reference + count is not increased. The pointer stored is not *NULL*. + +``O!`` (object) [*typeobject*, PyObject \*] + Store a Python object in a C object pointer. This is similar to ``O``, but + takes two C arguments: the first is the address of a Python type object, the + second is the address of the C variable (of type :ctype:`PyObject\*`) into which + the object pointer is stored. If the Python object does not have the required + type, :exc:`TypeError` is raised. + +``O&`` (object) [*converter*, *anything*] + Convert a Python object to a C variable through a *converter* function. This + takes two arguments: the first is a function, the second is the address of a C + variable (of arbitrary type), converted to :ctype:`void \*`. The *converter* + function in turn is called as follows:: + + status = converter(object, address); + + where *object* is the Python object to be converted and *address* is the + :ctype:`void\*` argument that was passed to the :cfunc:`PyArg_Parse\*` function. + The returned *status* should be ``1`` for a successful conversion and ``0`` if + the conversion has failed. When the conversion fails, the *converter* function + should raise an exception. + +``S`` (string) [PyStringObject \*] + Like ``O`` but requires that the Python object is a string object. Raises + :exc:`TypeError` if the object is not a string object. The C variable may also + be declared as :ctype:`PyObject\*`. + +``U`` (Unicode string) [PyUnicodeObject \*] + Like ``O`` but requires that the Python object is a Unicode object. Raises + :exc:`TypeError` if the object is not a Unicode object. The C variable may also + be declared as :ctype:`PyObject\*`. + +``t#`` (read-only character buffer) [char \*, int] + Like ``s#``, but accepts any object which implements the read-only buffer + interface. The :ctype:`char\*` variable is set to point to the first byte of + the buffer, and the :ctype:`int` is set to the length of the buffer. Only + single-segment buffer objects are accepted; :exc:`TypeError` is raised for all + others. + +``w`` (read-write character buffer) [char \*] + Similar to ``s``, but accepts any object which implements the read-write buffer + interface. The caller must determine the length of the buffer by other means, + or use ``w#`` instead. Only single-segment buffer objects are accepted; + :exc:`TypeError` is raised for all others. + +``w#`` (read-write character buffer) [char \*, int] + Like ``s#``, but accepts any object which implements the read-write buffer + interface. The :ctype:`char \*` variable is set to point to the first byte of + the buffer, and the :ctype:`int` is set to the length of the buffer. Only + single-segment buffer objects are accepted; :exc:`TypeError` is raised for all + others. + +``(items)`` (tuple) [*matching-items*] + The object must be a Python sequence whose length is the number of format units + in *items*. The C arguments must correspond to the individual format units in + *items*. Format units for sequences may be nested. + + .. note:: + + Prior to Python version 1.5.2, this format specifier only accepted a tuple + containing the individual parameters, not an arbitrary sequence. Code which + previously caused :exc:`TypeError` to be raised here may now proceed without an + exception. This is not expected to be a problem for existing code. + +It is possible to pass Python long integers where integers are requested; +however no proper range checking is done --- the most significant bits are +silently truncated when the receiving field is too small to receive the value +(actually, the semantics are inherited from downcasts in C --- your mileage may +vary). + +A few other characters have a meaning in a format string. These may not occur +inside nested parentheses. They are: + +``|`` + Indicates that the remaining arguments in the Python argument list are optional. + The C variables corresponding to optional arguments should be initialized to + their default value --- when an optional argument is not specified, + :cfunc:`PyArg_ParseTuple` does not touch the contents of the corresponding C + variable(s). + +``:`` + The list of format units ends here; the string after the colon is used as the + function name in error messages (the "associated value" of the exception that + :cfunc:`PyArg_ParseTuple` raises). + +``;`` + The list of format units ends here; the string after the semicolon is used as + the error message *instead* of the default error message. Clearly, ``:`` and + ``;`` mutually exclude each other. + +Note that any Python object references which are provided to the caller are +*borrowed* references; do not decrement their reference count! + +Additional arguments passed to these functions must be addresses of variables +whose type is determined by the format string; these are used to store values +from the input tuple. There are a few cases, as described in the list of format +units above, where these parameters are used as input values; they should match +what is specified for the corresponding format unit in that case. + +For the conversion to succeed, the *arg* object must match the format and the +format must be exhausted. On success, the :cfunc:`PyArg_Parse\*` functions +return true, otherwise they return false and raise an appropriate exception. + + +.. cfunction:: int PyArg_ParseTuple(PyObject *args, const char *format, ...) + + Parse the parameters of a function that takes only positional parameters into + local variables. Returns true on success; on failure, it returns false and + raises the appropriate exception. + + +.. cfunction:: int PyArg_VaParse(PyObject *args, const char *format, va_list vargs) + + Identical to :cfunc:`PyArg_ParseTuple`, except that it accepts a va_list rather + than a variable number of arguments. + + +.. cfunction:: int PyArg_ParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], ...) + + Parse the parameters of a function that takes both positional and keyword + parameters into local variables. Returns true on success; on failure, it + returns false and raises the appropriate exception. + + +.. cfunction:: int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *kw, const char *format, char *keywords[], va_list vargs) + + Identical to :cfunc:`PyArg_ParseTupleAndKeywords`, except that it accepts a + va_list rather than a variable number of arguments. + + +.. cfunction:: int PyArg_Parse(PyObject *args, const char *format, ...) + + Function used to deconstruct the argument lists of "old-style" functions --- + these are functions which use the :const:`METH_OLDARGS` parameter parsing + method. This is not recommended for use in parameter parsing in new code, and + most code in the standard interpreter has been modified to no longer use this + for that purpose. It does remain a convenient way to decompose other tuples, + however, and may continue to be used for that purpose. + + +.. cfunction:: int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...) + + A simpler form of parameter retrieval which does not use a format string to + specify the types of the arguments. Functions which use this method to retrieve + their parameters should be declared as :const:`METH_VARARGS` in function or + method tables. The tuple containing the actual parameters should be passed as + *args*; it must actually be a tuple. The length of the tuple must be at least + *min* and no more than *max*; *min* and *max* may be equal. Additional + arguments must be passed to the function, each of which should be a pointer to a + :ctype:`PyObject\*` variable; these will be filled in with the values from + *args*; they will contain borrowed references. The variables which correspond + to optional parameters not given by *args* will not be filled in; these should + be initialized by the caller. This function returns true on success and false if + *args* is not a tuple or contains the wrong number of elements; an exception + will be set if there was a failure. + + This is an example of the use of this function, taken from the sources for the + :mod:`_weakref` helper module for weak references:: + + static PyObject * + weakref_ref(PyObject *self, PyObject *args) + { + PyObject *object; + PyObject *callback = NULL; + PyObject *result = NULL; + + if (PyArg_UnpackTuple(args, "ref", 1, 2, &object, &callback)) { + result = PyWeakref_NewRef(object, callback); + } + return result; + } + + The call to :cfunc:`PyArg_UnpackTuple` in this example is entirely equivalent to + this call to :cfunc:`PyArg_ParseTuple`:: + + PyArg_ParseTuple(args, "O|O:ref", &object, &callback) + + .. versionadded:: 2.2 + + +.. cfunction:: PyObject* Py_BuildValue(const char *format, ...) + + Create a new value based on a format string similar to those accepted by the + :cfunc:`PyArg_Parse\*` family of functions and a sequence of values. Returns + the value or *NULL* in the case of an error; an exception will be raised if + *NULL* is returned. + + :cfunc:`Py_BuildValue` does not always build a tuple. It builds a tuple only if + its format string contains two or more format units. If the format string is + empty, it returns ``None``; if it contains exactly one format unit, it returns + whatever object is described by that format unit. To force it to return a tuple + of size 0 or one, parenthesize the format string. + + When memory buffers are passed as parameters to supply data to build objects, as + for the ``s`` and ``s#`` formats, the required data is copied. Buffers provided + by the caller are never referenced by the objects created by + :cfunc:`Py_BuildValue`. In other words, if your code invokes :cfunc:`malloc` + and passes the allocated memory to :cfunc:`Py_BuildValue`, your code is + responsible for calling :cfunc:`free` for that memory once + :cfunc:`Py_BuildValue` returns. + + In the following description, the quoted form is the format unit; the entry in + (round) parentheses is the Python object type that the format unit will return; + and the entry in [square] brackets is the type of the C value(s) to be passed. + + The characters space, tab, colon and comma are ignored in format strings (but + not within format units such as ``s#``). This can be used to make long format + strings a tad more readable. + + ``s`` (string) [char \*] + Convert a null-terminated C string to a Python object. If the C string pointer + is *NULL*, ``None`` is used. + + ``s#`` (string) [char \*, int] + Convert a C string and its length to a Python object. If the C string pointer + is *NULL*, the length is ignored and ``None`` is returned. + + ``z`` (string or ``None``) [char \*] + Same as ``s``. + + ``z#`` (string or ``None``) [char \*, int] + Same as ``s#``. + + ``u`` (Unicode string) [Py_UNICODE \*] + Convert a null-terminated buffer of Unicode (UCS-2 or UCS-4) data to a Python + Unicode object. If the Unicode buffer pointer is *NULL*, ``None`` is returned. + + ``u#`` (Unicode string) [Py_UNICODE \*, int] + Convert a Unicode (UCS-2 or UCS-4) data buffer and its length to a Python + Unicode object. If the Unicode buffer pointer is *NULL*, the length is ignored + and ``None`` is returned. + + ``U`` (string) [char \*] + Convert a null-terminated C string to a Python unicode object. If the C string + pointer is *NULL*, ``None`` is used. + + ``U#`` (string) [char \*, int] + Convert a C string and its length to a Python unicode object. If the C string + pointer is *NULL*, the length is ignored and ``None`` is returned. + + ``i`` (integer) [int] + Convert a plain C :ctype:`int` to a Python integer object. + + ``b`` (integer) [char] + Convert a plain C :ctype:`char` to a Python integer object. + + ``h`` (integer) [short int] + Convert a plain C :ctype:`short int` to a Python integer object. + + ``l`` (integer) [long int] + Convert a C :ctype:`long int` to a Python integer object. + + ``B`` (integer) [unsigned char] + Convert a C :ctype:`unsigned char` to a Python integer object. + + ``H`` (integer) [unsigned short int] + Convert a C :ctype:`unsigned short int` to a Python integer object. + + ``I`` (integer/long) [unsigned int] + Convert a C :ctype:`unsigned int` to a Python integer object or a Python long + integer object, if it is larger than ``sys.maxint``. + + ``k`` (integer/long) [unsigned long] + Convert a C :ctype:`unsigned long` to a Python integer object or a Python long + integer object, if it is larger than ``sys.maxint``. + + ``L`` (long) [PY_LONG_LONG] + Convert a C :ctype:`long long` to a Python long integer object. Only available + on platforms that support :ctype:`long long`. + + ``K`` (long) [unsigned PY_LONG_LONG] + Convert a C :ctype:`unsigned long long` to a Python long integer object. Only + available on platforms that support :ctype:`unsigned long long`. + + ``n`` (int) [Py_ssize_t] + Convert a C :ctype:`Py_ssize_t` to a Python integer or long integer. + + .. versionadded:: 2.5 + + ``c`` (string of length 1) [char] + Convert a C :ctype:`int` representing a character to a Python string of length + 1. + + ``d`` (float) [double] + Convert a C :ctype:`double` to a Python floating point number. + + ``f`` (float) [float] + Same as ``d``. + + ``D`` (complex) [Py_complex \*] + Convert a C :ctype:`Py_complex` structure to a Python complex number. + + ``O`` (object) [PyObject \*] + Pass a Python object untouched (except for its reference count, which is + incremented by one). If the object passed in is a *NULL* pointer, it is assumed + that this was caused because the call producing the argument found an error and + set an exception. Therefore, :cfunc:`Py_BuildValue` will return *NULL* but won't + raise an exception. If no exception has been raised yet, :exc:`SystemError` is + set. + + ``S`` (object) [PyObject \*] + Same as ``O``. + + ``N`` (object) [PyObject \*] + Same as ``O``, except it doesn't increment the reference count on the object. + Useful when the object is created by a call to an object constructor in the + argument list. + + ``O&`` (object) [*converter*, *anything*] + Convert *anything* to a Python object through a *converter* function. The + function is called with *anything* (which should be compatible with :ctype:`void + \*`) as its argument and should return a "new" Python object, or *NULL* if an + error occurred. + + ``(items)`` (tuple) [*matching-items*] + Convert a sequence of C values to a Python tuple with the same number of items. + + ``[items]`` (list) [*matching-items*] + Convert a sequence of C values to a Python list with the same number of items. + + ``{items}`` (dictionary) [*matching-items*] + Convert a sequence of C values to a Python dictionary. Each pair of consecutive + C values adds one item to the dictionary, serving as key and value, + respectively. + + If there is an error in the format string, the :exc:`SystemError` exception is + set and *NULL* returned. + + +.. _string-conversion: + +String conversion and formatting +================================ + +Functions for number conversion and formatted string output. + + +.. cfunction:: int PyOS_snprintf(char *str, size_t size, const char *format, ...) + + Output not more than *size* bytes to *str* according to the format string + *format* and the extra arguments. See the Unix man page :manpage:`snprintf(2)`. + + +.. cfunction:: int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) + + Output not more than *size* bytes to *str* according to the format string + *format* and the variable argument list *va*. Unix man page + :manpage:`vsnprintf(2)`. + +:cfunc:`PyOS_snprintf` and :cfunc:`PyOS_vsnprintf` wrap the Standard C library +functions :cfunc:`snprintf` and :cfunc:`vsnprintf`. Their purpose is to +guarantee consistent behavior in corner cases, which the Standard C functions do +not. + +The wrappers ensure that *str*[*size*-1] is always ``'\0'`` upon return. They +never write more than *size* bytes (including the trailing ``'\0'``) into str. +Both functions require that ``str != NULL``, ``size > 0`` and ``format != +NULL``. + +If the platform doesn't have :cfunc:`vsnprintf` and the buffer size needed to +avoid truncation exceeds *size* by more than 512 bytes, Python aborts with a +*Py_FatalError*. + +The return value (*rv*) for these functions should be interpreted as follows: + +* When ``0 <= rv < size``, the output conversion was successful and *rv* + characters were written to *str* (excluding the trailing ``'\0'`` byte at + *str*[*rv*]). + +* When ``rv >= size``, the output conversion was truncated and a buffer with + ``rv + 1`` bytes would have been needed to succeed. *str*[*size*-1] is ``'\0'`` + in this case. + +* When ``rv < 0``, "something bad happened." *str*[*size*-1] is ``'\0'`` in + this case too, but the rest of *str* is undefined. The exact cause of the error + depends on the underlying platform. + +The following functions provide locale-independent string to number conversions. + + +.. cfunction:: double PyOS_ascii_strtod(const char *nptr, char **endptr) + + Convert a string to a :ctype:`double`. This function behaves like the Standard C + function :cfunc:`strtod` does in the C locale. It does this without changing the + current locale, since that would not be thread-safe. + + :cfunc:`PyOS_ascii_strtod` should typically be used for reading configuration + files or other non-user input that should be locale independent. + + .. versionadded:: 2.4 + + See the Unix man page :manpage:`strtod(2)` for details. + + +.. cfunction:: char * PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d) + + Convert a :ctype:`double` to a string using the ``'.'`` as the decimal + separator. *format* is a :cfunc:`printf`\ -style format string specifying the + number format. Allowed conversion characters are ``'e'``, ``'E'``, ``'f'``, + ``'F'``, ``'g'`` and ``'G'``. + + The return value is a pointer to *buffer* with the converted string or NULL if + the conversion failed. + + .. versionadded:: 2.4 + + +.. cfunction:: double PyOS_ascii_atof(const char *nptr) + + Convert a string to a :ctype:`double` in a locale-independent way. + + .. versionadded:: 2.4 + + See the Unix man page :manpage:`atof(2)` for details. + diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst new file mode 100644 index 0000000..4b26da6 --- /dev/null +++ b/Doc/c-api/veryhigh.rst @@ -0,0 +1,278 @@ +.. highlightlang:: c + + +.. _veryhigh: + +************************* +The Very High Level Layer +************************* + +The functions in this chapter will let you execute Python source code given in a +file or a buffer, but they will not let you interact in a more detailed way with +the interpreter. + +Several of these functions accept a start symbol from the grammar as a +parameter. The available start symbols are :const:`Py_eval_input`, +:const:`Py_file_input`, and :const:`Py_single_input`. These are described +following the functions which accept them as parameters. + +Note also that several of these functions take :ctype:`FILE\*` parameters. On +particular issue which needs to be handled carefully is that the :ctype:`FILE` +structure for different C libraries can be different and incompatible. Under +Windows (at least), it is possible for dynamically linked extensions to actually +use different libraries, so care should be taken that :ctype:`FILE\*` parameters +are only passed to these functions if it is certain that they were created by +the same library that the Python runtime is using. + + +.. cfunction:: int Py_Main(int argc, char **argv) + + The main program for the standard interpreter. This is made available for + programs which embed Python. The *argc* and *argv* parameters should be + prepared exactly as those which are passed to a C program's :cfunc:`main` + function. It is important to note that the argument list may be modified (but + the contents of the strings pointed to by the argument list are not). The return + value will be the integer passed to the :func:`sys.exit` function, ``1`` if the + interpreter exits due to an exception, or ``2`` if the parameter list does not + represent a valid Python command line. + + +.. cfunction:: int PyRun_AnyFile(FILE *fp, const char *filename) + + This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving + *closeit* set to ``0`` and *flags* set to *NULL*. + + +.. cfunction:: int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) + + This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving + the *closeit* argument set to ``0``. + + +.. cfunction:: int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit) + + This is a simplified interface to :cfunc:`PyRun_AnyFileExFlags` below, leaving + the *flags* argument set to *NULL*. + + +.. cfunction:: int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags) + + If *fp* refers to a file associated with an interactive device (console or + terminal input or Unix pseudo-terminal), return the value of + :cfunc:`PyRun_InteractiveLoop`, otherwise return the result of + :cfunc:`PyRun_SimpleFile`. If *filename* is *NULL*, this function uses + ``"???"`` as the filename. + + +.. cfunction:: int PyRun_SimpleString(const char *command) + + This is a simplified interface to :cfunc:`PyRun_SimpleStringFlags` below, + leaving the *PyCompilerFlags\** argument set to NULL. + + +.. cfunction:: int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) + + Executes the Python source code from *command* in the :mod:`__main__` module + according to the *flags* argument. If :mod:`__main__` does not already exist, it + is created. Returns ``0`` on success or ``-1`` if an exception was raised. If + there was an error, there is no way to get the exception information. For the + meaning of *flags*, see below. + + +.. cfunction:: int PyRun_SimpleFile(FILE *fp, const char *filename) + + This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below, + leaving *closeit* set to ``0`` and *flags* set to *NULL*. + + +.. cfunction:: int PyRun_SimpleFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) + + This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below, + leaving *closeit* set to ``0``. + + +.. cfunction:: int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit) + + This is a simplified interface to :cfunc:`PyRun_SimpleFileExFlags` below, + leaving *flags* set to *NULL*. + + +.. cfunction:: int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags) + + Similar to :cfunc:`PyRun_SimpleStringFlags`, but the Python source code is read + from *fp* instead of an in-memory string. *filename* should be the name of the + file. If *closeit* is true, the file is closed before PyRun_SimpleFileExFlags + returns. + + +.. cfunction:: int PyRun_InteractiveOne(FILE *fp, const char *filename) + + This is a simplified interface to :cfunc:`PyRun_InteractiveOneFlags` below, + leaving *flags* set to *NULL*. + + +.. cfunction:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) + + Read and execute a single statement from a file associated with an interactive + device according to the *flags* argument. If *filename* is *NULL*, ``"???"`` is + used instead. The user will be prompted using ``sys.ps1`` and ``sys.ps2``. + Returns ``0`` when the input was executed successfully, ``-1`` if there was an + exception, or an error code from the :file:`errcode.h` include file distributed + as part of Python if there was a parse error. (Note that :file:`errcode.h` is + not included by :file:`Python.h`, so must be included specifically if needed.) + + +.. cfunction:: int PyRun_InteractiveLoop(FILE *fp, const char *filename) + + This is a simplified interface to :cfunc:`PyRun_InteractiveLoopFlags` below, + leaving *flags* set to *NULL*. + + +.. cfunction:: int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) + + Read and execute statements from a file associated with an interactive device + until EOF is reached. If *filename* is *NULL*, ``"???"`` is used instead. The + user will be prompted using ``sys.ps1`` and ``sys.ps2``. Returns ``0`` at EOF. + + +.. cfunction:: struct _node* PyParser_SimpleParseString(const char *str, int start) + + This is a simplified interface to + :cfunc:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set + to *NULL* and *flags* set to ``0``. + + +.. cfunction:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags) + + This is a simplified interface to + :cfunc:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set + to *NULL*. + + +.. cfunction:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags) + + Parse Python source code from *str* using the start token *start* according to + the *flags* argument. The result can be used to create a code object which can + be evaluated efficiently. This is useful if a code fragment must be evaluated + many times. + + +.. cfunction:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) + + This is a simplified interface to :cfunc:`PyParser_SimpleParseFileFlags` below, + leaving *flags* set to ``0`` + + +.. cfunction:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) + + Similar to :cfunc:`PyParser_SimpleParseStringFlagsFilename`, but the Python + source code is read from *fp* instead of an in-memory string. + + +.. cfunction:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) + + This is a simplified interface to :cfunc:`PyRun_StringFlags` below, leaving + *flags* set to *NULL*. + + +.. cfunction:: PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) + + Execute Python source code from *str* in the context specified by the + dictionaries *globals* and *locals* with the compiler flags specified by + *flags*. The parameter *start* specifies the start token that should be used to + parse the source code. + + Returns the result of executing the code as a Python object, or *NULL* if an + exception was raised. + + +.. cfunction:: PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals) + + This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving + *closeit* set to ``0`` and *flags* set to *NULL*. + + +.. cfunction:: PyObject* PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit) + + This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving + *flags* set to *NULL*. + + +.. cfunction:: PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) + + This is a simplified interface to :cfunc:`PyRun_FileExFlags` below, leaving + *closeit* set to ``0``. + + +.. cfunction:: PyObject* PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit, PyCompilerFlags *flags) + + Similar to :cfunc:`PyRun_StringFlags`, but the Python source code is read from + *fp* instead of an in-memory string. *filename* should be the name of the file. + If *closeit* is true, the file is closed before :cfunc:`PyRun_FileExFlags` + returns. + + +.. cfunction:: PyObject* Py_CompileString(const char *str, const char *filename, int start) + + This is a simplified interface to :cfunc:`Py_CompileStringFlags` below, leaving + *flags* set to *NULL*. + + +.. cfunction:: PyObject* Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags) + + Parse and compile the Python source code in *str*, returning the resulting code + object. The start token is given by *start*; this can be used to constrain the + code which can be compiled and should be :const:`Py_eval_input`, + :const:`Py_file_input`, or :const:`Py_single_input`. The filename specified by + *filename* is used to construct the code object and may appear in tracebacks or + :exc:`SyntaxError` exception messages. This returns *NULL* if the code cannot + be parsed or compiled. + + +.. cvar:: int Py_eval_input + + .. index:: single: Py_CompileString() + + The start symbol from the Python grammar for isolated expressions; for use with + :cfunc:`Py_CompileString`. + + +.. cvar:: int Py_file_input + + .. index:: single: Py_CompileString() + + The start symbol from the Python grammar for sequences of statements as read + from a file or other source; for use with :cfunc:`Py_CompileString`. This is + the symbol to use when compiling arbitrarily long Python source code. + + +.. cvar:: int Py_single_input + + .. index:: single: Py_CompileString() + + The start symbol from the Python grammar for a single statement; for use with + :cfunc:`Py_CompileString`. This is the symbol used for the interactive + interpreter loop. + + +.. ctype:: struct PyCompilerFlags + + This is the structure used to hold compiler flags. In cases where code is only + being compiled, it is passed as ``int flags``, and in cases where code is being + executed, it is passed as ``PyCompilerFlags *flags``. In this case, ``from + __future__ import`` can modify *flags*. + + Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as + equal to ``0``, and any modification due to ``from __future__ import`` is + discarded. :: + + struct PyCompilerFlags { + int cf_flags; + } + + +.. cvar:: int CO_FUTURE_DIVISION + + This bit can be set in *flags* to cause division operator ``/`` to be + interpreted as "true division" according to :pep:`238`. + diff --git a/Doc/conf.py b/Doc/conf.py new file mode 100644 index 0000000..6736f53 --- /dev/null +++ b/Doc/conf.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# +# Python documentation build configuration file +# +# The contents of this file are pickled, so don't put values in the namespace +# that aren't pickleable (module imports are okay, they're removed automatically). +# + +# The default replacements for |version| and |release|. +# If 'auto', Sphinx looks for the Include/patchlevel.h file in the current Python +# source tree and replaces the values accordingly. +# +# The short X.Y version. +# version = '2.6' +version = 'auto' +# The full version, including alpha/beta/rc tags. +# release = '2.6a0' +release = 'auto' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%B %d, %Y' + +# The base URL for download links. +download_base_url = 'http://docs.python.org/ftp/python/doc/' + +# List of files that shouldn't be included in the build. +unused_files = [ + 'whatsnew/2.0.rst', + 'whatsnew/2.1.rst', + 'whatsnew/2.2.rst', + 'whatsnew/2.3.rst', + 'whatsnew/2.4.rst', + 'whatsnew/2.5.rst', + 'whatsnew/2.6.rst', + 'maclib/scrap.rst', + 'library/xmllib.rst', + 'library/xml.etree.rst', +] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +last_updated_format = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +use_smartypants = True + +# If true, '()' will be appended to :func: etc. cross-reference text. +add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = True diff --git a/Doc/contents.rst b/Doc/contents.rst new file mode 100644 index 0000000..59a72fa --- /dev/null +++ b/Doc/contents.rst @@ -0,0 +1,21 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Python Documentation contents +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +.. toctree:: + + whatsnew/3.0.rst + tutorial/index.rst + reference/index.rst + library/index.rst + extending/index.rst + c-api/index.rst + distutils/index.rst + install/index.rst + documenting/index.rst + howto/index.rst + + about.rst + bugs.rst + copyright.rst + license.rst diff --git a/Doc/copyright.rst b/Doc/copyright.rst new file mode 100644 index 0000000..9a472af --- /dev/null +++ b/Doc/copyright.rst @@ -0,0 +1,19 @@ +********* +Copyright +********* + +Python and this documentation is: + +Copyright © 2001-2007 Python Software Foundation. All rights reserved. + +Copyright © 2000 BeOpen.com. All rights reserved. + +Copyright © 1995-2000 Corporation for National Research Initiatives. All rights +reserved. + +Copyright © 1991-1995 Stichting Mathematisch Centrum. All rights reserved. + +------- + +See :ref:`history-and-license` for complete license and permissions information. + diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat new file mode 100644 index 0000000..5cb0b7a --- /dev/null +++ b/Doc/data/refcounts.dat @@ -0,0 +1,1747 @@ +# Created by Skip Montanaro . + +# Format: +# function ':' type ':' [param name] ':' [refcount effect] ':' [comment] +# If the param name slot is empty, that line corresponds to the function's +# return value, otherwise it's the type of the named parameter. + +# The first line of a function block gives type/refcount information for the +# function's return value. Successive lines with the same function name +# correspond to the function's parameter list and appear in the order the +# parameters appear in the function's prototype. + +# For readability, each function's lines are surrounded by a blank line. +# The blocks are sorted alphabetically by function name. + +# Refcount behavior is given for all PyObject* types: 0 (no change), +1 +# (increment) and -1 (decrement). A blank refcount field indicates the +# parameter or function value is not a PyObject* and is therefore not +# subject to reference counting. A special case for the value "null" +# (without quotes) is used for functions which return a PyObject* type but +# always return NULL. This is used by some of the PyErr_*() functions, in +# particular. + +# XXX NOTE: the 0/+1/-1 refcount information for arguments is +# confusing! Much more useful would be to indicate whether the +# function "steals" a reference to the argument or not. Take for +# example PyList_SetItem(list, i, item). This lists as a 0 change for +# both the list and the item arguments. However, in fact it steals a +# reference to the item argument! + +# The parameter names are as they appear in the API manual, not the source +# code. + +PyBool_FromLong:PyObject*::+1: +PyBool_FromLong:long:v:0: + +PyBuffer_FromObject:PyObject*::+1: +PyBuffer_FromObject:PyObject*:base:+1: +PyBuffer_FromObject:int:offset:: +PyBuffer_FromObject:int:size:: + +PyBuffer_FromReadWriteObject:PyObject*::+1: +PyBuffer_FromReadWriteObject:PyObject*:base:+1: +PyBuffer_FromReadWriteObject:int:offset:: +PyBuffer_FromReadWriteObject:int:size:: + +PyBuffer_FromMemory:PyObject*::+1: +PyBuffer_FromMemory:void*:ptr:: +PyBuffer_FromMemory:int:size:: + +PyBuffer_FromReadWriteMemory:PyObject*::+1: +PyBuffer_FromReadWriteMemory:void*:ptr:: +PyBuffer_FromReadWriteMemory:int:size:: + +PyBuffer_New:PyObject*::+1: +PyBuffer_New:int:size:: + +PyCObject_AsVoidPtr:void*::: +PyCObject_AsVoidPtr:PyObject*:self:0: + +PyCObject_FromVoidPtr:PyObject*::+1: +PyCObject_FromVoidPtr:void*:cobj:: +PyCObject_FromVoidPtr::void (* destr)(void* ):: + +PyCObject_FromVoidPtrAndDesc:PyObject*::+1: +PyCObject_FromVoidPtrAndDesc:void*:cobj:: +PyCObject_FromVoidPtrAndDesc:void*:desc:: +PyCObject_FromVoidPtrAndDesc:void(*)(void*,void*):destr:: + +PyCObject_GetDesc:void*::: +PyCObject_GetDesc:PyObject*:self:0: + +PyCell_New:PyObject*::+1: +PyCell_New:PyObject*:ob:0: + +PyCell_GET:PyObject*::0: +PyCell_GET:PyObject*:ob:0: + +PyCell_Get:PyObject*::+1: +PyCell_Get:PyObject*:cell:0: + +PyCell_SET:void::: +PyCell_SET:PyObject*:cell:0: +PyCell_SET:PyObject*:value:0: + +PyCell_Set:int::: +PyCell_Set:PyObject*:cell:0: +PyCell_Set:PyObject*:value:0: + +PyCallIter_New:PyObject*::+1: +PyCallIter_New:PyObject*:callable:: +PyCallIter_New:PyObject*:sentinel:: + +PyCallable_Check:int::: +PyCallable_Check:PyObject*:o:0: + +PyComplex_AsCComplex:Py_complex::: +PyComplex_AsCComplex:PyObject*:op:0: + +PyComplex_Check:int::: +PyComplex_Check:PyObject*:p:0: + +PyComplex_FromCComplex:PyObject*::+1: +PyComplex_FromCComplex::Py_complex v:: + +PyComplex_FromDoubles:PyObject*::+1: +PyComplex_FromDoubles::double real:: +PyComplex_FromDoubles::double imag:: + +PyComplex_ImagAsDouble:double::: +PyComplex_ImagAsDouble:PyObject*:op:0: + +PyComplex_RealAsDouble:double::: +PyComplex_RealAsDouble:PyObject*:op:0: + +PyDate_FromDate:PyObject*::+1: +PyDate_FromDate:int:year:: +PyDate_FromDate:int:month:: +PyDate_FromDate:int:day:: + +PyDate_FromTimestamp:PyObject*::+1: +PyDate_FromTimestamp:PyObject*:args:0: + +PyDateTime_FromDateAndTime:PyObject*::+1: +PyDateTime_FromDateAndTime:int:year:: +PyDateTime_FromDateAndTime:int:month:: +PyDateTime_FromDateAndTime:int:day:: +PyDateTime_FromDateAndTime:int:hour:: +PyDateTime_FromDateAndTime:int:minute:: +PyDateTime_FromDateAndTime:int:second:: +PyDateTime_FromDateAndTime:int:usecond:: + +PyDateTime_FromTimestamp:PyObject*::+1: +PyDateTime_FromTimestamp:PyObject*:args:0: + +PyDelta_FromDSU:PyObject*::+1: +PyDelta_FromDSU:int:days:: +PyDelta_FromDSU:int:seconds:: +PyDelta_FromDSU:int:useconds:: + +PyDescr_NewClassMethod:PyObject*::+1: +PyDescr_NewClassMethod:PyTypeObject*:type:: +PyDescr_NewClassMethod:PyMethodDef*:method:: + +PyDescr_NewGetSet:PyObject*::+1: +PyDescr_NewGetSet:PyTypeObject*:type:: +PyDescr_NewGetSet:PyGetSetDef*:getset:: + +PyDescr_NewMember:PyObject*::+1: +PyDescr_NewMember:PyTypeObject*:type:: +PyDescr_NewMember:PyMemberDef*:member:: + +PyDescr_NewMethod:PyObject*::+1: +PyDescr_NewMethod:PyTypeObject*:type:: +PyDescr_NewMethod:PyMethodDef*:meth:: + +PyDescr_NewWrapper:PyObject*::+1: +PyDescr_NewWrapper:PyTypeObject*:type:: +PyDescr_NewWrapper:struct wrapperbase*:base:: +PyDescr_NewWrapper:void*:wrapped:: + +PyDict_Check:int::: +PyDict_Check:PyObject*:p:0: + +PyDict_Clear:void::: +PyDict_Clear:PyObject*:p:0: + +PyDict_DelItem:int::: +PyDict_DelItem:PyObject*:p:0: +PyDict_DelItem:PyObject*:key:0: + +PyDict_DelItemString:int::: +PyDict_DelItemString:PyObject*:p:0: +PyDict_DelItemString:char*:key:: + +PyDict_GetItem:PyObject*::0:0 +PyDict_GetItem:PyObject*:p:0: +PyDict_GetItem:PyObject*:key:0: + +PyDict_GetItemString:PyObject*::0: +PyDict_GetItemString:PyObject*:p:0: +PyDict_GetItemString:char*:key:: + +PyDict_Items:PyObject*::+1: +PyDict_Items:PyObject*:p:0: + +PyDict_Keys:PyObject*::+1: +PyDict_Keys:PyObject*:p:0: + +PyDict_New:PyObject*::+1: + +PyDict_Copy:PyObject*::+1: +PyDict_Copy:PyObject*:p:0: + +PyDict_Next:int::: +PyDict_Next:PyObject*:p:0: +PyDict_Next:int:ppos:: +PyDict_Next:PyObject**:pkey:0: +PyDict_Next:PyObject**:pvalue:0: + +PyDict_SetItem:int::: +PyDict_SetItem:PyObject*:p:0: +PyDict_SetItem:PyObject*:key:+1: +PyDict_SetItem:PyObject*:val:+1: + +PyDict_SetItemString:int::: +PyDict_SetItemString:PyObject*:p:0: +PyDict_SetItemString:char*:key:: +PyDict_SetItemString:PyObject*:val:+1: + +PyDict_Size:int::: +PyDict_Size:PyObject*:p:: + +PyDict_Values:PyObject*::+1: +PyDict_Values:PyObject*:p:0: + +PyDictProxy_New:PyObject*::+1: +PyDictProxy_New:PyObject*:dict:0: + +PyErr_BadArgument:int::: + +PyErr_BadInternalCall:void::: + +PyErr_CheckSignals:int::: + +PyErr_Clear:void::: + +PyErr_ExceptionMatches:int::: +PyErr_ExceptionMatches:PyObject*:exc:0: + +PyErr_Fetch:void::: +PyErr_Fetch:PyObject**:ptype:0: +PyErr_Fetch:PyObject**:pvalue:0: +PyErr_Fetch:PyObject**:ptraceback:0: + +PyErr_GivenExceptionMatches:int::: +PyErr_GivenExceptionMatches:PyObject*:given:0: +PyErr_GivenExceptionMatches:PyObject*:exc:0: + +PyErr_NewException:PyObject*::+1: +PyErr_NewException:char*:name:: +PyErr_NewException:PyObject*:base:0: +PyErr_NewException:PyObject*:dict:0: + +PyErr_NoMemory:PyObject*::null: + +PyErr_NormalizeException:void::: +PyErr_NormalizeException:PyObject**:exc::??? +PyErr_NormalizeException:PyObject**:val::??? +PyErr_NormalizeException:PyObject**:tb::??? + +PyErr_Occurred:PyObject*::0: + +PyErr_Print:void::: + +PyErr_Restore:void::: +PyErr_Restore:PyObject*:type:-1: +PyErr_Restore:PyObject*:value:-1: +PyErr_Restore:PyObject*:traceback:-1: + +PyErr_SetExcFromWindowsErr:PyObject*::null: +PyErr_SetExcFromWindowsErr:PyObject*:type:0: +PyErr_SetExcFromWindowsErr:int:ierr:: + +PyErr_SetExcFromWindowsErrWithFilename:PyObject*::null: +PyErr_SetExcFromWindowsErrWithFilename:PyObject*:type:0: +PyErr_SetExcFromWindowsErrWithFilename:int:ierr:: +PyErr_SetExcFromWindowsErrWithFilename:char*:filename:: + +PyErr_SetFromErrno:PyObject*::null: +PyErr_SetFromErrno:PyObject*:type:0: + +PyErr_SetFromErrnoWithFilename:PyObject*::null: +PyErr_SetFromErrnoWithFilename:PyObject*:type:0: +PyErr_SetFromErrnoWithFilename:char*:filename:: + +PyErr_SetFromWindowsErr:PyObject*::null: +PyErr_SetFromWindowsErr:int:ierr:: + +PyErr_SetFromWindowsErrWithFilename:PyObject*::null: +PyErr_SetFromWindowsErrWithFilename:int:ierr:: +PyErr_SetFromWindowsErrWithFilename:char*:filename:: + +PyErr_SetInterrupt:void::: + +PyErr_SetNone:void::: +PyErr_SetNone:PyObject*:type:+1: + +PyErr_SetObject:void::: +PyErr_SetObject:PyObject*:type:+1: +PyErr_SetObject:PyObject*:value:+1: + +PyErr_SetString:void::: +PyErr_SetString:PyObject*:type:+1: +PyErr_SetString:char*:message:: + +PyErr_Format:PyObject*::null: +PyErr_Format:PyObject*:exception:+1: +PyErr_Format:char*:format:: +PyErr_Format::...:: + +PyErr_WarnEx:int::: +PyErr_WarnEx:PyObject*:category:0: +PyErr_WarnEx:const char*:message:: +PyErr_WarnEx:Py_ssize_t:stack_level:: + +PyEval_AcquireLock:void::: + +PyEval_AcquireThread:void::: +PyEval_AcquireThread:PyThreadState*:tstate:: + +PyEval_InitThreads:void::: + +PyEval_ReleaseLock:void::: + +PyEval_ReleaseThread:void::: +PyEval_ReleaseThread:PyThreadState*:tstate:: + +PyEval_RestoreThread:void::: +PyEval_RestoreThread:PyThreadState*:tstate:: + +PyEval_SaveThread:PyThreadState*::: + +PyEval_EvalCode:PyObject*::+1: +PyEval_EvalCode:PyCodeObject*:co:0: +PyEval_EvalCode:PyObject*:globals:0: +PyEval_EvalCode:PyObject*:locals:0: + +PyFile_AsFile:FILE*::: +PyFile_AsFile:PyFileObject*:p:0: + +PyFile_Check:int::: +PyFile_Check:PyObject*:p:0: + +PyFile_FromFile:PyObject*::+1: +PyFile_FromFile:FILE*:fp:: +PyFile_FromFile:char*:name:: +PyFile_FromFile:char*:mode:: +PyFile_FromFile:int(*:close):: + +PyFile_FromString:PyObject*::+1: +PyFile_FromString:char*:name:: +PyFile_FromString:char*:mode:: + +PyFile_GetLine:PyObject*::+1: +PyFile_GetLine:PyObject*:p:: +PyFile_GetLine:int:n:: + +PyFile_Name:PyObject*::0: +PyFile_Name:PyObject*:p:0: + +PyFile_SetBufSize:void::: +PyFile_SetBufSize:PyFileObject*:p:0: +PyFile_SetBufSize:int:n:: + +PyFile_SoftSpace:int::: +PyFile_SoftSpace:PyFileObject*:p:0: +PyFile_SoftSpace:int:newflag:: + +PyFile_WriteObject:int::: +PyFile_WriteObject:PyObject*:obj:0: +PyFile_WriteObject:PyFileObject*:p:0: +PyFile_WriteObject:int:flags:: + +PyFile_WriteString:int::: +PyFile_WriteString:const char*:s:: +PyFile_WriteString:PyFileObject*:p:0: +PyFile_WriteString:int:flags:: + +PyFloat_AS_DOUBLE:double::: +PyFloat_AS_DOUBLE:PyObject*:pyfloat:0: + +PyFloat_AsDouble:double::: +PyFloat_AsDouble:PyObject*:pyfloat:0: + +PyFloat_Check:int::: +PyFloat_Check:PyObject*:p:0: + +PyFloat_FromDouble:PyObject*::+1: +PyFloat_FromDouble:double:v:: + +PyFloat_FromString:PyObject*::+1: +PyFloat_FromString:PyObject*:str:0: + +PyFrozenSet_New:PyObject*::+1: +PyFrozenSet_New:PyObject*:iterable:0: + +PyFunction_GetClosure:PyObject*::0: +PyFunction_GetClosure:PyObject*:op:0: + +PyFunction_GetCode:PyObject*::0: +PyFunction_GetCode:PyObject*:op:0: + +PyFunction_GetDefaults:PyObject*::0: +PyFunction_GetDefaults:PyObject*:op:0: + +PyFunction_GetGlobals:PyObject*::0: +PyFunction_GetGlobals:PyObject*:op:0: + +PyFunction_GetModule:PyObject*::0: +PyFunction_GetModule:PyObject*:op:0: + +PyFunction_New:PyObject*::+1: +PyFunction_New:PyObject*:code:+1: +PyFunction_New:PyObject*:globals:+1: + +PyFunction_SetClosure:int::: +PyFunction_SetClosure:PyObject*:op:0: +PyFunction_SetClosure:PyObject*:closure:+1: + +PyFunction_SetDefaults:int::: +PyFunction_SetDefaults:PyObject*:op:0: +PyFunction_SetDefaults:PyObject*:defaults:+1: + +PyGen_New:PyObject*::+1: +PyGen_New:PyFrameObject*:frame:0: + +Py_InitModule:PyObject*::0: +Py_InitModule:char*:name:: +Py_InitModule:PyMethodDef[]:methods:: + +Py_InitModule3:PyObject*::0: +Py_InitModule3:char*:name:: +Py_InitModule3:PyMethodDef[]:methods:: +Py_InitModule3:char*:doc:: + +Py_InitModule4:PyObject*::0: +Py_InitModule4:char*:name:: +Py_InitModule4:PyMethodDef[]:methods:: +Py_InitModule4:char*:doc:: +Py_InitModule4:PyObject*:self:: +Py_InitModule4:int:apiver::usually provided by Py_InitModule or Py_InitModule3 + +PyImport_AddModule:PyObject*::0:reference borrowed from sys.modules +PyImport_AddModule:char*:name:: + +PyImport_Cleanup:void::: + +PyImport_ExecCodeModule:PyObject*::+1: +PyImport_ExecCodeModule:char*:name:: +PyImport_ExecCodeModule:PyObject*:co:0: + +PyImport_GetMagicNumber:long::: + +PyImport_GetModuleDict:PyObject*::0: + +PyImport_Import:PyObject*::+1: +PyImport_Import:PyObject*:name:0: + +PyImport_ImportFrozenModule:int::: +PyImport_ImportFrozenModule:char*::: + +PyImport_ImportModule:PyObject*::+1: +PyImport_ImportModule:char*:name:: + +PyImport_ImportModuleEx:PyObject*::+1: +PyImport_ImportModuleEx:char*:name:: +PyImport_ImportModuleEx:PyObject*:globals:0:??? +PyImport_ImportModuleEx:PyObject*:locals:0:??? +PyImport_ImportModuleEx:PyObject*:fromlist:0:??? + +PyImport_ReloadModule:PyObject*::+1: +PyImport_ReloadModule:PyObject*:m:0: + +PyInstance_New:PyObject*::+1: +PyInstance_New:PyObject*:klass:+1: +PyInstance_New:PyObject*:arg:0: +PyInstance_New:PyObject*:kw:0: + +PyInstance_NewRaw:PyObject*::+1: +PyInstance_NewRaw:PyObject*:klass:+1: +PyInstance_NewRaw:PyObject*:dict:+1: + +PyInt_AS_LONG:long::: +PyInt_AS_LONG:PyIntObject*:io:0: + +PyInt_AsLong:long::: +PyInt_AsLong:PyObject*:io:0: + +PyInt_Check:int::: +PyInt_Check:PyObject*:op:0: + +PyInt_FromLong:PyObject*::+1: +PyInt_FromLong:long:ival:: + +PyInt_FromString:PyObject*::+1: +PyInt_FromString:char*:str:0: +PyInt_FromString:char**:pend:0: +PyInt_FromString:int:base:0: + +PyInt_FromSsize_t:PyObject*::+1: +PyInt_FromSsize_t:Py_ssize_t:ival:: + +PyInt_GetMax:long::: + +PyInterpreterState_Clear:void::: +PyInterpreterState_Clear:PyInterpreterState*:interp:: + +PyInterpreterState_Delete:void::: +PyInterpreterState_Delete:PyInterpreterState*:interp:: + +PyInterpreterState_New:PyInterpreterState*::: + +PyIter_Check:int:o:0: + +PyIter_Next:PyObject*::+1: +PyIter_Next:PyObject*:o:0: + +PyList_Append:int::: +PyList_Append:PyObject*:list:0: +PyList_Append:PyObject*:item:+1: + +PyList_AsTuple:PyObject*::+1: +PyList_AsTuple:PyObject*:list:0: + +PyList_Check:int::: +PyList_Check:PyObject*:p:0: + +PyList_GET_ITEM:PyObject*::0: +PyList_GET_ITEM:PyObject*:list:0: +PyList_GET_ITEM:int:i:0: + +PyList_GET_SIZE:int::: +PyList_GET_SIZE:PyObject*:list:0: + +PyList_GetItem:PyObject*::0: +PyList_GetItem:PyObject*:list:0: +PyList_GetItem:int:index:: + +PyList_GetSlice:PyObject*::+1: +PyList_GetSlice:PyObject*:list:0: +PyList_GetSlice:int:low:: +PyList_GetSlice:int:high:: + +PyList_Insert:int::: +PyList_Insert:PyObject*:list:0: +PyList_Insert:int:index:: +PyList_Insert:PyObject*:item:+1: + +PyList_New:PyObject*::+1: +PyList_New:int:len:: + +PyList_Reverse:int::: +PyList_Reverse:PyObject*:list:0: + +PyList_SET_ITEM:void::: +PyList_SET_ITEM:PyObject*:list:0: +PyList_SET_ITEM:int:i:: +PyList_SET_ITEM:PyObject*:o:0: + +PyList_SetItem:int::: +PyList_SetItem:PyObject*:list:0: +PyList_SetItem:int:index:: +PyList_SetItem:PyObject*:item:0: + +PyList_SetSlice:int::: +PyList_SetSlice:PyObject*:list:0: +PyList_SetSlice:int:low:: +PyList_SetSlice:int:high:: +PyList_SetSlice:PyObject*:itemlist:0:but increfs its elements? + +PyList_Size:int::: +PyList_Size:PyObject*:list:0: + +PyList_Sort:int::: +PyList_Sort:PyObject*:list:0: + +PyLong_AsDouble:double::: +PyLong_AsDouble:PyObject*:pylong:0: + +PyLong_AsLong:long::: +PyLong_AsLong:PyObject*:pylong:0: + +PyLong_AsUnsignedLong:unsigned long::: +PyLong_AsUnsignedLong:PyObject*:pylong:0: + +PyLong_Check:int::: +PyLong_Check:PyObject*:p:0: + +PyLong_FromDouble:PyObject*::+1: +PyLong_FromDouble:double:v:: + +PyLong_FromLong:PyObject*::+1: +PyLong_FromLong:long:v:: + +PyLong_FromLongLong:PyObject*::+1: +PyLong_FromLongLong:long long:v:: + +PyLong_FromUnsignedLongLong:PyObject*::+1: +PyLong_FromUnsignedLongLong:unsigned long long:v:: + +PyLong_FromString:PyObject*::+1: +PyLong_FromString:char*:str:: +PyLong_FromString:char**:pend:: +PyLong_FromString:int:base:: + +PyLong_FromUnicode:PyObject*::+1: +PyLong_FromUnicode:Py_UNICODE:u:: +PyLong_FromUnicode:int:length:: +PyLong_FromUnicode:int:base:: + +PyLong_FromUnsignedLong:PyObject*::+1: +PyLong_FromUnsignedLong:unsignedlong:v:: + +PyLong_FromVoidPtr:PyObject*::+1: +PyLong_FromVoidPtr:void*:p:: + +PyMapping_Check:int::: +PyMapping_Check:PyObject*:o:0: + +PyMapping_DelItem:int::: +PyMapping_DelItem:PyObject*:o:0: +PyMapping_DelItem:PyObject*:key:0: + +PyMapping_DelItemString:int::: +PyMapping_DelItemString:PyObject*:o:0: +PyMapping_DelItemString:char*:key:: + +PyMapping_GetItemString:PyObject*::+1: +PyMapping_GetItemString:PyObject*:o:0: +PyMapping_GetItemString:char*:key:: + +PyMapping_HasKey:int::: +PyMapping_HasKey:PyObject*:o:0: +PyMapping_HasKey:PyObject*:key:: + +PyMapping_HasKeyString:int::: +PyMapping_HasKeyString:PyObject*:o:0: +PyMapping_HasKeyString:char*:key:: + +PyMapping_Items:PyObject*::+1: +PyMapping_Items:PyObject*:o:0: + +PyMapping_Keys:PyObject*::+1: +PyMapping_Keys:PyObject*:o:0: + +PyMapping_Length:int::: +PyMapping_Length:PyObject*:o:0: + +PyMapping_SetItemString:int::: +PyMapping_SetItemString:PyObject*:o:0: +PyMapping_SetItemString:char*:key:: +PyMapping_SetItemString:PyObject*:v:+1: + +PyMapping_Values:PyObject*::+1: +PyMapping_Values:PyObject*:o:0: + +PyMarshal_ReadLastObjectFromFile:PyObject*::+1: +PyMarshal_ReadLastObjectFromFile:FILE*:file:: + +PyMarshal_ReadObjectFromFile:PyObject*::+1: +PyMarshal_ReadObjectFromFile:FILE*:file:: + +PyMarshal_ReadObjectFromString:PyObject*::+1: +PyMarshal_ReadObjectFromString:char*:string:: +PyMarshal_ReadObjectFromString:int:len:: + +PyMarshal_WriteObjectToString:PyObject*::+1: +PyMarshal_WriteObjectToString:PyObject*:value:0: + +PyMethod_Class:PyObject*::0: +PyMethod_Class:PyObject*:im:0: + +PyMethod_Function:PyObject*::0: +PyMethod_Function:PyObject*:im:0: + +PyMethod_GET_CLASS:PyObject*::0: +PyMethod_GET_CLASS:PyObject*:im:0: + +PyMethod_GET_FUNCTION:PyObject*::0: +PyMethod_GET_FUNCTION:PyObject*:im:0: + +PyMethod_GET_SELF:PyObject*::0: +PyMethod_GET_SELF:PyObject*:im:0: + +PyMethod_New:PyObject*::+1: +PyMethod_New:PyObject*:func:0: +PyMethod_New:PyObject*:self:0: +PyMethod_New:PyObject*:class:0: + +PyMethod_Self:PyObject*::0: +PyMethod_Self:PyObject*:im:0: + +PyModule_GetDict:PyObject*::0: +PyModule_GetDict::PyObject* module:0: + +PyModule_GetFilename:char*::: +PyModule_GetFilename:PyObject*:module:0: + +PyModule_GetName:char*::: +PyModule_GetName:PyObject*:module:0: + +PyModule_New:PyObject*::+1: +PyModule_New::char* name:: + +PyNumber_Absolute:PyObject*::+1: +PyNumber_Absolute:PyObject*:o:0: + +PyNumber_Add:PyObject*::+1: +PyNumber_Add:PyObject*:o1:0: +PyNumber_Add:PyObject*:o2:0: + +PyNumber_And:PyObject*::+1: +PyNumber_And:PyObject*:o1:0: +PyNumber_And:PyObject*:o2:0: + +PyNumber_Check:PyObject*:o:0: +PyNumber_Check:int::: + +PyNumber_Divide:PyObject*::+1: +PyNumber_Divide:PyObject*:o1:0: +PyNumber_Divide:PyObject*:o2:0: + +PyNumber_Divmod:PyObject*::+1: +PyNumber_Divmod:PyObject*:o1:0: +PyNumber_Divmod:PyObject*:o2:0: + +PyNumber_Float:PyObject*::+1: +PyNumber_Float:PyObject*:o:0: + +PyNumber_FloorDivide:PyObject*::+1: +PyNumber_FloorDivide:PyObject*:v:0: +PyNumber_FloorDivide:PyObject*:w:0: + +PyNumber_InPlaceAdd:PyObject*::+1: +PyNumber_InPlaceAdd:PyObject*:v:0: +PyNumber_InPlaceAdd:PyObject*:w:0: + +PyNumber_InPlaceAnd:PyObject*::+1: +PyNumber_InPlaceAnd:PyObject*:v:0: +PyNumber_InPlaceAnd:PyObject*:w:0: + +PyNumber_InPlaceDivide:PyObject*::+1: +PyNumber_InPlaceDivide:PyObject*:v:0: +PyNumber_InPlaceDivide:PyObject*:w:0: + +PyNumber_InPlaceFloorDivide:PyObject*::+1: +PyNumber_InPlaceFloorDivide:PyObject*:v:0: +PyNumber_InPlaceFloorDivide:PyObject*:w:0: + +PyNumber_InPlaceLshift:PyObject*::+1: +PyNumber_InPlaceLshift:PyObject*:v:0: +PyNumber_InPlaceLshift:PyObject*:w:0: + +PyNumber_InPlaceMultiply:PyObject*::+1: +PyNumber_InPlaceMultiply:PyObject*:v:0: +PyNumber_InPlaceMultiply:PyObject*:w:0: + +PyNumber_InPlaceOr:PyObject*::+1: +PyNumber_InPlaceOr:PyObject*:v:0: +PyNumber_InPlaceOr:PyObject*:w:0: + +PyNumber_InPlacePower:PyObject*::+1: +PyNumber_InPlacePower:PyObject*:v:0: +PyNumber_InPlacePower:PyObject*:w:0: +PyNumber_InPlacePower:PyObject*:z:0: + +PyNumber_InPlaceRemainder:PyObject*::+1: +PyNumber_InPlaceRemainder:PyObject*:v:0: +PyNumber_InPlaceRemainder:PyObject*:w:0: + +PyNumber_InPlaceRshift:PyObject*::+1: +PyNumber_InPlaceRshift:PyObject*:v:0: +PyNumber_InPlaceRshift:PyObject*:w:0: + +PyNumber_InPlaceSubtract:PyObject*::+1: +PyNumber_InPlaceSubtract:PyObject*:v:0: +PyNumber_InPlaceSubtract:PyObject*:w:0: + +PyNumber_InPlaceTrueDivide:PyObject*::+1: +PyNumber_InPlaceTrueDivide:PyObject*:v:0: +PyNumber_InPlaceTrueDivide:PyObject*:w:0: + +PyNumber_InPlaceXor:PyObject*::+1: +PyNumber_InPlaceXor:PyObject*:v:0: +PyNumber_InPlaceXor:PyObject*:w:0: + +PyNumber_Int:PyObject*::+1: +PyNumber_Int:PyObject*:o:0: + +PyNumber_Invert:PyObject*::+1: +PyNumber_Invert:PyObject*:o:0: + +PyNumber_Long:PyObject*::+1: +PyNumber_Long:PyObject*:o:0: + +PyNumber_Lshift:PyObject*::+1: +PyNumber_Lshift:PyObject*:o1:0: +PyNumber_Lshift:PyObject*:o2:0: + +PyNumber_Multiply:PyObject*::+1: +PyNumber_Multiply:PyObject*:o1:0: +PyNumber_Multiply:PyObject*:o2:0: + +PyNumber_Negative:PyObject*::+1: +PyNumber_Negative:PyObject*:o:0: + +PyNumber_Or:PyObject*::+1: +PyNumber_Or:PyObject*:o1:0: +PyNumber_Or:PyObject*:o2:0: + +PyNumber_Positive:PyObject*::+1: +PyNumber_Positive:PyObject*:o:0: + +PyNumber_Power:PyObject*::+1: +PyNumber_Power:PyObject*:o1:0: +PyNumber_Power:PyObject*:o2:0: +PyNumber_Power:PyObject*:o3:0: + +PyNumber_Remainder:PyObject*::+1: +PyNumber_Remainder:PyObject*:o1:0: +PyNumber_Remainder:PyObject*:o2:0: + +PyNumber_Rshift:PyObject*::+1: +PyNumber_Rshift:PyObject*:o1:0: +PyNumber_Rshift:PyObject*:o2:0: + +PyNumber_Subtract:PyObject*::+1: +PyNumber_Subtract:PyObject*:o1:0: +PyNumber_Subtract:PyObject*:o2:0: + +PyNumber_TrueDivide:PyObject*::+1: +PyNumber_TrueDivide:PyObject*:v:0: +PyNumber_TrueDivide:PyObject*:w:0: + +PyNumber_Xor:PyObject*::+1: +PyNumber_Xor:PyObject*:o1:0: +PyNumber_Xor:PyObject*:o2:0: + +PyOS_GetLastModificationTime:long::: +PyOS_GetLastModificationTime:char*:filename:: + +PyObject_AsFileDescriptor:int::: +PyObject_AsFileDescriptor:PyObject*:o:0: + +PyObject_Call:PyObject*::+1: +PyObject_Call:PyObject*:callable_object:0: +PyObject_Call:PyObject*:args:0: +PyObject_Call:PyObject*:kw:0: + +PyObject_CallFunction:PyObject*::+1: +PyObject_CallFunction:PyObject*:callable_object:0: +PyObject_CallFunction:char*:format:: +PyObject_CallFunction::...:: + +PyObject_CallFunctionObjArgs:PyObject*::+1: +PyObject_CallFunctionObjArgs:PyObject*:callable:0: +PyObject_CallFunctionObjArgs::...:: + +PyObject_CallMethod:PyObject*::+1: +PyObject_CallMethod:PyObject*:o:0: +PyObject_CallMethod:char*:m:: +PyObject_CallMethod:char*:format:: +PyObject_CallMethod::...:: + +PyObject_CallMethodObjArgs:PyObject*::+1: +PyObject_CallMethodObjArgs:PyObject*:o:0: +PyObject_CallMethodObjArgs:char*:name:: +PyObject_CallMethodObjArgs::...:: + +PyObject_CallObject:PyObject*::+1: +PyObject_CallObject:PyObject*:callable_object:0: +PyObject_CallObject:PyObject*:args:0: + +PyObject_Cmp:int::: +PyObject_Cmp:PyObject*:o1:0: +PyObject_Cmp:PyObject*:o2:0: +PyObject_Cmp:int*:result:: + +PyObject_Compare:int::: +PyObject_Compare:PyObject*:o1:0: +PyObject_Compare:PyObject*:o2:0: + +PyObject_DelAttr:int::: +PyObject_DelAttr:PyObject*:o:0: +PyObject_DelAttr:PyObject*:attr_name:0: + +PyObject_DelAttrString:int::: +PyObject_DelAttrString:PyObject*:o:0: +PyObject_DelAttrString:char*:attr_name:: + +PyObject_DelItem:int::: +PyObject_DelItem:PyObject*:o:0: +PyObject_DelItem:PyObject*:key:0: + +PyObject_Dir:PyObject*::+1: +PyObject_Dir:PyObject*:o:0: + +PyObject_GetAttr:PyObject*::+1: +PyObject_GetAttr:PyObject*:o:0: +PyObject_GetAttr:PyObject*:attr_name:0: + +PyObject_GetAttrString:PyObject*::+1: +PyObject_GetAttrString:PyObject*:o:0: +PyObject_GetAttrString:char*:attr_name:: + +PyObject_GetItem:PyObject*::+1: +PyObject_GetItem:PyObject*:o:0: +PyObject_GetItem:PyObject*:key:0: + +PyObject_GetIter:PyObject*::+1: +PyObject_GetIter:PyObject*:o:0: + +PyObject_HasAttr:int::: +PyObject_HasAttr:PyObject*:o:0: +PyObject_HasAttr:PyObject*:attr_name:0: + +PyObject_HasAttrString:int::: +PyObject_HasAttrString:PyObject*:o:0: +PyObject_HasAttrString:char*:attr_name:0: + +PyObject_Hash:int::: +PyObject_Hash:PyObject*:o:0: + +PyObject_IsTrue:int::: +PyObject_IsTrue:PyObject*:o:0: + +PyObject_Init:PyObject*::0: +PyObject_Init:PyObject*:op:0: + +PyObject_InitVar:PyVarObject*::0: +PyObject_InitVar:PyVarObject*:op:0: + +PyObject_Length:int::: +PyObject_Length:PyObject*:o:0: + +PyObject_NEW:PyObject*::+1: + +PyObject_New:PyObject*::+1: + +PyObject_NEW_VAR:PyObject*::+1: + +PyObject_NewVar:PyObject*::+1: + +PyObject_Print:int::: +PyObject_Print:PyObject*:o:0: +PyObject_Print:FILE*:fp:: +PyObject_Print:int:flags:: + +PyObject_Repr:PyObject*::+1: +PyObject_Repr:PyObject*:o:0: + +PyObject_RichCompare:PyObject*::+1: +PyObject_RichCompare:PyObject*:o1:0: +PyObject_RichCompare:PyObject*:o2:0: +PyObject_RichCompare:int:opid:: + +PyObject_RichCompareBool:int::: +PyObject_RichCompareBool:PyObject*:o1:0: +PyObject_RichCompareBool:PyObject*:o2:0: +PyObject_RichCompareBool:int:opid:: + +PyObject_SetAttr:int::: +PyObject_SetAttr:PyObject*:o:0: +PyObject_SetAttr:PyObject*:attr_name:0: +PyObject_SetAttr:PyObject*:v:+1: + +PyObject_SetAttrString:int::: +PyObject_SetAttrString:PyObject*:o:0: +PyObject_SetAttrString:char*:attr_name:: +PyObject_SetAttrString:PyObject*:v:+1: + +PyObject_SetItem:int::: +PyObject_SetItem:PyObject*:o:0: +PyObject_SetItem:PyObject*:key:0: +PyObject_SetItem:PyObject*:v:+1: + +PyObject_Str:PyObject*::+1: +PyObject_Str:PyObject*:o:0: + +PyObject_Type:PyObject*::+1: +PyObject_Type:PyObject*:o:0: + +PyObject_Unicode:PyObject*::+1: +PyObject_Unicode:PyObject*:o:0: + +PyParser_SimpleParseFile:struct _node*::: +PyParser_SimpleParseFile:FILE*:fp:: +PyParser_SimpleParseFile:char*:filename:: +PyParser_SimpleParseFile:int:start:: + +PyParser_SimpleParseString:struct _node*::: +PyParser_SimpleParseString:char*:str:: +PyParser_SimpleParseString:int:start:: + +PyRun_AnyFile:int::: +PyRun_AnyFile:FILE*:fp:: +PyRun_AnyFile:char*:filename:: + +PyRun_File:PyObject*::+1:??? -- same as eval_code2() +PyRun_File:FILE*:fp:: +PyRun_File:char*:filename:: +PyRun_File:int:start:: +PyRun_File:PyObject*:globals:0: +PyRun_File:PyObject*:locals:0: + +PyRun_FileEx:PyObject*::+1:??? -- same as eval_code2() +PyRun_FileEx:FILE*:fp:: +PyRun_FileEx:char*:filename:: +PyRun_FileEx:int:start:: +PyRun_FileEx:PyObject*:globals:0: +PyRun_FileEx:PyObject*:locals:0: +PyRun_FileEx:int:closeit:: + +PyRun_FileFlags:PyObject*::+1:??? -- same as eval_code2() +PyRun_FileFlags:FILE*:fp:: +PyRun_FileFlags:char*:filename:: +PyRun_FileFlags:int:start:: +PyRun_FileFlags:PyObject*:globals:0: +PyRun_FileFlags:PyObject*:locals:0: +PyRun_FileFlags:PyCompilerFlags*:flags:: + +PyRun_FileExFlags:PyObject*::+1:??? -- same as eval_code2() +PyRun_FileExFlags:FILE*:fp:: +PyRun_FileExFlags:char*:filename:: +PyRun_FileExFlags:int:start:: +PyRun_FileExFlags:PyObject*:globals:0: +PyRun_FileExFlags:PyObject*:locals:0: +PyRun_FileExFlags:int:closeit:: +PyRun_FileExFlags:PyCompilerFlags*:flags:: + +PyRun_InteractiveLoop:int::: +PyRun_InteractiveLoop:FILE*:fp:: +PyRun_InteractiveLoop:char*:filename:: + +PyRun_InteractiveOne:int::: +PyRun_InteractiveOne:FILE*:fp:: +PyRun_InteractiveOne:char*:filename:: + +PyRun_SimpleFile:int::: +PyRun_SimpleFile:FILE*:fp:: +PyRun_SimpleFile:char*:filename:: + +PyRun_SimpleString:int::: +PyRun_SimpleString:char*:command:: + +PyRun_String:PyObject*::+1:??? -- same as eval_code2() +PyRun_String:char*:str:: +PyRun_String:int:start:: +PyRun_String:PyObject*:globals:0: +PyRun_String:PyObject*:locals:0: + +PyRun_StringFlags:PyObject*::+1:??? -- same as eval_code2() +PyRun_StringFlags:char*:str:: +PyRun_StringFlags:int:start:: +PyRun_StringFlags:PyObject*:globals:0: +PyRun_StringFlags:PyObject*:locals:0: +PyRun_StringFlags:PyCompilerFlags*:flags:: + +PySeqIter_New:PyObject*::+1: +PySeqIter_New:PyObject*:seq:: + +PySequence_Check:int::: +PySequence_Check:PyObject*:o:0: + +PySequence_Concat:PyObject*::+1: +PySequence_Concat:PyObject*:o1:0: +PySequence_Concat:PyObject*:o2:0: + +PySequence_Count:int::: +PySequence_Count:PyObject*:o:0: +PySequence_Count:PyObject*:value:0: + +PySequence_DelItem:int::: +PySequence_DelItem:PyObject*:o:0: +PySequence_DelItem:int:i:: + +PySequence_DelSlice:int::: +PySequence_DelSlice:PyObject*:o:0: +PySequence_DelSlice:int:i1:: +PySequence_DelSlice:int:i2:: + +PySequence_Fast:PyObject*::+1: +PySequence_Fast:PyObject*:v:0: +PySequence_Fast:const char*:m:: + +PySequence_Fast_GET_ITEM:PyObject*::0: +PySequence_Fast_GET_ITEM:PyObject*:o:0: +PySequence_Fast_GET_ITEM:int:i:: + +PySequence_GetItem:PyObject*::+1: +PySequence_GetItem:PyObject*:o:0: +PySequence_GetItem:int:i:: + +PySequence_GetSlice:PyObject*::+1: +PySequence_GetSlice:PyObject*:o:0: +PySequence_GetSlice:int:i1:: +PySequence_GetSlice:int:i2:: + +PySequence_In:int::: +PySequence_In:PyObject*:o:0: +PySequence_In:PyObject*:value:0: + +PySequence_Index:int::: +PySequence_Index:PyObject*:o:0: +PySequence_Index:PyObject*:value:0: + +PySequence_InPlaceConcat:PyObject*::+1: +PySequence_InPlaceConcat:PyObject*:s:0: +PySequence_InPlaceConcat:PyObject*:o:0: + +PySequence_InPlaceRepeat:PyObject*::+1: +PySequence_InPlaceRepeat:PyObject*:s:0: +PySequence_InPlaceRepeat:PyObject*:o:0: + +PySequence_ITEM:PyObject*::+1: +PySequence_ITEM:PyObject*:o:0: +PySequence_ITEM:int:i:: + +PySequence_Repeat:PyObject*::+1: +PySequence_Repeat:PyObject*:o:0: +PySequence_Repeat:int:count:: + +PySequence_SetItem:int::: +PySequence_SetItem:PyObject*:o:0: +PySequence_SetItem:int:i:: +PySequence_SetItem:PyObject*:v:+1: + +PySequence_SetSlice:int::: +PySequence_SetSlice:PyObject*:o:0: +PySequence_SetSlice:int:i1:: +PySequence_SetSlice:int:i2:: +PySequence_SetSlice:PyObject*:v:+1: + +PySequence_List:PyObject*::+1: +PySequence_List:PyObject*:o:0: + +PySequence_Tuple:PyObject*::+1: +PySequence_Tuple:PyObject*:o:0: + +PySet_Append:int::: +PySet_Append:PyObject*:set:0: +PySet_Append:PyObject*:key:+1: + +PySet_Contains:int::: +PySet_Contains:PyObject*:anyset:0: +PySet_Contains:PyObject*:key:0: + +PySet_Discard:int::: +PySet_Discard:PyObject*:set:0: +PySet_Discard:PyObject*:key:-1:no effect if key not found + +PySet_New:PyObject*::+1: +PySet_New:PyObject*:iterable:0: + +PySet_Pop:PyObject*::+1:or returns NULL and raises KeyError if set is empty +PySet_Pop:PyObject*:set:0: + +PySet_Size:int::: +PySet_Size:PyObject*:anyset:0: + +PySlice_Check:int::: +PySlice_Check:PyObject*:ob:0: + +PySlice_New:PyObject*::+1: +PySlice_New:PyObject*:start:0: +PySlice_New:PyObject*:stop:0: +PySlice_New:PyObject*:step:0: + +PyString_AS_STRING:char*::: +PyString_AS_STRING:PyObject*:string:0: + +PyString_AsDecodedObject:PyObject*::+1: +PyString_AsDecodedObject:PyObject*:str:0: +PyString_AsDecodedObject:const char*:encoding:: +PyString_AsDecodedObject:const char*:errors:: + +PyString_AsEncodedObject:PyObject*::+1: +PyString_AsEncodedObject:PyObject*:str:0: +PyString_AsEncodedObject:const char*:encoding:: +PyString_AsEncodedObject:const char*:errors:: + +PyString_AsString:char*::: +PyString_AsString:PyObject*:string:0: + +PyString_AsStringAndSize:int::: +PyString_AsStringAndSize:PyObject*:obj:0: +PyString_AsStringAndSize:char**:buffer:: +PyString_AsStringAndSize:int*:length:: + +PyString_Check:int::: +PyString_Check:PyObject*:o:0: + +PyString_Concat:void::: +PyString_Concat:PyObject**:string:0:??? -- replaces w/ new string or NULL +PyString_Concat:PyObject*:newpart:0: + +PyString_ConcatAndDel:void::: +PyString_ConcatAndDel:PyObject**:string:0:??? -- replaces w/ new string or NULL +PyString_ConcatAndDel:PyObject*:newpart:-1: + +PyString_Format:PyObject*::+1: +PyString_Format:PyObject*:format:0: +PyString_Format:PyObject*:args:0: + +PyString_FromString:PyObject*::+1: +PyString_FromString:const char*:v:: + +PyString_FromStringAndSize:PyObject*::+1: +PyString_FromStringAndSize:const char*:v:: +PyString_FromStringAndSize:int:len:: + +PyString_FromFormat:PyObject*::+1: +PyString_FromFormat:const char*:format:: +PyString_FromFormat::...:: + +PyString_FromFormatV:PyObject*::+1: +PyString_FromFormatV:const char*:format:: +PyString_FromFormatV:va_list:vargs:: + +PyString_GET_SIZE:int::: +PyString_GET_SIZE:PyObject*:string:0: + +PyString_InternFromString:PyObject*::+1: +PyString_InternFromString:const char*:v:: + +PyString_InternInPlace:void::: +PyString_InternInPlace:PyObject**:string:+1:??? + +PyString_Size:int::: +PyString_Size:PyObject*:string:0: + +PyString_Decode:PyObject*::+1: +PyString_Decode:const char*:s:: +PyString_Decode:int:size:: +PyString_Decode:const char*:encoding:: +PyString_Decode:const char*:errors:: + +PyString_Encode:PyObject*::+1: +PyString_Encode:const char*:s:: +PyString_Encode:int:size:: +PyString_Encode:const char*:encoding:: +PyString_Encode:const char*:errors:: + +PyString_AsEncodedString:PyObject*::+1: +PyString_AsEncodedString:PyObject*:str:: +PyString_AsEncodedString:const char*:encoding:: +PyString_AsEncodedString:const char*:errors:: + +PySys_SetArgv:int::: +PySys_SetArgv:int:argc:: +PySys_SetArgv:char**:argv:: + +PyThreadState_Clear:void::: +PyThreadState_Clear:PyThreadState*:tstate:: + +PyThreadState_Delete:void::: +PyThreadState_Delete:PyThreadState*:tstate:: + +PyThreadState_Get:PyThreadState*::: + +PyThreadState_GetDict:PyObject*::0: + +PyThreadState_New:PyThreadState*::: +PyThreadState_New:PyInterpreterState*:interp:: + +PyThreadState_Swap:PyThreadState*::: +PyThreadState_Swap:PyThreadState*:tstate:: + +PyTime_FromTime:PyObject*::+1: +PyTime_FromTime:int:hour:: +PyTime_FromTime:int:minute:: +PyTime_FromTime:int:second:: +PyTime_FromTime:int:usecond:: + +PyTuple_Check:int::: +PyTuple_Check:PyObject*:p:0: + +PyTuple_GET_ITEM:PyObject*::0: +PyTuple_GET_ITEM:PyTupleObject*:p:0: +PyTuple_GET_ITEM:int:pos:: + +PyTuple_GetItem:PyObject*::0: +PyTuple_GetItem:PyTupleObject*:p:0: +PyTuple_GetItem:int:pos:: + +PyTuple_GetSlice:PyObject*::+1: +PyTuple_GetSlice:PyTupleObject*:p:0: +PyTuple_GetSlice:int:low:: +PyTuple_GetSlice:int:high:: + +PyTuple_New:PyObject*::+1: +PyTuple_New:int:len:: + +PyTuple_Pack:PyObject*::+1: +PyTuple_Pack:int:len:: +PyTuple_Pack:PyObject*:...:0: + +PyTuple_SET_ITEM:void::: +PyTuple_SET_ITEM:PyTupleObject*:p:0: +PyTuple_SET_ITEM:int:pos:: +PyTuple_SET_ITEM:PyObject*:o:0: + +PyTuple_SetItem:int::: +PyTuple_SetItem:PyTupleObject*:p:0: +PyTuple_SetItem:int:pos:: +PyTuple_SetItem:PyObject*:o:0: + +PyTuple_Size:int::: +PyTuple_Size:PyTupleObject*:p:0: + +PyType_GenericAlloc:PyObject*::+1: +PyType_GenericAlloc:PyObject*:type:0: +PyType_GenericAlloc:int:nitems:0: + +PyType_GenericNew:PyObject*::+1: +PyType_GenericNew:PyObject*:type:0: +PyType_GenericNew:PyObject*:args:0: +PyType_GenericNew:PyObject*:kwds:0: + +PyUnicode_Check:int::: +PyUnicode_Check:PyObject*:o:0: + +PyUnicode_GET_SIZE:int::: +PyUnicode_GET_SIZE:PyObject*:o:0: + +PyUnicode_GET_DATA_SIZE:int::: +PyUnicode_GET_DATA_SIZE:PyObject*:o:0: + +PyUnicode_AS_UNICODE:Py_UNICODE*::: +PyUnicode_AS_UNICODE:PyObject*:o:0: + +PyUnicode_AS_DATA:const char*::: +PyUnicode_AS_DATA:PyObject*:o:0: + +Py_UNICODE_ISSPACE:int::: +Py_UNICODE_ISSPACE:Py_UNICODE:ch:: + +Py_UNICODE_ISLOWER:int::: +Py_UNICODE_ISLOWER:Py_UNICODE:ch:: + +Py_UNICODE_ISUPPER:int::: +Py_UNICODE_ISUPPER:Py_UNICODE:ch:: + +Py_UNICODE_ISTITLE:int::: +Py_UNICODE_ISTITLE:Py_UNICODE:ch:: + +Py_UNICODE_ISLINEBREAK:int::: +Py_UNICODE_ISLINEBREAK:Py_UNICODE:ch:: + +Py_UNICODE_ISDECIMAL:int::: +Py_UNICODE_ISDECIMAL:Py_UNICODE:ch:: + +Py_UNICODE_ISDIGIT:int::: +Py_UNICODE_ISDIGIT:Py_UNICODE:ch:: + +Py_UNICODE_ISNUMERIC:int::: +Py_UNICODE_ISNUMERIC:Py_UNICODE:ch:: + +Py_UNICODE_TOLOWER:Py_UNICODE::: +Py_UNICODE_TOLOWER:Py_UNICODE:ch:: + +Py_UNICODE_TOUPPER:Py_UNICODE::: +Py_UNICODE_TOUPPER:Py_UNICODE:ch:: + +Py_UNICODE_TOTITLE:Py_UNICODE::: +Py_UNICODE_TOTITLE:Py_UNICODE:ch:: + +Py_UNICODE_TODECIMAL:int::: +Py_UNICODE_TODECIMAL:Py_UNICODE:ch:: + +Py_UNICODE_TODIGIT:int::: +Py_UNICODE_TODIGIT:Py_UNICODE:ch:: + +Py_UNICODE_TONUMERIC:double::: +Py_UNICODE_TONUMERIC:Py_UNICODE:ch:: + +PyUnicode_FromUnicode:PyObject*::+1: +PyUnicode_FromUnicode:const Py_UNICODE*:u:: +PyUnicode_FromUnicode:int:size:: + +PyUnicode_AsUnicode:Py_UNICODE*::: +PyUnicode_AsUnicode:PyObject :*unicode:0: + +PyUnicode_GetSize:int::: +PyUnicode_GetSize:PyObject :*unicode:0: + +PyUnicode_FromObject:PyObject*::+1: +PyUnicode_FromObject:PyObject*:*obj:0: + +PyUnicode_FromEncodedObject:PyObject*::+1: +PyUnicode_FromEncodedObject:PyObject*:*obj:0: +PyUnicode_FromEncodedObject:const char*:encoding:: +PyUnicode_FromEncodedObject:const char*:errors:: + +PyUnicode_FromWideChar:PyObject*::+1: +PyUnicode_FromWideChar:const wchar_t*:w:: +PyUnicode_FromWideChar:int:size:: + +PyUnicode_AsWideChar:int::: +PyUnicode_AsWideChar:PyObject*:*unicode:0: +PyUnicode_AsWideChar:wchar_t*:w:: +PyUnicode_AsWideChar:int:size:: + +PyUnicode_Decode:PyObject*::+1: +PyUnicode_Decode:const char*:s:: +PyUnicode_Decode:int:size:: +PyUnicode_Decode:const char*:encoding:: +PyUnicode_Decode:const char*:errors:: + +PyUnicode_DecodeUTF16Stateful:PyObject*::+1: +PyUnicode_DecodeUTF16Stateful:const char*:s:: +PyUnicode_DecodeUTF16Stateful:int:size:: +PyUnicode_DecodeUTF16Stateful:const char*:errors:: +PyUnicode_DecodeUTF16Stateful:int*:byteorder:: +PyUnicode_DecodeUTF16Stateful:int*:consumed:: + +PyUnicode_DecodeUTF8Stateful:PyObject*::+1: +PyUnicode_DecodeUTF8Stateful:const char*:s:: +PyUnicode_DecodeUTF8Stateful:int:size:: +PyUnicode_DecodeUTF8Stateful:const char*:errors:: +PyUnicode_DecodeUTF8Stateful:int*:consumed:: + +PyUnicode_Encode:PyObject*::+1: +PyUnicode_Encode:const Py_UNICODE*:s:: +PyUnicode_Encode:int:size:: +PyUnicode_Encode:const char*:encoding:: +PyUnicode_Encode:const char*:errors:: + +PyUnicode_AsEncodedString:PyObject*::+1: +PyUnicode_AsEncodedString:PyObject*:unicode:: +PyUnicode_AsEncodedString:const char*:encoding:: +PyUnicode_AsEncodedString:const char*:errors:: + +PyUnicode_DecodeUTF8:PyObject*::+1: +PyUnicode_DecodeUTF8:const char*:s:: +PyUnicode_DecodeUTF8:int:size:: +PyUnicode_DecodeUTF8:const char*:errors:: + +PyUnicode_EncodeUTF8:PyObject*::+1: +PyUnicode_EncodeUTF8:const Py_UNICODE*:s:: +PyUnicode_EncodeUTF8:int:size:: +PyUnicode_EncodeUTF8:const char*:errors:: + +PyUnicode_AsUTF8String:PyObject*::+1: +PyUnicode_AsUTF8String:PyObject*:unicode:: + +PyUnicode_DecodeUTF16:PyObject*::+1: +PyUnicode_DecodeUTF16:const char*:s:: +PyUnicode_DecodeUTF16:int:size:: +PyUnicode_DecodeUTF16:const char*:errors:: +PyUnicode_DecodeUTF16:int*:byteorder:: + +PyUnicode_EncodeUTF16:PyObject*::+1: +PyUnicode_EncodeUTF16:const Py_UNICODE*:s:: +PyUnicode_EncodeUTF16:int:size:: +PyUnicode_EncodeUTF16:const char*:errors:: +PyUnicode_EncodeUTF16:int:byteorder:: + +PyUnicode_AsUTF16String:PyObject*::+1: +PyUnicode_AsUTF16String:PyObject*:unicode:: + +PyUnicode_DecodeUnicodeEscape:PyObject*::+1: +PyUnicode_DecodeUnicodeEscape:const char*:s:: +PyUnicode_DecodeUnicodeEscape:int:size:: +PyUnicode_DecodeUnicodeEscape:const char*:errors:: + +PyUnicode_EncodeUnicodeEscape:PyObject*::+1: +PyUnicode_EncodeUnicodeEscape:const Py_UNICODE*:s:: +PyUnicode_EncodeUnicodeEscape:int:size:: +PyUnicode_EncodeUnicodeEscape:const char*:errors:: + +PyUnicode_AsUnicodeEscapeString:PyObject*::+1: +PyUnicode_AsUnicodeEscapeString:PyObject*:unicode:: + +PyUnicode_DecodeRawUnicodeEscape:PyObject*::+1: +PyUnicode_DecodeRawUnicodeEscape:const char*:s:: +PyUnicode_DecodeRawUnicodeEscape:int:size:: +PyUnicode_DecodeRawUnicodeEscape:const char*:errors:: + +PyUnicode_EncodeRawUnicodeEscape:PyObject*::+1: +PyUnicode_EncodeRawUnicodeEscape:const Py_UNICODE*:s:: +PyUnicode_EncodeRawUnicodeEscape:int:size:: +PyUnicode_EncodeRawUnicodeEscape:const char*:errors:: + +PyUnicode_AsRawUnicodeEscapeString:PyObject*::+1: +PyUnicode_AsRawUnicodeEscapeString:PyObject*:unicode:: + +PyUnicode_DecodeLatin1:PyObject*::+1: +PyUnicode_DecodeLatin1:const char*:s:: +PyUnicode_DecodeLatin1:int:size:: +PyUnicode_DecodeLatin1:const char*:errors:: + +PyUnicode_EncodeLatin1:PyObject*::+1: +PyUnicode_EncodeLatin1:const Py_UNICODE*:s:: +PyUnicode_EncodeLatin1:int:size:: +PyUnicode_EncodeLatin1:const char*:errors:: + +PyUnicode_AsLatin1String:PyObject*::+1: +PyUnicode_AsLatin1String:PyObject*:unicode:: + +PyUnicode_DecodeASCII:PyObject*::+1: +PyUnicode_DecodeASCII:const char*:s:: +PyUnicode_DecodeASCII:int:size:: +PyUnicode_DecodeASCII:const char*:errors:: + +PyUnicode_EncodeASCII:PyObject*::+1: +PyUnicode_EncodeASCII:const Py_UNICODE*:s:: +PyUnicode_EncodeASCII:int:size:: +PyUnicode_EncodeASCII:const char*:errors:: + +PyUnicode_AsASCIIString:PyObject*::+1: +PyUnicode_AsASCIIString:PyObject*:unicode:: + +PyUnicode_DecodeCharmap:PyObject*::+1: +PyUnicode_DecodeCharmap:const char*:s:: +PyUnicode_DecodeCharmap:int:size:: +PyUnicode_DecodeCharmap:PyObject*:mapping:0: +PyUnicode_DecodeCharmap:const char*:errors:: + +PyUnicode_EncodeCharmap:PyObject*::+1: +PyUnicode_EncodeCharmap:const Py_UNICODE*:s:: +PyUnicode_EncodeCharmap:int:size:: +PyUnicode_EncodeCharmap:PyObject*:mapping:0: +PyUnicode_EncodeCharmap:const char*:errors:: + +PyUnicode_AsCharmapString:PyObject*::+1: +PyUnicode_AsCharmapString:PyObject*:unicode:0: +PyUnicode_AsCharmapString:PyObject*:mapping:0: + +PyUnicode_TranslateCharmap:PyObject*::+1: +PyUnicode_TranslateCharmap:const Py_UNICODE*:s:: +PyUnicode_TranslateCharmap:int:size:: +PyUnicode_TranslateCharmap:PyObject*:table:0: +PyUnicode_TranslateCharmap:const char*:errors:: + +PyUnicode_DecodeMBCS:PyObject*::+1: +PyUnicode_DecodeMBCS:const char*:s:: +PyUnicode_DecodeMBCS:int:size:: +PyUnicode_DecodeMBCS:const char*:errors:: + +PyUnicode_EncodeMBCS:PyObject*::+1: +PyUnicode_EncodeMBCS:const Py_UNICODE*:s:: +PyUnicode_EncodeMBCS:int:size:: +PyUnicode_EncodeMBCS:const char*:errors:: + +PyUnicode_AsMBCSString:PyObject*::+1: +PyUnicode_AsMBCSString:PyObject*:unicode:: + +PyUnicode_Concat:PyObject*::+1: +PyUnicode_Concat:PyObject*:left:0: +PyUnicode_Concat:PyObject*:right:0: + +PyUnicode_Split:PyObject*::+1: +PyUnicode_Split:PyObject*:left:0: +PyUnicode_Split:PyObject*:right:0: +PyUnicode_Split:int:maxsplit:: + +PyUnicode_Splitlines:PyObject*::+1: +PyUnicode_Splitlines:PyObject*:s:0: +PyUnicode_Splitlines:int:maxsplit:: + +PyUnicode_Translate:PyObject*::+1: +PyUnicode_Translate:PyObject*:str:0: +PyUnicode_Translate:PyObject*:table:0: +PyUnicode_Translate:const char*:errors:: + +PyUnicode_Join:PyObject*::+1: +PyUnicode_Join:PyObject*:separator:0: +PyUnicode_Join:PyObject*:seq:0: + +PyUnicode_Tailmatch:PyObject*::+1: +PyUnicode_Tailmatch:PyObject*:str:0: +PyUnicode_Tailmatch:PyObject*:substr:0: +PyUnicode_Tailmatch:int:start:: +PyUnicode_Tailmatch:int:end:: +PyUnicode_Tailmatch:int:direction:: + +PyUnicode_Find:int::: +PyUnicode_Find:PyObject*:str:0: +PyUnicode_Find:PyObject*:substr:0: +PyUnicode_Find:int:start:: +PyUnicode_Find:int:end:: +PyUnicode_Find:int:direction:: + +PyUnicode_Count:int::: +PyUnicode_Count:PyObject*:str:0: +PyUnicode_Count:PyObject*:substr:0: +PyUnicode_Count:int:start:: +PyUnicode_Count:int:end:: + +PyUnicode_Replace:PyObject*::+1: +PyUnicode_Replace:PyObject*:str:0: +PyUnicode_Replace:PyObject*:substr:0: +PyUnicode_Replace:PyObject*:replstr:0: +PyUnicode_Replace:int:maxcount:: + +PyUnicode_Compare:int::: +PyUnicode_Compare:PyObject*:left:0: +PyUnicode_Compare:PyObject*:right:0: + +PyUnicode_Format:PyObject*::+1: +PyUnicode_Format:PyObject*:format:0: +PyUnicode_Format:PyObject*:args:0: + +PyUnicode_Contains:int::: +PyUnicode_Contains:PyObject*:container:0: +PyUnicode_Contains:PyObject*:element:0: + +PyWeakref_GET_OBJECT:PyObject*::0: +PyWeakref_GET_OBJECT:PyObject*:ref:0: + +PyWeakref_GetObject:PyObject*::0: +PyWeakref_GetObject:PyObject*:ref:0: + +PyWeakref_NewProxy:PyObject*::+1: +PyWeakref_NewProxy:PyObject*:ob:0: +PyWeakref_NewProxy:PyObject*:callback:0: + +PyWeakref_NewRef:PyObject*::+1: +PyWeakref_NewRef:PyObject*:ob:0: +PyWeakref_NewRef:PyObject*:callback:0: + +PyWrapper_New:PyObject*::+1: +PyWrapper_New:PyObject*:d:0: +PyWrapper_New:PyObject*:self:0: + +Py_AtExit:int::: +Py_AtExit:void (*)():func:: + +Py_BuildValue:PyObject*::+1: +Py_BuildValue:char*:format:: + +Py_CompileString:PyObject*::+1: +Py_CompileString:char*:str:: +Py_CompileString:char*:filename:: +Py_CompileString:int:start:: + +Py_CompileStringFlags:PyObject*::+1: +Py_CompileStringFlags:char*:str:: +Py_CompileStringFlags:char*:filename:: +Py_CompileStringFlags:int:start:: +Py_CompileStringFlags:PyCompilerFlags*:flags:: + +Py_DECREF:void::: +Py_DECREF:PyObject*:o:-1: + +Py_EndInterpreter:void::: +Py_EndInterpreter:PyThreadState*:tstate:: + +Py_Exit:void::: +Py_Exit:int:status:: + +Py_FatalError:void::: +Py_FatalError:char*:message:: + +Py_FdIsInteractive:int::: +Py_FdIsInteractive:FILE*:fp:: +Py_FdIsInteractive:char*:filename:: + +Py_Finalize:void::: + +Py_FindMethod:PyObject*::+1: +Py_FindMethod:PyMethodDef[]:methods:: +Py_FindMethod:PyObject*:self:+1: +Py_FindMethod:char*:name:: + +Py_GetBuildInfoconst:char*::: + +Py_GetCompilerconst:char*::: + +Py_GetCopyrightconst:char*::: + +Py_GetExecPrefix:char*::: + +Py_GetPath:char*::: + +Py_GetPlatformconst:char*::: + +Py_GetPrefix:char*::: + +Py_GetProgramFullPath:char*::: + +Py_GetProgramName:char*::: + +Py_GetVersionconst:char*::: + +Py_INCREF:void::: +Py_INCREF:PyObject*:o:+1: + +Py_Initialize:void::: + +Py_IsInitialized:int::: + +Py_NewInterpreter:PyThreadState*::: + +Py_SetProgramName:void::: +Py_SetProgramName:char*:name:: + +Py_XDECREF:void::: +Py_XDECREF:PyObject*:o:-1:if o is not NULL + +Py_XINCREF:void::: +Py_XINCREF:PyObject*:o:+1:if o is not NULL + +_PyImport_FindExtension:PyObject*::0:??? see PyImport_AddModule +_PyImport_FindExtension:char*::: +_PyImport_FindExtension:char*::: + +_PyImport_Fini:void::: + +_PyImport_FixupExtension:PyObject*:::??? +_PyImport_FixupExtension:char*::: +_PyImport_FixupExtension:char*::: + +_PyImport_Init:void::: + +_PyObject_Del:void::: +_PyObject_Del:PyObject*:op:0: + +_PyObject_New:PyObject*::+1: +_PyObject_New:PyTypeObject*:type:0: + +_PyObject_NewVar:PyObject*::+1: +_PyObject_NewVar:PyTypeObject*:type:0: +_PyObject_NewVar:int:size:: + +_PyString_Resize:int::: +_PyString_Resize:PyObject**:string:+1: +_PyString_Resize:int:newsize:: + +_PyTuple_Resize:int::: +_PyTuple_Resize:PyTupleObject**:p:+1: +_PyTuple_Resize:int:new:: + +_Py_c_diff:Py_complex::: +_Py_c_diff:Py_complex:left:: +_Py_c_diff:Py_complex:right:: + +_Py_c_neg:Py_complex::: +_Py_c_neg:Py_complex:complex:: + +_Py_c_pow:Py_complex::: +_Py_c_pow:Py_complex:num:: +_Py_c_pow:Py_complex:exp:: + +_Py_c_prod:Py_complex::: +_Py_c_prod:Py_complex:left:: +_Py_c_prod:Py_complex:right:: + +_Py_c_quot:Py_complex::: +_Py_c_quot:Py_complex:dividend:: +_Py_c_quot:Py_complex:divisor:: + +_Py_c_sum:Py_complex::: +_Py_c_sum:Py_complex:left:: +_Py_c_sum:Py_complex:right:: diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst new file mode 100644 index 0000000..c8e57fd --- /dev/null +++ b/Doc/distutils/apiref.rst @@ -0,0 +1,1976 @@ +.. _api-reference: + +************* +API Reference +************* + + +:mod:`distutils.core` --- Core Distutils functionality +====================================================== + +.. module:: distutils.core + :synopsis: The core Distutils functionality + + +The :mod:`distutils.core` module is the only module that needs to be installed +to use the Distutils. It provides the :func:`setup` (which is called from the +setup script). Indirectly provides the :class:`distutils.dist.Distribution` and +:class:`distutils.cmd.Command` class. + + +.. function:: setup(arguments) + + The basic do-everything function that does most everything you could ever ask + for from a Distutils method. See XXXXX + + The setup function takes a large number of arguments. These are laid out in the + following table. + + +--------------------+--------------------------------+-------------------------------------------------------------+ + | argument name | value | type | + +====================+================================+=============================================================+ + | *name* | The name of the package | a string | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *version* | The version number of the | See :mod:`distutils.version` | + | | package | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *description* | A single line describing the | a string | + | | package | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *long_description* | Longer description of the | a string | + | | package | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *author* | The name of the package author | a string | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *author_email* | The email address of the | a string | + | | package author | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *maintainer* | The name of the current | a string | + | | maintainer, if different from | | + | | the author | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *maintainer_email* | The email address of the | | + | | current maintainer, if | | + | | different from the author | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *url* | A URL for the package | a URL | + | | (homepage) | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *download_url* | A URL to download the package | a URL | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *packages* | A list of Python packages that | a list of strings | + | | distutils will manipulate | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *py_modules* | A list of Python modules that | a list of strings | + | | distutils will manipulate | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *scripts* | A list of standalone script | a list of strings | + | | files to be built and | | + | | installed | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *ext_modules* | A list of Python extensions to | A list of instances of | + | | be built | :class:`distutils.core.Extension` | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *classifiers* | A list of categories for the | The list of available | + | | package | categorizations is at | + | | | http://cheeseshop.python.org/pypi?:action=list_classifiers. | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *distclass* | the :class:`Distribution` | A subclass of | + | | class to use | :class:`distutils.core.Distribution` | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *script_name* | The name of the setup.py | a string | + | | script - defaults to | | + | | ``sys.argv[0]`` | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *script_args* | Arguments to supply to the | a list of strings | + | | setup script | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *options* | default options for the setup | a string | + | | script | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *license* | The license for the package | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *keywords* | Descriptive meta-data. See | | + | | :pep:`314` | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *platforms* | | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + | *cmdclass* | A mapping of command names to | a dictionary | + | | :class:`Command` subclasses | | + +--------------------+--------------------------------+-------------------------------------------------------------+ + + +.. function:: run_setup(script_name[, script_args=None, stop_after='run']) + + Run a setup script in a somewhat controlled environment, and return the + :class:`distutils.dist.Distribution` instance that drives things. This is + useful if you need to find out the distribution meta-data (passed as keyword + args from *script* to :func:`setup`), or the contents of the config files or + command-line. + + *script_name* is a file that will be read and run with :func:`exec`. ``sys.argv[0]`` + will be replaced with *script* for the duration of the call. *script_args* is a + list of strings; if supplied, ``sys.argv[1:]`` will be replaced by *script_args* + for the duration of the call. + + *stop_after* tells :func:`setup` when to stop processing; possible values: + + +---------------+---------------------------------------------+ + | value | description | + +===============+=============================================+ + | *init* | Stop after the :class:`Distribution` | + | | instance has been created and populated | + | | with the keyword arguments to :func:`setup` | + +---------------+---------------------------------------------+ + | *config* | Stop after config files have been parsed | + | | (and their data stored in the | + | | :class:`Distribution` instance) | + +---------------+---------------------------------------------+ + | *commandline* | Stop after the command-line | + | | (``sys.argv[1:]`` or *script_args*) have | + | | been parsed (and the data stored in the | + | | :class:`Distribution` instance.) | + +---------------+---------------------------------------------+ + | *run* | Stop after all commands have been run (the | + | | same as if :func:`setup` had been called | + | | in the usual way). This is the default | + | | value. | + +---------------+---------------------------------------------+ + +In addition, the :mod:`distutils.core` module exposed a number of classes that +live elsewhere. + +* :class:`Extension` from :mod:`distutils.extension` + +* :class:`Command` from :mod:`distutils.cmd` + +* :class:`Distribution` from :mod:`distutils.dist` + +A short description of each of these follows, but see the relevant module for +the full reference. + + +.. class:: Extension + + The Extension class describes a single C or C++extension module in a setup + script. It accepts the following keyword arguments in its constructor + + +------------------------+--------------------------------+---------------------------+ + | argument name | value | type | + +========================+================================+===========================+ + | *name* | the full name of the | string | + | | extension, including any | | + | | packages --- ie. *not* a | | + | | filename or pathname, but | | + | | Python dotted name | | + +------------------------+--------------------------------+---------------------------+ + | *sources* | list of source filenames, | string | + | | relative to the distribution | | + | | root (where the setup script | | + | | lives), in Unix form (slash- | | + | | separated) for portability. | | + | | Source files may be C, C++, | | + | | SWIG (.i), platform-specific | | + | | resource files, or whatever | | + | | else is recognized by the | | + | | :command:`build_ext` command | | + | | as source for a Python | | + | | extension. | | + +------------------------+--------------------------------+---------------------------+ + | *include_dirs* | list of directories to search | string | + | | for C/C++ header files (in | | + | | Unix form for portability) | | + +------------------------+--------------------------------+---------------------------+ + | *define_macros* | list of macros to define; each | (string,string) tuple or | + | | macro is defined using a | (name,``None``) | + | | 2-tuple, where 'value' is | | + | | either the string to define it | | + | | to or ``None`` to define it | | + | | without a particular value | | + | | (equivalent of ``#define FOO`` | | + | | in source or :option:`-DFOO` | | + | | on Unix C compiler command | | + | | line) | | + +------------------------+--------------------------------+---------------------------+ + | *undef_macros* | list of macros to undefine | string | + | | explicitly | | + +------------------------+--------------------------------+---------------------------+ + | *library_dirs* | list of directories to search | string | + | | for C/C++ libraries at link | | + | | time | | + +------------------------+--------------------------------+---------------------------+ + | *libraries* | list of library names (not | string | + | | filenames or paths) to link | | + | | against | | + +------------------------+--------------------------------+---------------------------+ + | *runtime_library_dirs* | list of directories to search | string | + | | for C/C++ libraries at run | | + | | time (for shared extensions, | | + | | this is when the extension is | | + | | loaded) | | + +------------------------+--------------------------------+---------------------------+ + | *extra_objects* | list of extra files to link | string | + | | with (eg. object files not | | + | | implied by 'sources', static | | + | | library that must be | | + | | explicitly specified, binary | | + | | resource files, etc.) | | + +------------------------+--------------------------------+---------------------------+ + | *extra_compile_args* | any extra platform- and | string | + | | compiler-specific information | | + | | to use when compiling the | | + | | source files in 'sources'. For | | + | | platforms and compilers where | | + | | a command line makes sense, | | + | | this is typically a list of | | + | | command-line arguments, but | | + | | for other platforms it could | | + | | be anything. | | + +------------------------+--------------------------------+---------------------------+ + | *extra_link_args* | any extra platform- and | string | + | | compiler-specific information | | + | | to use when linking object | | + | | files together to create the | | + | | extension (or to create a new | | + | | static Python interpreter). | | + | | Similar interpretation as for | | + | | 'extra_compile_args'. | | + +------------------------+--------------------------------+---------------------------+ + | *export_symbols* | list of symbols to be exported | string | + | | from a shared extension. Not | | + | | used on all platforms, and not | | + | | generally necessary for Python | | + | | extensions, which typically | | + | | export exactly one symbol: | | + | | ``init`` + extension_name. | | + +------------------------+--------------------------------+---------------------------+ + | *depends* | list of files that the | string | + | | extension depends on | | + +------------------------+--------------------------------+---------------------------+ + | *language* | extension language (i.e. | string | + | | ``'c'``, ``'c++'``, | | + | | ``'objc'``). Will be detected | | + | | from the source extensions if | | + | | not provided. | | + +------------------------+--------------------------------+---------------------------+ + + +.. class:: Distribution + + A :class:`Distribution` describes how to build, install and package up a Python + software package. + + See the :func:`setup` function for a list of keyword arguments accepted by the + Distribution constructor. :func:`setup` creates a Distribution instance. + + +.. class:: Command + + A :class:`Command` class (or rather, an instance of one of its subclasses) + implement a single distutils command. + + +:mod:`distutils.ccompiler` --- CCompiler base class +=================================================== + +.. module:: distutils.ccompiler + :synopsis: Abstract CCompiler class + + +This module provides the abstract base class for the :class:`CCompiler` +classes. A :class:`CCompiler` instance can be used for all the compile and +link steps needed to build a single project. Methods are provided to set +options for the compiler --- macro definitions, include directories, link path, +libraries and the like. + +This module provides the following functions. + + +.. function:: gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries) + + Generate linker options for searching library directories and linking with + specific libraries. *libraries* and *library_dirs* are, respectively, lists of + library names (not filenames!) and search directories. Returns a list of + command-line options suitable for use with some compiler (depending on the two + format strings passed in). + + +.. function:: gen_preprocess_options(macros, include_dirs) + + Generate C pre-processor options (:option:`-D`, :option:`-U`, :option:`-I`) as + used by at least two types of compilers: the typical Unix compiler and Visual + C++. *macros* is the usual thing, a list of 1- or 2-tuples, where ``(name,)`` + means undefine (:option:`-U`) macro *name*, and ``(name, value)`` means define + (:option:`-D`) macro *name* to *value*. *include_dirs* is just a list of + directory names to be added to the header file search path (:option:`-I`). + Returns a list of command-line options suitable for either Unix compilers or + Visual C++. + + +.. function:: get_default_compiler(osname, platform) + + Determine the default compiler to use for the given platform. + + *osname* should be one of the standard Python OS names (i.e. the ones returned + by ``os.name``) and *platform* the common value returned by ``sys.platform`` for + the platform in question. + + The default values are ``os.name`` and ``sys.platform`` in case the parameters + are not given. + + +.. function:: new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0) + + Factory function to generate an instance of some CCompiler subclass for the + supplied platform/compiler combination. *plat* defaults to ``os.name`` (eg. + ``'posix'``, ``'nt'``), and *compiler* defaults to the default compiler for + that platform. Currently only ``'posix'`` and ``'nt'`` are supported, and the + default compilers are "traditional Unix interface" (:class:`UnixCCompiler` + class) and Visual C++(:class:`MSVCCompiler` class). Note that it's perfectly + possible to ask for a Unix compiler object under Windows, and a Microsoft + compiler object under Unix---if you supply a value for *compiler*, *plat* is + ignored. + + .. % Is the posix/nt only thing still true? Mac OS X seems to work, and + .. % returns a UnixCCompiler instance. How to document this... hmm. + + +.. function:: show_compilers() + + Print list of available compilers (used by the :option:`--help-compiler` options + to :command:`build`, :command:`build_ext`, :command:`build_clib`). + + +.. class:: CCompiler([verbose=0, dry_run=0, force=0]) + + The abstract base class :class:`CCompiler` defines the interface that must be + implemented by real compiler classes. The class also has some utility methods + used by several compiler classes. + + The basic idea behind a compiler abstraction class is that each instance can be + used for all the compile/link steps in building a single project. Thus, + attributes common to all of those compile and link steps --- include + directories, macros to define, libraries to link against, etc. --- are + attributes of the compiler instance. To allow for variability in how individual + files are treated, most of those attributes may be varied on a per-compilation + or per-link basis. + + The constructor for each subclass creates an instance of the Compiler object. + Flags are *verbose* (show verbose output), *dry_run* (don't actually execute the + steps) and *force* (rebuild everything, regardless of dependencies). All of + these flags default to ``0`` (off). Note that you probably don't want to + instantiate :class:`CCompiler` or one of its subclasses directly - use the + :func:`distutils.CCompiler.new_compiler` factory function instead. + + The following methods allow you to manually alter compiler options for the + instance of the Compiler class. + + + .. method:: CCompiler.add_include_dir(dir) + + Add *dir* to the list of directories that will be searched for header files. + The compiler is instructed to search directories in the order in which they are + supplied by successive calls to :meth:`add_include_dir`. + + + .. method:: CCompiler.set_include_dirs(dirs) + + Set the list of directories that will be searched to *dirs* (a list of strings). + Overrides any preceding calls to :meth:`add_include_dir`; subsequent calls to + :meth:`add_include_dir` add to the list passed to :meth:`set_include_dirs`. + This does not affect any list of standard include directories that the compiler + may search by default. + + + .. method:: CCompiler.add_library(libname) + + Add *libname* to the list of libraries that will be included in all links driven + by this compiler object. Note that *libname* should \*not\* be the name of a + file containing a library, but the name of the library itself: the actual + filename will be inferred by the linker, the compiler, or the compiler class + (depending on the platform). + + The linker will be instructed to link against libraries in the order they were + supplied to :meth:`add_library` and/or :meth:`set_libraries`. It is perfectly + valid to duplicate library names; the linker will be instructed to link against + libraries as many times as they are mentioned. + + + .. method:: CCompiler.set_libraries(libnames) + + Set the list of libraries to be included in all links driven by this compiler + object to *libnames* (a list of strings). This does not affect any standard + system libraries that the linker may include by default. + + + .. method:: CCompiler.add_library_dir(dir) + + Add *dir* to the list of directories that will be searched for libraries + specified to :meth:`add_library` and :meth:`set_libraries`. The linker will be + instructed to search for libraries in the order they are supplied to + :meth:`add_library_dir` and/or :meth:`set_library_dirs`. + + + .. method:: CCompiler.set_library_dirs(dirs) + + Set the list of library search directories to *dirs* (a list of strings). This + does not affect any standard library search path that the linker may search by + default. + + + .. method:: CCompiler.add_runtime_library_dir(dir) + + Add *dir* to the list of directories that will be searched for shared libraries + at runtime. + + + .. method:: CCompiler.set_runtime_library_dirs(dirs) + + Set the list of directories to search for shared libraries at runtime to *dirs* + (a list of strings). This does not affect any standard search path that the + runtime linker may search by default. + + + .. method:: CCompiler.define_macro(name[, value=None]) + + Define a preprocessor macro for all compilations driven by this compiler object. + The optional parameter *value* should be a string; if it is not supplied, then + the macro will be defined without an explicit value and the exact outcome + depends on the compiler used (XXX true? does ANSI say anything about this?) + + + .. method:: CCompiler.undefine_macro(name) + + Undefine a preprocessor macro for all compilations driven by this compiler + object. If the same macro is defined by :meth:`define_macro` and + undefined by :meth:`undefine_macro` the last call takes precedence + (including multiple redefinitions or undefinitions). If the macro is + redefined/undefined on a per-compilation basis (ie. in the call to + :meth:`compile`), then that takes precedence. + + + .. method:: CCompiler.add_link_object(object) + + Add *object* to the list of object files (or analogues, such as explicitly named + library files or the output of "resource compilers") to be included in every + link driven by this compiler object. + + + .. method:: CCompiler.set_link_objects(objects) + + Set the list of object files (or analogues) to be included in every link to + *objects*. This does not affect any standard object files that the linker may + include by default (such as system libraries). + + The following methods implement methods for autodetection of compiler options, + providing some functionality similar to GNU :program:`autoconf`. + + + .. method:: CCompiler.detect_language(sources) + + Detect the language of a given file, or list of files. Uses the instance + attributes :attr:`language_map` (a dictionary), and :attr:`language_order` (a + list) to do the job. + + + .. method:: CCompiler.find_library_file(dirs, lib[, debug=0]) + + Search the specified list of directories for a static or shared library file + *lib* and return the full path to that file. If *debug* is true, look for a + debugging version (if that makes sense on the current platform). Return + ``None`` if *lib* wasn't found in any of the specified directories. + + + .. method:: CCompiler.has_function(funcname [, includes=None, include_dirs=None, libraries=None, library_dirs=None]) + + Return a boolean indicating whether *funcname* is supported on the current + platform. The optional arguments can be used to augment the compilation + environment by providing additional include files and paths and libraries and + paths. + + + .. method:: CCompiler.library_dir_option(dir) + + Return the compiler option to add *dir* to the list of directories searched for + libraries. + + + .. method:: CCompiler.library_option(lib) + + Return the compiler option to add *dir* to the list of libraries linked into the + shared library or executable. + + + .. method:: CCompiler.runtime_library_dir_option(dir) + + Return the compiler option to add *dir* to the list of directories searched for + runtime libraries. + + + .. method:: CCompiler.set_executables(**args) + + Define the executables (and options for them) that will be run to perform the + various stages of compilation. The exact set of executables that may be + specified here depends on the compiler class (via the 'executables' class + attribute), but most will have: + + +--------------+------------------------------------------+ + | attribute | description | + +==============+==========================================+ + | *compiler* | the C/C++ compiler | + +--------------+------------------------------------------+ + | *linker_so* | linker used to create shared objects and | + | | libraries | + +--------------+------------------------------------------+ + | *linker_exe* | linker used to create binary executables | + +--------------+------------------------------------------+ + | *archiver* | static library creator | + +--------------+------------------------------------------+ + + On platforms with a command-line (Unix, DOS/Windows), each of these is a string + that will be split into executable name and (optional) list of arguments. + (Splitting the string is done similarly to how Unix shells operate: words are + delimited by spaces, but quotes and backslashes can override this. See + :func:`distutils.util.split_quoted`.) + + The following methods invoke stages in the build process. + + + .. method:: CCompiler.compile(sources[, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None]) + + Compile one or more source files. Generates object files (e.g. transforms a + :file:`.c` file to a :file:`.o` file.) + + *sources* must be a list of filenames, most likely C/C++ files, but in reality + anything that can be handled by a particular compiler and compiler class (eg. + :class:`MSVCCompiler` can handle resource files in *sources*). Return a list of + object filenames, one per source filename in *sources*. Depending on the + implementation, not all source files will necessarily be compiled, but all + corresponding object filenames will be returned. + + If *output_dir* is given, object files will be put under it, while retaining + their original path component. That is, :file:`foo/bar.c` normally compiles to + :file:`foo/bar.o` (for a Unix implementation); if *output_dir* is *build*, then + it would compile to :file:`build/foo/bar.o`. + + *macros*, if given, must be a list of macro definitions. A macro definition is + either a ``(name, value)`` 2-tuple or a ``(name,)`` 1-tuple. The former defines + a macro; if the value is ``None``, the macro is defined without an explicit + value. The 1-tuple case undefines a macro. Later + definitions/redefinitions/undefinitions take precedence. + + *include_dirs*, if given, must be a list of strings, the directories to add to + the default include file search path for this compilation only. + + *debug* is a boolean; if true, the compiler will be instructed to output debug + symbols in (or alongside) the object file(s). + + *extra_preargs* and *extra_postargs* are implementation-dependent. On platforms + that have the notion of a command-line (e.g. Unix, DOS/Windows), they are most + likely lists of strings: extra command-line arguments to prepend/append to the + compiler command line. On other platforms, consult the implementation class + documentation. In any event, they are intended as an escape hatch for those + occasions when the abstract compiler framework doesn't cut the mustard. + + *depends*, if given, is a list of filenames that all targets depend on. If a + source file is older than any file in depends, then the source file will be + recompiled. This supports dependency tracking, but only at a coarse + granularity. + + Raises :exc:`CompileError` on failure. + + + .. method:: CCompiler.create_static_lib(objects, output_libname[, output_dir=None, debug=0, target_lang=None]) + + Link a bunch of stuff together to create a static library file. The "bunch of + stuff" consists of the list of object files supplied as *objects*, the extra + object files supplied to :meth:`add_link_object` and/or + :meth:`set_link_objects`, the libraries supplied to :meth:`add_library` and/or + :meth:`set_libraries`, and the libraries supplied as *libraries* (if any). + + *output_libname* should be a library name, not a filename; the filename will be + inferred from the library name. *output_dir* is the directory where the library + file will be put. XXX defaults to what? + + *debug* is a boolean; if true, debugging information will be included in the + library (note that on most platforms, it is the compile step where this matters: + the *debug* flag is included here just for consistency). + + *target_lang* is the target language for which the given objects are being + compiled. This allows specific linkage time treatment of certain languages. + + Raises :exc:`LibError` on failure. + + + .. method:: CCompiler.link(target_desc, objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None]) + + Link a bunch of stuff together to create an executable or shared library file. + + The "bunch of stuff" consists of the list of object files supplied as *objects*. + *output_filename* should be a filename. If *output_dir* is supplied, + *output_filename* is relative to it (i.e. *output_filename* can provide + directory components if needed). + + *libraries* is a list of libraries to link against. These are library names, + not filenames, since they're translated into filenames in a platform-specific + way (eg. *foo* becomes :file:`libfoo.a` on Unix and :file:`foo.lib` on + DOS/Windows). However, they can include a directory component, which means the + linker will look in that specific directory rather than searching all the normal + locations. + + *library_dirs*, if supplied, should be a list of directories to search for + libraries that were specified as bare library names (ie. no directory + component). These are on top of the system default and those supplied to + :meth:`add_library_dir` and/or :meth:`set_library_dirs`. *runtime_library_dirs* + is a list of directories that will be embedded into the shared library and used + to search for other shared libraries that \*it\* depends on at run-time. (This + may only be relevant on Unix.) + + *export_symbols* is a list of symbols that the shared library will export. + (This appears to be relevant only on Windows.) + + *debug* is as for :meth:`compile` and :meth:`create_static_lib`, with the + slight distinction that it actually matters on most platforms (as opposed to + :meth:`create_static_lib`, which includes a *debug* flag mostly for form's + sake). + + *extra_preargs* and *extra_postargs* are as for :meth:`compile` (except of + course that they supply command-line arguments for the particular linker being + used). + + *target_lang* is the target language for which the given objects are being + compiled. This allows specific linkage time treatment of certain languages. + + Raises :exc:`LinkError` on failure. + + + .. method:: CCompiler.link_executable(objects, output_progname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, target_lang=None]) + + Link an executable. *output_progname* is the name of the file executable, while + *objects* are a list of object filenames to link in. Other arguments are as for + the :meth:`link` method. + + + .. method:: CCompiler.link_shared_lib(objects, output_libname[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None]) + + Link a shared library. *output_libname* is the name of the output library, + while *objects* is a list of object filenames to link in. Other arguments are + as for the :meth:`link` method. + + + .. method:: CCompiler.link_shared_object(objects, output_filename[, output_dir=None, libraries=None, library_dirs=None, runtime_library_dirs=None, export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, target_lang=None]) + + Link a shared object. *output_filename* is the name of the shared object that + will be created, while *objects* is a list of object filenames to link in. + Other arguments are as for the :meth:`link` method. + + + .. method:: CCompiler.preprocess(source[, output_file=None, macros=None, include_dirs=None, extra_preargs=None, extra_postargs=None]) + + Preprocess a single C/C++ source file, named in *source*. Output will be written + to file named *output_file*, or *stdout* if *output_file* not supplied. + *macros* is a list of macro definitions as for :meth:`compile`, which will + augment the macros set with :meth:`define_macro` and :meth:`undefine_macro`. + *include_dirs* is a list of directory names that will be added to the default + list, in the same way as :meth:`add_include_dir`. + + Raises :exc:`PreprocessError` on failure. + + The following utility methods are defined by the :class:`CCompiler` class, for + use by the various concrete subclasses. + + + .. method:: CCompiler.executable_filename(basename[, strip_dir=0, output_dir='']) + + Returns the filename of the executable for the given *basename*. Typically for + non-Windows platforms this is the same as the basename, while Windows will get + a :file:`.exe` added. + + + .. method:: CCompiler.library_filename(libname[, lib_type='static', strip_dir=0, output_dir='']) + + Returns the filename for the given library name on the current platform. On Unix + a library with *lib_type* of ``'static'`` will typically be of the form + :file:`liblibname.a`, while a *lib_type* of ``'dynamic'`` will be of the form + :file:`liblibname.so`. + + + .. method:: CCompiler.object_filenames(source_filenames[, strip_dir=0, output_dir='']) + + Returns the name of the object files for the given source files. + *source_filenames* should be a list of filenames. + + + .. method:: CCompiler.shared_object_filename(basename[, strip_dir=0, output_dir='']) + + Returns the name of a shared object file for the given file name *basename*. + + + .. method:: CCompiler.execute(func, args[, msg=None, level=1]) + + Invokes :func:`distutils.util.execute` This method invokes a Python function + *func* with the given arguments *args*, after logging and taking into account + the *dry_run* flag. XXX see also. + + + .. method:: CCompiler.spawn(cmd) + + Invokes :func:`distutils.util.spawn`. This invokes an external process to run + the given command. XXX see also. + + + .. method:: CCompiler.mkpath(name[, mode=511]) + + Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any + missing ancestor directories. XXX see also. + + + .. method:: CCompiler.move_file(src, dst) + + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see + also. + + + .. method:: CCompiler.announce(msg[, level=1]) + + Write a message using :func:`distutils.log.debug`. XXX see also. + + + .. method:: CCompiler.warn(msg) + + Write a warning message *msg* to standard error. + + + .. method:: CCompiler.debug_print(msg) + + If the *debug* flag is set on this :class:`CCompiler` instance, print *msg* to + standard output, otherwise do nothing. + +.. % \subsection{Compiler-specific modules} +.. % +.. % The following modules implement concrete subclasses of the abstract +.. % \class{CCompiler} class. They should not be instantiated directly, but should +.. % be created using \function{distutils.ccompiler.new_compiler()} factory +.. % function. + + +:mod:`distutils.unixccompiler` --- Unix C Compiler +================================================== + +.. module:: distutils.unixccompiler + :synopsis: UNIX C Compiler + + +This module provides the :class:`UnixCCompiler` class, a subclass of +:class:`CCompiler` that handles the typical Unix-style command-line C compiler: + +* macros defined with :option:`-Dname[=value]` + +* macros undefined with :option:`-Uname` + +* include search directories specified with :option:`-Idir` + +* libraries specified with :option:`-llib` + +* library search directories specified with :option:`-Ldir` + +* compile handled by :program:`cc` (or similar) executable with :option:`-c` + option: compiles :file:`.c` to :file:`.o` + +* link static library handled by :program:`ar` command (possibly with + :program:`ranlib`) + +* link shared library handled by :program:`cc` :option:`-shared` + + +:mod:`distutils.msvccompiler` --- Microsoft Compiler +==================================================== + +.. module:: distutils.msvccompiler + :synopsis: Microsoft Compiler + + +This module provides :class:`MSVCCompiler`, an implementation of the abstract +:class:`CCompiler` class for Microsoft Visual Studio. Typically, extension +modules need to be compiled with the same compiler that was used to compile +Python. For Python 2.3 and earlier, the compiler was Visual Studio 6. For Python +2.4 and 2.5, the compiler is Visual Studio .NET 2003. The AMD64 and Itanium +binaries are created using the Platform SDK. + +:class:`MSVCCompiler` will normally choose the right compiler, linker etc. on +its own. To override this choice, the environment variables *DISTUTILS_USE_SDK* +and *MSSdk* must be both set. *MSSdk* indicates that the current environment has +been setup by the SDK's ``SetEnv.Cmd`` script, or that the environment variables +had been registered when the SDK was installed; *DISTUTILS_USE_SDK* indicates +that the distutils user has made an explicit choice to override the compiler +selection by :class:`MSVCCompiler`. + + +:mod:`distutils.bcppcompiler` --- Borland Compiler +================================================== + +.. module:: distutils.bcppcompiler + + +This module provides :class:`BorlandCCompiler`, an subclass of the abstract +:class:`CCompiler` class for the Borland C++ compiler. + + +:mod:`distutils.cygwincompiler` --- Cygwin Compiler +=================================================== + +.. module:: distutils.cygwinccompiler + + +This module provides the :class:`CygwinCCompiler` class, a subclass of +:class:`UnixCCompiler` that handles the Cygwin port of the GNU C compiler to +Windows. It also contains the Mingw32CCompiler class which handles the mingw32 +port of GCC (same as cygwin in no-cygwin mode). + + +:mod:`distutils.emxccompiler` --- OS/2 EMX Compiler +=================================================== + +.. module:: distutils.emxccompiler + :synopsis: OS/2 EMX Compiler support + + +This module provides the EMXCCompiler class, a subclass of +:class:`UnixCCompiler` that handles the EMX port of the GNU C compiler to OS/2. + + +:mod:`distutils.mwerkscompiler` --- Metrowerks CodeWarrior support +================================================================== + +.. module:: distutils.mwerkscompiler + :synopsis: Metrowerks CodeWarrior support + + +Contains :class:`MWerksCompiler`, an implementation of the abstract +:class:`CCompiler` class for MetroWerks CodeWarrior on the pre-Mac OS X +Macintosh. Needs work to support CW on Windows or Mac OS X. + +.. % \subsection{Utility modules} +.. % +.. % The following modules all provide general utility functions. They haven't +.. % all been documented yet. + + +:mod:`distutils.archive_util` --- Archiving utilities +====================================================== + +.. module:: distutils.archive_util + :synopsis: Utility functions for creating archive files (tarballs, zip files, ...) + + +This module provides a few functions for creating archive files, such as +tarballs or zipfiles. + + +.. function:: make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=0, dry_run=0]) + + Create an archive file (eg. ``zip`` or ``tar``). *base_name* is the name of + the file to create, minus any format-specific extension; *format* is the + archive format: one of ``zip``, ``tar``, ``ztar``, or ``gztar``. *root_dir* is + a directory that will be the root directory of the archive; ie. we typically + ``chdir`` into *root_dir* before creating the archive. *base_dir* is the + directory where we start archiving from; ie. *base_dir* will be the common + prefix of all files and directories in the archive. *root_dir* and *base_dir* + both default to the current directory. Returns the name of the archive file. + + .. warning:: + + This should be changed to support bz2 files + + +.. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) + + 'Create an (optional compressed) archive as a tar file from all files in and + under *base_dir*. *compress* must be ``'gzip'`` (the default), ``'compress'``, + ``'bzip2'``, or ``None``. Both :program:`tar` and the compression utility named + by *compress* must be on the default program search path, so this is probably + Unix-specific. The output tar file will be named :file:`base_dir.tar`, + possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` + or :file:`.Z`). Return the output filename. + + .. warning:: + + This should be replaced with calls to the :mod:`tarfile` module. + + +.. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) + + Create a zip file from all files in and under *base_dir*. The output zip file + will be named *base_dir* + :file:`.zip`. Uses either the :mod:`zipfile` Python + module (if available) or the InfoZIP :file:`zip` utility (if installed and + found on the default search path). If neither tool is available, raises + :exc:`DistutilsExecError`. Returns the name of the output zip file. + + +:mod:`distutils.dep_util` --- Dependency checking +================================================= + +.. module:: distutils.dep_util + :synopsis: Utility functions for simple dependency checking + + +This module provides functions for performing simple, timestamp-based +dependency of files and groups of files; also, functions based entirely on such +timestamp dependency analysis. + + +.. function:: newer(source, target) + + Return true if *source* exists and is more recently modified than *target*, or + if *source* exists and *target* doesn't. Return false if both exist and *target* + is the same age or newer than *source*. Raise :exc:`DistutilsFileError` if + *source* does not exist. + + +.. function:: newer_pairwise(sources, targets) + + Walk two filename lists in parallel, testing if each source is newer than its + corresponding target. Return a pair of lists (*sources*, *targets*) where + source is newer than target, according to the semantics of :func:`newer` + + .. % % equivalent to a listcomp... + + +.. function:: newer_group(sources, target[, missing='error']) + + Return true if *target* is out-of-date with respect to any file listed in + *sources* In other words, if *target* exists and is newer than every file in + *sources*, return false; otherwise return true. *missing* controls what we do + when a source file is missing; the default (``'error'``) is to blow up with an + :exc:`OSError` from inside :func:`os.stat`; if it is ``'ignore'``, we silently + drop any missing source files; if it is ``'newer'``, any missing source files + make us assume that *target* is out-of-date (this is handy in "dry-run" mode: + it'll make you pretend to carry out commands that wouldn't work because inputs + are missing, but that doesn't matter because you're not actually going to run + the commands). + + +:mod:`distutils.dir_util` --- Directory tree operations +======================================================= + +.. module:: distutils.dir_util + :synopsis: Utility functions for operating on directories and directory trees + + +This module provides functions for operating on directories and trees of +directories. + + +.. function:: mkpath(name[, mode=0777, verbose=0, dry_run=0]) + + Create a directory and any missing ancestor directories. If the directory + already exists (or if *name* is the empty string, which means the current + directory, which of course exists), then do nothing. Raise + :exc:`DistutilsFileError` if unable to create some directory along the way (eg. + some sub-path exists, but is a file rather than a directory). If *verbose* is + true, print a one-line summary of each mkdir to stdout. Return the list of + directories actually created. + + +.. function:: create_tree(base_dir, files[, mode=0777, verbose=0, dry_run=0]) + + Create all the empty directories under *base_dir* needed to put *files* there. + *base_dir* is just the a name of a directory which doesn't necessarily exist + yet; *files* is a list of filenames to be interpreted relative to *base_dir*. + *base_dir* + the directory portion of every file in *files* will be created if + it doesn't already exist. *mode*, *verbose* and *dry_run* flags are as for + :func:`mkpath`. + + +.. function:: copy_tree(src, dst[, preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=0, verbose=0, dry_run=0]) + + Copy an entire directory tree *src* to a new location *dst*. Both *src* and + *dst* must be directory names. If *src* is not a directory, raise + :exc:`DistutilsFileError`. If *dst* does not exist, it is created with + :func:`mkpath`. The end result of the copy is that every file in *src* is + copied to *dst*, and directories under *src* are recursively copied to *dst*. + Return the list of files that were copied or might have been copied, using their + output name. The return value is unaffected by *update* or *dry_run*: it is + simply the list of all files under *src*, with the names changed to be under + *dst*. + + *preserve_mode* and *preserve_times* are the same as for :func:`copy_file` in + :mod:`distutils.file_util`; note that they only apply to regular files, not to + directories. If *preserve_symlinks* is true, symlinks will be copied as + symlinks (on platforms that support them!); otherwise (the default), the + destination of the symlink will be copied. *update* and *verbose* are the same + as for :func:`copy_file`. + + +.. function:: remove_tree(directory[, verbose=0, dry_run=0]) + + Recursively remove *directory* and all files and directories underneath it. Any + errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is + true). + +**\*\*** Some of this could be replaced with the shutil module? **\*\*** + + +:mod:`distutils.file_util` --- Single file operations +===================================================== + +.. module:: distutils.file_util + :synopsis: Utility functions for operating on single files + + +This module contains some utility functions for operating on individual files. + + +.. function:: copy_file(src, dst[, preserve_mode=1, preserve_times=1, update=0, link=None, verbose=0, dry_run=0]) + + Copy file *src* to *dst*. If *dst* is a directory, then *src* is copied there + with the same name; otherwise, it must be a filename. (If the file exists, it + will be ruthlessly clobbered.) If *preserve_mode* is true (the default), the + file's mode (type and permission bits, or whatever is analogous on the + current platform) is copied. If *preserve_times* is true (the default), the + last-modified and last-access times are copied as well. If *update* is true, + *src* will only be copied if *dst* does not exist, or if *dst* does exist but + is older than *src*. + + *link* allows you to make hard links (using :func:`os.link`) or symbolic links + (using :func:`os.symlink`) instead of copying: set it to ``'hard'`` or + ``'sym'``; if it is ``None`` (the default), files are copied. Don't set *link* + on systems that don't support it: :func:`copy_file` doesn't check if hard or + symbolic linking is available. It uses :func:`_copy_file_contents` to copy file + contents. + + Return a tuple ``(dest_name, copied)``: *dest_name* is the actual name of the + output file, and *copied* is true if the file was copied (or would have been + copied, if *dry_run* true). + + .. % XXX if the destination file already exists, we clobber it if + .. % copying, but blow up if linking. Hmmm. And I don't know what + .. % macostools.copyfile() does. Should definitely be consistent, and + .. % should probably blow up if destination exists and we would be + .. % changing it (ie. it's not already a hard/soft link to src OR + .. % (not update) and (src newer than dst)). + + +.. function:: move_file(src, dst[, verbose, dry_run]) + + Move file *src* to *dst*. If *dst* is a directory, the file will be moved into + it with the same name; otherwise, *src* is just renamed to *dst*. Returns the + new full name of the file. + + .. warning:: + + Handles cross-device moves on Unix using :func:`copy_file`. What about other + systems??? + + +.. function:: write_file(filename, contents) + + Create a file called *filename* and write *contents* (a sequence of strings + without line terminators) to it. + + +:mod:`distutils.util` --- Miscellaneous other utility functions +=============================================================== + +.. module:: distutils.util + :synopsis: Miscellaneous other utility functions + + +This module contains other assorted bits and pieces that don't fit into any +other utility module. + + +.. function:: get_platform() + + Return a string that identifies the current platform. This is used mainly to + distinguish platform-specific build directories and platform-specific built + distributions. Typically includes the OS name and version and the architecture + (as supplied by 'os.uname()'), although the exact information included depends + on the OS; eg. for IRIX the architecture isn't particularly important (IRIX only + runs on SGI hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + + * ``linux-i586`` + * ``linux-alpha`` + * ``solaris-2.6-sun4u`` + * ``irix-5.3`` + * ``irix64-6.2`` + + For non-POSIX platforms, currently just returns ``sys.platform``. + + .. % XXX isn't this also provided by some other non-distutils module? + + +.. function:: convert_path(pathname) + + Return 'pathname' as a name that will work on the native filesystem, i.e. split + it on '/' and put it back together again using the current directory separator. + Needed because filenames in the setup script are always supplied in Unix style, + and have to be converted to the local convention before we can actually use them + in the filesystem. Raises :exc:`ValueError` on non-Unix-ish systems if + *pathname* either starts or ends with a slash. + + +.. function:: change_root(new_root, pathname) + + Return *pathname* with *new_root* prepended. If *pathname* is relative, this is + equivalent to ``os.path.join(new_root,pathname)`` Otherwise, it requires making + *pathname* relative and then joining the two, which is tricky on DOS/Windows. + + +.. function:: check_environ() + + Ensure that 'os.environ' has all the environment variables we guarantee that + users can use in config files, command-line options, etc. Currently this + includes: + + * :envvar:`HOME` - user's home directory (Unix only) + * :envvar:`PLAT` - description of the current platform, including hardware and + OS (see :func:`get_platform`) + + +.. function:: subst_vars(s, local_vars) + + Perform shell/Perl-style variable substitution on *s*. Every occurrence of + ``$`` followed by a name is considered a variable, and variable is substituted + by the value found in the *local_vars* dictionary, or in ``os.environ`` if it's + not in *local_vars*. *os.environ* is first checked/augmented to guarantee that + it contains certain values: see :func:`check_environ`. Raise :exc:`ValueError` + for any variables not found in either *local_vars* or ``os.environ``. + + Note that this is not a fully-fledged string interpolation function. A valid + ``$variable`` can consist only of upper and lower case letters, numbers and an + underscore. No { } or ( ) style quoting is available. + + +.. function:: grok_environment_error(exc[, prefix='error: ']) + + Generate a useful error message from an :exc:`EnvironmentError` (:exc:`IOError` + or :exc:`OSError`) exception object. Handles Python 1.5.1 and later styles, + and does what it can to deal with exception objects that don't have a filename + (which happens when the error is due to a two-file operation, such as + :func:`rename` or :func:`link`). Returns the error message as a string + prefixed with *prefix*. + + +.. function:: split_quoted(s) + + Split a string up according to Unix shell-like rules for quotes and backslashes. + In short: words are delimited by spaces, as long as those spaces are not escaped + by a backslash, or inside a quoted string. Single and double quotes are + equivalent, and the quote characters can be backslash-escaped. The backslash is + stripped from any two-character escape sequence, leaving only the escaped + character. The quote characters are stripped from any quoted string. Returns a + list of words. + + .. % Should probably be moved into the standard library. + + +.. function:: execute(func, args[, msg=None, verbose=0, dry_run=0]) + + Perform some action that affects the outside world (for instance, writing to the + filesystem). Such actions are special because they are disabled by the + *dry_run* flag. This method takes care of all that bureaucracy for you; all + you have to do is supply the function to call and an argument tuple for it (to + embody the "external action" being performed), and an optional message to print. + + +.. function:: strtobool(val) + + Convert a string representation of truth to true (1) or false (0). + + True values are ``y``, ``yes``, ``t``, ``true``, ``on`` and ``1``; false values + are ``n``, ``no``, ``f``, ``false``, ``off`` and ``0``. Raises + :exc:`ValueError` if *val* is anything else. + + +.. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) + + Byte-compile a collection of Python source files to either :file:`.pyc` or + :file:`.pyo` files in the same directory. *py_files* is a list of files to + compile; any files that don't end in :file:`.py` are silently skipped. + *optimize* must be one of the following: + + * ``0`` - don't optimize (generate :file:`.pyc`) + * ``1`` - normal optimization (like ``python -O``) + * ``2`` - extra optimization (like ``python -OO``) + + If *force* is true, all files are recompiled regardless of timestamps. + + The source filename encoded in each bytecode file defaults to the filenames + listed in *py_files*; you can modify these with *prefix* and *basedir*. + *prefix* is a string that will be stripped off of each source filename, and + *base_dir* is a directory name that will be prepended (after *prefix* is + stripped). You can supply either or both (or neither) of *prefix* and + *base_dir*, as you wish. + + If *dry_run* is true, doesn't actually do anything that would affect the + filesystem. + + Byte-compilation is either done directly in this interpreter process with the + standard :mod:`py_compile` module, or indirectly by writing a temporary script + and executing it. Normally, you should let :func:`byte_compile` figure out to + use direct compilation or not (see the source for details). The *direct* flag + is used by the script generated in indirect mode; unless you know what you're + doing, leave it set to ``None``. + + +.. function:: rfc822_escape(header) + + Return a version of *header* escaped for inclusion in an :rfc:`822` header, by + ensuring there are 8 spaces space after each newline. Note that it does no other + modification of the string. + + .. % this _can_ be replaced + +.. % \subsection{Distutils objects} + + +:mod:`distutils.dist` --- The Distribution class +================================================ + +.. module:: distutils.dist + :synopsis: Provides the Distribution class, which represents the module distribution being + built/installed/distributed + + +This module provides the :class:`Distribution` class, which represents the +module distribution being built/installed/distributed. + + +:mod:`distutils.extension` --- The Extension class +================================================== + +.. module:: distutils.extension + :synopsis: Provides the Extension class, used to describe C/C++ extension modules in setup + scripts + + +This module provides the :class:`Extension` class, used to describe C/C++ +extension modules in setup scripts. + +.. % \subsection{Ungrouped modules} +.. % The following haven't been moved into a more appropriate section yet. + + +:mod:`distutils.debug` --- Distutils debug mode +=============================================== + +.. module:: distutils.debug + :synopsis: Provides the debug flag for distutils + + +This module provides the DEBUG flag. + + +:mod:`distutils.errors` --- Distutils exceptions +================================================ + +.. module:: distutils.errors + :synopsis: Provides standard distutils exceptions + + +Provides exceptions used by the Distutils modules. Note that Distutils modules +may raise standard exceptions; in particular, SystemExit is usually raised for +errors that are obviously the end-user's fault (eg. bad command-line arguments). + +This module is safe to use in ``from ... import *`` mode; it only exports +symbols whose names start with ``Distutils`` and end with ``Error``. + + +:mod:`distutils.fancy_getopt` --- Wrapper around the standard getopt module +=========================================================================== + +.. module:: distutils.fancy_getopt + :synopsis: Additional getopt functionality + + +This module provides a wrapper around the standard :mod:`getopt` module that +provides the following additional features: + +* short and long options are tied together + +* options have help strings, so :func:`fancy_getopt` could potentially create a + complete usage summary + +* options set attributes of a passed-in object + +* boolean options can have "negative aliases" --- eg. if :option:`--quiet` is + the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the + command line sets *verbose* to false. + +**\*\*** Should be replaced with :mod:`optik` (which is also now known as +:mod:`optparse` in Python 2.3 and later). **\*\*** + + +.. function:: fancy_getopt(options, negative_opt, object, args) + + Wrapper function. *options* is a list of ``(long_option, short_option, + help_string)`` 3-tuples as described in the constructor for + :class:`FancyGetopt`. *negative_opt* should be a dictionary mapping option names + to option names, both the key and value should be in the *options* list. + *object* is an object which will be used to store values (see the :meth:`getopt` + method of the :class:`FancyGetopt` class). *args* is the argument list. Will use + ``sys.argv[1:]`` if you pass ``None`` as *args*. + + +.. function:: wrap_text(text, width) + + Wraps *text* to less than *width* wide. + + .. warning:: + + Should be replaced with :mod:`textwrap` (which is available in Python 2.3 and + later). + + +.. class:: FancyGetopt([option_table=None]) + + The option_table is a list of 3-tuples: ``(long_option, short_option, + help_string)`` + + If an option takes an argument, its *long_option* should have ``'='`` appended; + *short_option* should just be a single character, no ``':'`` in any case. + *short_option* should be ``None`` if a *long_option* doesn't have a + corresponding *short_option*. All option tuples must have long options. + +The :class:`FancyGetopt` class provides the following methods: + + +.. method:: FancyGetopt.getopt([args=None, object=None]) + + Parse command-line options in args. Store as attributes on *object*. + + If *args* is ``None`` or not supplied, uses ``sys.argv[1:]``. If *object* is + ``None`` or not supplied, creates a new :class:`OptionDummy` instance, stores + option values there, and returns a tuple ``(args, object)``. If *object* is + supplied, it is modified in place and :func:`getopt` just returns *args*; in + both cases, the returned *args* is a modified copy of the passed-in *args* list, + which is left untouched. + + .. % and args returned are? + + +.. method:: FancyGetopt.get_option_order() + + Returns the list of ``(option, value)`` tuples processed by the previous run of + :meth:`getopt` Raises :exc:`RuntimeError` if :meth:`getopt` hasn't been called + yet. + + +.. method:: FancyGetopt.generate_help([header=None]) + + Generate help text (a list of strings, one per suggested line of output) from + the option table for this :class:`FancyGetopt` object. + + If supplied, prints the supplied *header* at the top of the help. + + +:mod:`distutils.filelist` --- The FileList class +================================================ + +.. module:: distutils.filelist + :synopsis: The FileList class, used for poking about the file system and building lists of + files. + + +This module provides the :class:`FileList` class, used for poking about the +filesystem and building lists of files. + + +:mod:`distutils.log` --- Simple PEP 282-style logging +===================================================== + +.. module:: distutils.log + :synopsis: A simple logging mechanism, 282-style + + +.. warning:: + + Should be replaced with standard :mod:`logging` module. + +.. % \subsubsection{\module{} --- } +.. % \declaremodule{standard}{distutils.magic} +.. % \modulesynopsis{ } + + +:mod:`distutils.spawn` --- Spawn a sub-process +============================================== + +.. module:: distutils.spawn + :synopsis: Provides the spawn() function + + +This module provides the :func:`spawn` function, a front-end to various +platform-specific functions for launching another program in a sub-process. +Also provides :func:`find_executable` to search the path for a given executable +name. + + +:mod:`distutils.sysconfig` --- System configuration information +=============================================================== + +.. module:: distutils.sysconfig + :synopsis: Low-level access to configuration information of the Python interpreter. +.. moduleauthor:: Fred L. Drake, Jr. +.. moduleauthor:: Greg Ward +.. sectionauthor:: Fred L. Drake, Jr. + + +The :mod:`distutils.sysconfig` module provides access to Python's low-level +configuration information. The specific configuration variables available +depend heavily on the platform and configuration. The specific variables depend +on the build process for the specific version of Python being run; the variables +are those found in the :file:`Makefile` and configuration header that are +installed with Python on Unix systems. The configuration header is called +:file:`pyconfig.h` for Python versions starting with 2.2, and :file:`config.h` +for earlier versions of Python. + +Some additional functions are provided which perform some useful manipulations +for other parts of the :mod:`distutils` package. + + +.. data:: PREFIX + + The result of ``os.path.normpath(sys.prefix)``. + + +.. data:: EXEC_PREFIX + + The result of ``os.path.normpath(sys.exec_prefix)``. + + +.. function:: get_config_var(name) + + Return the value of a single variable. This is equivalent to + ``get_config_vars().get(name)``. + + +.. function:: get_config_vars(...) + + Return a set of variable definitions. If there are no arguments, this returns a + dictionary mapping names of configuration variables to values. If arguments are + provided, they should be strings, and the return value will be a sequence giving + the associated values. If a given name does not have a corresponding value, + ``None`` will be included for that variable. + + +.. function:: get_config_h_filename() + + Return the full path name of the configuration header. For Unix, this will be + the header generated by the :program:`configure` script; for other platforms the + header will have been supplied directly by the Python source distribution. The + file is a platform-specific text file. + + +.. function:: get_makefile_filename() + + Return the full path name of the :file:`Makefile` used to build Python. For + Unix, this will be a file generated by the :program:`configure` script; the + meaning for other platforms will vary. The file is a platform-specific text + file, if it exists. This function is only useful on POSIX platforms. + + +.. function:: get_python_inc([plat_specific[, prefix]]) + + Return the directory for either the general or platform-dependent C include + files. If *plat_specific* is true, the platform-dependent include directory is + returned; if false or omitted, the platform-independent directory is returned. + If *prefix* is given, it is used as either the prefix instead of + :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if + *plat_specific* is true. + + +.. function:: get_python_lib([plat_specific[, standard_lib[, prefix]]]) + + Return the directory for either the general or platform-dependent library + installation. If *plat_specific* is true, the platform-dependent include + directory is returned; if false or omitted, the platform-independent directory + is returned. If *prefix* is given, it is used as either the prefix instead of + :const:`PREFIX`, or as the exec-prefix instead of :const:`EXEC_PREFIX` if + *plat_specific* is true. If *standard_lib* is true, the directory for the + standard library is returned rather than the directory for the installation of + third-party extensions. + +The following function is only intended for use within the :mod:`distutils` +package. + + +.. function:: customize_compiler(compiler) + + Do any platform-specific customization of a + :class:`distutils.ccompiler.CCompiler` instance. + + This function is only needed on Unix at this time, but should be called + consistently to support forward-compatibility. It inserts the information that + varies across Unix flavors and is stored in Python's :file:`Makefile`. This + information includes the selected compiler, compiler and linker options, and the + extension used by the linker for shared objects. + +This function is even more special-purpose, and should only be used from +Python's own build procedures. + + +.. function:: set_python_build() + + Inform the :mod:`distutils.sysconfig` module that it is being used as part of + the build process for Python. This changes a lot of relative locations for + files, allowing them to be located in the build area rather than in an installed + Python. + + +:mod:`distutils.text_file` --- The TextFile class +================================================= + +.. module:: distutils.text_file + :synopsis: provides the TextFile class, a simple interface to text files + + +This module provides the :class:`TextFile` class, which gives an interface to +text files that (optionally) takes care of stripping comments, ignoring blank +lines, and joining lines with backslashes. + + +.. class:: TextFile([filename=None, file=None, **options]) + + This class provides a file-like object that takes care of all the things you + commonly want to do when processing a text file that has some line-by-line + syntax: strip comments (as long as ``#`` is your comment character), skip blank + lines, join adjacent lines by escaping the newline (ie. backslash at end of + line), strip leading and/or trailing whitespace. All of these are optional and + independently controllable. + + The class provides a :meth:`warn` method so you can generate warning messages + that report physical line number, even if the logical line in question spans + multiple physical lines. Also provides :meth:`unreadline` for implementing + line-at-a-time lookahead. + + :class:`TextFile` instances are create with either *filename*, *file*, or both. + :exc:`RuntimeError` is raised if both are ``None``. *filename* should be a + string, and *file* a file object (or something that provides :meth:`readline` + and :meth:`close` methods). It is recommended that you supply at least + *filename*, so that :class:`TextFile` can include it in warning messages. If + *file* is not supplied, :class:`TextFile` creates its own using the + :func:`open` built-in function. + + The options are all boolean, and affect the values returned by :meth:`readline` + + +------------------+--------------------------------+---------+ + | option name | description | default | + +==================+================================+=========+ + | *strip_comments* | strip from ``'#'`` to end-of- | true | + | | line, as well as any | | + | | whitespace leading up to the | | + | | ``'#'``\ ---unless it is | | + | | escaped by a backslash | | + +------------------+--------------------------------+---------+ + | *lstrip_ws* | strip leading whitespace from | false | + | | each line before returning it | | + +------------------+--------------------------------+---------+ + | *rstrip_ws* | strip trailing whitespace | true | + | | (including line terminator!) | | + | | from each line before | | + | | returning it. | | + +------------------+--------------------------------+---------+ + | *skip_blanks* | skip lines that are empty | true | + | | \*after\* stripping comments | | + | | and whitespace. (If both | | + | | lstrip_ws and rstrip_ws are | | + | | false, then some lines may | | + | | consist of solely whitespace: | | + | | these will \*not\* be skipped, | | + | | even if *skip_blanks* is | | + | | true.) | | + +------------------+--------------------------------+---------+ + | *join_lines* | if a backslash is the last | false | + | | non-newline character on a | | + | | line after stripping comments | | + | | and whitespace, join the | | + | | following line to it to form | | + | | one logical line; if N | | + | | consecutive lines end with a | | + | | backslash, then N+1 physical | | + | | lines will be joined to form | | + | | one logical line. | | + +------------------+--------------------------------+---------+ + | *collapse_join* | strip leading whitespace from | false | + | | lines that are joined to their | | + | | predecessor; only matters if | | + | | ``(join_lines and not | | + | | lstrip_ws)`` | | + +------------------+--------------------------------+---------+ + + Note that since *rstrip_ws* can strip the trailing newline, the semantics of + :meth:`readline` must differ from those of the builtin file object's + :meth:`readline` method! In particular, :meth:`readline` returns ``None`` for + end-of-file: an empty string might just be a blank line (or an all-whitespace + line), if *rstrip_ws* is true but *skip_blanks* is not. + + + .. method:: TextFile.open(filename) + + Open a new file *filename*. This overrides any *file* or *filename* constructor + arguments. + + + .. method:: TextFile.close() + + Close the current file and forget everything we know about it (including the + filename and the current line number). + + + .. method:: TextFile.warn(msg[,line=None]) + + Print (to stderr) a warning message tied to the current logical line in the + current file. If the current logical line in the file spans multiple physical + lines, the warning refers to the whole range, such as ``"lines 3-5"``. If + *line* is supplied, it overrides the current line number; it may be a list or + tuple to indicate a range of physical lines, or an integer for a single + physical line. + + + .. method:: TextFile.readline() + + Read and return a single logical line from the current file (or from an internal + buffer if lines have previously been "unread" with :meth:`unreadline`). If the + *join_lines* option is true, this may involve reading multiple physical lines + concatenated into a single string. Updates the current line number, so calling + :meth:`warn` after :meth:`readline` emits a warning about the physical line(s) + just read. Returns ``None`` on end-of-file, since the empty string can occur + if *rstrip_ws* is true but *strip_blanks* is not. + + + .. method:: TextFile.readlines() + + Read and return the list of all logical lines remaining in the current file. + This updates the current line number to the last line of the file. + + + .. method:: TextFile.unreadline(line) + + Push *line* (a string) onto an internal buffer that will be checked by future + :meth:`readline` calls. Handy for implementing a parser with line-at-a-time + lookahead. Note that lines that are "unread" with :meth:`unreadline` are not + subsequently re-cleansed (whitespace stripped, or whatever) when read with + :meth:`readline`. If multiple calls are made to :meth:`unreadline` before a call + to :meth:`readline`, the lines will be returned most in most recent first order. + + +:mod:`distutils.version` --- Version number classes +=================================================== + +.. module:: distutils.version + :synopsis: implements classes that represent module version numbers. + + +.. % todo +.. % \section{Distutils Commands} +.. % +.. % This part of Distutils implements the various Distutils commands, such +.. % as \code{build}, \code{install} \&c. Each command is implemented as a +.. % separate module, with the command name as the name of the module. + + +:mod:`distutils.cmd` --- Abstract base class for Distutils commands +=================================================================== + +.. module:: distutils.cmd + :synopsis: This module provides the abstract base class Command. This class is subclassed + by the modules in the distutils.command subpackage. + + +This module supplies the abstract base class :class:`Command`. + + +.. class:: Command(dist) + + Abstract base class for defining command classes, the "worker bees" of the + Distutils. A useful analogy for command classes is to think of them as + subroutines with local variables called *options*. The options are declared in + :meth:`initialize_options` and defined (given their final values) in + :meth:`finalize_options`, both of which must be defined by every command class. + The distinction between the two is necessary because option values might come + from the outside world (command line, config file, ...), and any options + dependent on other options must be computed after these outside influences have + been processed --- hence :meth:`finalize_options`. The body of the subroutine, + where it does all its work based on the values of its options, is the + :meth:`run` method, which must also be implemented by every command class. + + The class constructor takes a single argument *dist*, a :class:`Distribution` + instance. + + +:mod:`distutils.command` --- Individual Distutils commands +========================================================== + +.. module:: distutils.command + :synopsis: This subpackage contains one module for each standard Distutils command. + + +.. % \subsubsection{Individual Distutils commands} +.. % todo + + +:mod:`distutils.command.bdist` --- Build a binary installer +=========================================================== + +.. module:: distutils.command.bdist + :synopsis: Build a binary installer for a package + + +.. % todo + + +:mod:`distutils.command.bdist_packager` --- Abstract base class for packagers +============================================================================= + +.. module:: distutils.command.bdist_packager + :synopsis: Abstract base class for packagers + + +.. % todo + + +:mod:`distutils.command.bdist_dumb` --- Build a "dumb" installer +================================================================ + +.. module:: distutils.command.bdist_dumb + :synopsis: Build a "dumb" installer - a simple archive of files + + +.. % todo + + +:mod:`distutils.command.bdist_msi` --- Build a Microsoft Installer binary package +================================================================================= + +.. module:: distutils.command.bdist_msi + :synopsis: Build a binary distribution as a Windows MSI file + + +.. % todo + + +:mod:`distutils.command.bdist_rpm` --- Build a binary distribution as a Redhat RPM and SRPM +=========================================================================================== + +.. module:: distutils.command.bdist_rpm + :synopsis: Build a binary distribution as a Redhat RPM and SRPM + + +.. % todo + + +:mod:`distutils.command.bdist_wininst` --- Build a Windows installer +==================================================================== + +.. module:: distutils.command.bdist_wininst + :synopsis: Build a Windows installer + + +.. % todo + + +:mod:`distutils.command.sdist` --- Build a source distribution +============================================================== + +.. module:: distutils.command.sdist + :synopsis: Build a source distribution + + +.. % todo + + +:mod:`distutils.command.build` --- Build all files of a package +=============================================================== + +.. module:: distutils.command.build + :synopsis: Build all files of a package + + +.. % todo + + +:mod:`distutils.command.build_clib` --- Build any C libraries in a package +========================================================================== + +.. module:: distutils.command.build_clib + :synopsis: Build any C libraries in a package + + +.. % todo + + +:mod:`distutils.command.build_ext` --- Build any extensions in a package +======================================================================== + +.. module:: distutils.command.build_ext + :synopsis: Build any extensions in a package + + +.. % todo + + +:mod:`distutils.command.build_py` --- Build the .py/.pyc files of a package +=========================================================================== + +.. module:: distutils.command.build_py + :synopsis: Build the .py/.pyc files of a package + + +.. % todo + + +:mod:`distutils.command.build_scripts` --- Build the scripts of a package +========================================================================= + +.. module:: distutils.command.build_scripts + :synopsis: Build the scripts of a package + + +.. % todo + + +:mod:`distutils.command.clean` --- Clean a package build area +============================================================= + +.. module:: distutils.command.clean + :synopsis: Clean a package build area + + +.. % todo + + +:mod:`distutils.command.config` --- Perform package configuration +================================================================= + +.. module:: distutils.command.config + :synopsis: Perform package configuration + + +.. % todo + + +:mod:`distutils.command.install` --- Install a package +====================================================== + +.. module:: distutils.command.install + :synopsis: Install a package + + +.. % todo + + +:mod:`distutils.command.install_data` --- Install data files from a package +=========================================================================== + +.. module:: distutils.command.install_data + :synopsis: Install data files from a package + + +.. % todo + + +:mod:`distutils.command.install_headers` --- Install C/C++ header files from a package +====================================================================================== + +.. module:: distutils.command.install_headers + :synopsis: Install C/C++ header files from a package + + +.. % todo + + +:mod:`distutils.command.install_lib` --- Install library files from a package +============================================================================= + +.. module:: distutils.command.install_lib + :synopsis: Install library files from a package + + +.. % todo + + +:mod:`distutils.command.install_scripts` --- Install script files from a package +================================================================================ + +.. module:: distutils.command.install_scripts + :synopsis: Install script files from a package + + +.. % todo + + +:mod:`distutils.command.register` --- Register a module with the Python Package Index +===================================================================================== + +.. module:: distutils.command.register + :synopsis: Register a module with the Python Package Index + + +The ``register`` command registers the package with the Python Package Index. +This is described in more detail in :pep:`301`. + +.. % todo + + +Creating a new Distutils command +================================ + +This section outlines the steps to create a new Distutils command. + +A new command lives in a module in the :mod:`distutils.command` package. There +is a sample template in that directory called :file:`command_template`. Copy +this file to a new module with the same name as the new command you're +implementing. This module should implement a class with the same name as the +module (and the command). So, for instance, to create the command +``peel_banana`` (so that users can run ``setup.py peel_banana``), you'd copy +:file:`command_template` to :file:`distutils/command/peel_banana.py`, then edit +it so that it's implementing the class :class:`peel_banana`, a subclass of +:class:`distutils.cmd.Command`. + +Subclasses of :class:`Command` must define the following methods. + + +.. method:: Command.initialize_options()(S) + + et default values for all the options that this command supports. Note that + these defaults may be overridden by other commands, by the setup script, by + config files, or by the command-line. Thus, this is not the place to code + dependencies between options; generally, :meth:`initialize_options` + implementations are just a bunch of ``self.foo = None`` assignments. + + +.. method:: Command.finalize_options() + + Set final values for all the options that this command supports. This is + always called as late as possible, ie. after any option assignments from the + command-line or from other commands have been done. Thus, this is the place + to to code option dependencies: if *foo* depends on *bar*, then it is safe to + set *foo* from *bar* as long as *foo* still has the same value it was + assigned in :meth:`initialize_options`. + + +.. method:: Command.run() + + A command's raison d'etre: carry out the action it exists to perform, controlled + by the options initialized in :meth:`initialize_options`, customized by other + commands, the setup script, the command-line, and config files, and finalized in + :meth:`finalize_options`. All terminal output and filesystem interaction should + be done by :meth:`run`. + +*sub_commands* formalizes the notion of a "family" of commands, eg. ``install`` +as the parent with sub-commands ``install_lib``, ``install_headers``, etc. The +parent of a family of commands defines *sub_commands* as a class attribute; it's +a list of 2-tuples ``(command_name, predicate)``, with *command_name* a string +and *predicate* an unbound method, a string or None. *predicate* is a method of +the parent command that determines whether the corresponding command is +applicable in the current situation. (Eg. we ``install_headers`` is only +applicable if we have any C header files to install.) If *predicate* is None, +that command is always applicable. + +*sub_commands* is usually defined at the \*end\* of a class, because predicates +can be unbound methods, so they must already have been defined. The canonical +example is the :command:`install` command. diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst new file mode 100644 index 0000000..b40ddeb --- /dev/null +++ b/Doc/distutils/builtdist.rst @@ -0,0 +1,405 @@ +.. _built-dist: + +**************************** +Creating Built Distributions +**************************** + +A "built distribution" is what you're probably used to thinking of either as a +"binary package" or an "installer" (depending on your background). It's not +necessarily binary, though, because it might contain only Python source code +and/or byte-code; and we don't call it a package, because that word is already +spoken for in Python. (And "installer" is a term specific to the world of +mainstream desktop systems.) + +A built distribution is how you make life as easy as possible for installers of +your module distribution: for users of RPM-based Linux systems, it's a binary +RPM; for Windows users, it's an executable installer; for Debian-based Linux +users, it's a Debian package; and so forth. Obviously, no one person will be +able to create built distributions for every platform under the sun, so the +Distutils are designed to enable module developers to concentrate on their +specialty---writing code and creating source distributions---while an +intermediary species called *packagers* springs up to turn source distributions +into built distributions for as many platforms as there are packagers. + +Of course, the module developer could be his own packager; or the packager could +be a volunteer "out there" somewhere who has access to a platform which the +original developer does not; or it could be software periodically grabbing new +source distributions and turning them into built distributions for as many +platforms as the software has access to. Regardless of who they are, a packager +uses the setup script and the :command:`bdist` command family to generate built +distributions. + +As a simple example, if I run the following command in the Distutils source +tree:: + + python setup.py bdist + +then the Distutils builds my module distribution (the Distutils itself in this +case), does a "fake" installation (also in the :file:`build` directory), and +creates the default type of built distribution for my platform. The default +format for built distributions is a "dumb" tar file on Unix, and a simple +executable installer on Windows. (That tar file is considered "dumb" because it +has to be unpacked in a specific location to work.) + +Thus, the above command on a Unix system creates +:file:`Distutils-1.0.{plat}.tar.gz`; unpacking this tarball from the right place +installs the Distutils just as though you had downloaded the source distribution +and run ``python setup.py install``. (The "right place" is either the root of +the filesystem or Python's :file:`{prefix}` directory, depending on the options +given to the :command:`bdist_dumb` command; the default is to make dumb +distributions relative to :file:`{prefix}`.) + +Obviously, for pure Python distributions, this isn't any simpler than just +running ``python setup.py install``\ ---but for non-pure distributions, which +include extensions that would need to be compiled, it can mean the difference +between someone being able to use your extensions or not. And creating "smart" +built distributions, such as an RPM package or an executable installer for +Windows, is far more convenient for users even if your distribution doesn't +include any extensions. + +The :command:`bdist` command has a :option:`--formats` option, similar to the +:command:`sdist` command, which you can use to select the types of built +distribution to generate: for example, :: + + python setup.py bdist --format=zip + +would, when run on a Unix system, create :file:`Distutils-1.0.{plat}.zip`\ +---again, this archive would be unpacked from the root directory to install the +Distutils. + +The available formats for built distributions are: + ++-------------+------------------------------+---------+ +| Format | Description | Notes | ++=============+==============================+=========+ +| ``gztar`` | gzipped tar file | (1),(3) | +| | (:file:`.tar.gz`) | | ++-------------+------------------------------+---------+ +| ``ztar`` | compressed tar file | \(3) | +| | (:file:`.tar.Z`) | | ++-------------+------------------------------+---------+ +| ``tar`` | tar file (:file:`.tar`) | \(3) | ++-------------+------------------------------+---------+ +| ``zip`` | zip file (:file:`.zip`) | \(4) | ++-------------+------------------------------+---------+ +| ``rpm`` | RPM | \(5) | ++-------------+------------------------------+---------+ +| ``pkgtool`` | Solaris :program:`pkgtool` | | ++-------------+------------------------------+---------+ +| ``sdux`` | HP-UX :program:`swinstall` | | ++-------------+------------------------------+---------+ +| ``rpm`` | RPM | \(5) | ++-------------+------------------------------+---------+ +| ``wininst`` | self-extracting ZIP file for | (2),(4) | +| | Windows | | ++-------------+------------------------------+---------+ + +Notes: + +(1) + default on Unix + +(2) + default on Windows + + **\*\*** to-do! **\*\*** + +(3) + requires external utilities: :program:`tar` and possibly one of :program:`gzip`, + :program:`bzip2`, or :program:`compress` + +(4) + requires either external :program:`zip` utility or :mod:`zipfile` module (part + of the standard Python library since Python 1.6) + +(5) + requires external :program:`rpm` utility, version 3.0.4 or better (use ``rpm + --version`` to find out which version you have) + +You don't have to use the :command:`bdist` command with the :option:`--formats` +option; you can also use the command that directly implements the format you're +interested in. Some of these :command:`bdist` "sub-commands" actually generate +several similar formats; for instance, the :command:`bdist_dumb` command +generates all the "dumb" archive formats (``tar``, ``ztar``, ``gztar``, and +``zip``), and :command:`bdist_rpm` generates both binary and source RPMs. The +:command:`bdist` sub-commands, and the formats generated by each, are: + ++--------------------------+-----------------------+ +| Command | Formats | ++==========================+=======================+ +| :command:`bdist_dumb` | tar, ztar, gztar, zip | ++--------------------------+-----------------------+ +| :command:`bdist_rpm` | rpm, srpm | ++--------------------------+-----------------------+ +| :command:`bdist_wininst` | wininst | ++--------------------------+-----------------------+ + +The following sections give details on the individual :command:`bdist_\*` +commands. + + +.. _creating-dumb: + +Creating dumb built distributions +================================= + +**\*\*** Need to document absolute vs. prefix-relative packages here, but first +I have to implement it! **\*\*** + + +.. _creating-rpms: + +Creating RPM packages +===================== + +The RPM format is used by many popular Linux distributions, including Red Hat, +SuSE, and Mandrake. If one of these (or any of the other RPM-based Linux +distributions) is your usual environment, creating RPM packages for other users +of that same distribution is trivial. Depending on the complexity of your module +distribution and differences between Linux distributions, you may also be able +to create RPMs that work on different RPM-based distributions. + +The usual way to create an RPM of your module distribution is to run the +:command:`bdist_rpm` command:: + + python setup.py bdist_rpm + +or the :command:`bdist` command with the :option:`--format` option:: + + python setup.py bdist --formats=rpm + +The former allows you to specify RPM-specific options; the latter allows you to +easily specify multiple formats in one run. If you need to do both, you can +explicitly specify multiple :command:`bdist_\*` commands and their options:: + + python setup.py bdist_rpm --packager="John Doe " \ + bdist_wininst --target_version="2.0" + +Creating RPM packages is driven by a :file:`.spec` file, much as using the +Distutils is driven by the setup script. To make your life easier, the +:command:`bdist_rpm` command normally creates a :file:`.spec` file based on the +information you supply in the setup script, on the command line, and in any +Distutils configuration files. Various options and sections in the +:file:`.spec` file are derived from options in the setup script as follows: + ++------------------------------------------+----------------------------------------------+ +| RPM :file:`.spec` file option or section | Distutils setup script option | ++==========================================+==============================================+ +| Name | :option:`name` | ++------------------------------------------+----------------------------------------------+ +| Summary (in preamble) | :option:`description` | ++------------------------------------------+----------------------------------------------+ +| Version | :option:`version` | ++------------------------------------------+----------------------------------------------+ +| Vendor | :option:`author` and :option:`author_email`, | +| | or --- & :option:`maintainer` and | +| | :option:`maintainer_email` | ++------------------------------------------+----------------------------------------------+ +| Copyright | :option:`licence` | ++------------------------------------------+----------------------------------------------+ +| Url | :option:`url` | ++------------------------------------------+----------------------------------------------+ +| %description (section) | :option:`long_description` | ++------------------------------------------+----------------------------------------------+ + +Additionally, there are many options in :file:`.spec` files that don't have +corresponding options in the setup script. Most of these are handled through +options to the :command:`bdist_rpm` command as follows: + ++-------------------------------+-----------------------------+-------------------------+ +| RPM :file:`.spec` file option | :command:`bdist_rpm` option | default value | +| or section | | | ++===============================+=============================+=========================+ +| Release | :option:`release` | "1" | ++-------------------------------+-----------------------------+-------------------------+ +| Group | :option:`group` | "Development/Libraries" | ++-------------------------------+-----------------------------+-------------------------+ +| Vendor | :option:`vendor` | (see above) | ++-------------------------------+-----------------------------+-------------------------+ +| Packager | :option:`packager` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Provides | :option:`provides` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Requires | :option:`requires` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Conflicts | :option:`conflicts` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Obsoletes | :option:`obsoletes` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Distribution | :option:`distribution_name` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| BuildRequires | :option:`build_requires` | (none) | ++-------------------------------+-----------------------------+-------------------------+ +| Icon | :option:`icon` | (none) | ++-------------------------------+-----------------------------+-------------------------+ + +Obviously, supplying even a few of these options on the command-line would be +tedious and error-prone, so it's usually best to put them in the setup +configuration file, :file:`setup.cfg`\ ---see section :ref:`setup-config`. If +you distribute or package many Python module distributions, you might want to +put options that apply to all of them in your personal Distutils configuration +file (:file:`~/.pydistutils.cfg`). + +There are three steps to building a binary RPM package, all of which are +handled automatically by the Distutils: + +#. create a :file:`.spec` file, which describes the package (analogous to the + Distutils setup script; in fact, much of the information in the setup script + winds up in the :file:`.spec` file) + +#. create the source RPM + +#. create the "binary" RPM (which may or may not contain binary code, depending + on whether your module distribution contains Python extensions) + +Normally, RPM bundles the last two steps together; when you use the Distutils, +all three steps are typically bundled together. + +If you wish, you can separate these three steps. You can use the +:option:`--spec-only` option to make :command:`bdist_rpm` just create the +:file:`.spec` file and exit; in this case, the :file:`.spec` file will be +written to the "distribution directory"---normally :file:`dist/`, but +customizable with the :option:`--dist-dir` option. (Normally, the :file:`.spec` +file winds up deep in the "build tree," in a temporary directory created by +:command:`bdist_rpm`.) + +.. % \XXX{this isn't implemented yet---is it needed?!} +.. % You can also specify a custom \file{.spec} file with the +.. % \longprogramopt{spec-file} option; used in conjunction with +.. % \longprogramopt{spec-only}, this gives you an opportunity to customize +.. % the \file{.spec} file manually: +.. % +.. % \ begin{verbatim} +.. % > python setup.py bdist_rpm --spec-only +.. % # ...edit dist/FooBar-1.0.spec +.. % > python setup.py bdist_rpm --spec-file=dist/FooBar-1.0.spec +.. % \ end{verbatim} +.. % +.. % (Although a better way to do this is probably to override the standard +.. % \command{bdist\_rpm} command with one that writes whatever else you want +.. % to the \file{.spec} file.) + + +.. _creating-wininst: + +Creating Windows Installers +=========================== + +Executable installers are the natural format for binary distributions on +Windows. They display a nice graphical user interface, display some information +about the module distribution to be installed taken from the metadata in the +setup script, let the user select a few options, and start or cancel the +installation. + +Since the metadata is taken from the setup script, creating Windows installers +is usually as easy as running:: + + python setup.py bdist_wininst + +or the :command:`bdist` command with the :option:`--formats` option:: + + python setup.py bdist --formats=wininst + +If you have a pure module distribution (only containing pure Python modules and +packages), the resulting installer will be version independent and have a name +like :file:`foo-1.0.win32.exe`. These installers can even be created on Unix or +Mac OS platforms. + +If you have a non-pure distribution, the extensions can only be created on a +Windows platform, and will be Python version dependent. The installer filename +will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`. You +have to create a separate installer for every Python version you want to +support. + +The installer will try to compile pure modules into bytecode after installation +on the target system in normal and optimizing mode. If you don't want this to +happen for some reason, you can run the :command:`bdist_wininst` command with +the :option:`--no-target-compile` and/or the :option:`--no-target-optimize` +option. + +By default the installer will display the cool "Python Powered" logo when it is +run, but you can also supply your own bitmap which must be a Windows +:file:`.bmp` file with the :option:`--bitmap` option. + +The installer will also display a large title on the desktop background window +when it is run, which is constructed from the name of your distribution and the +version number. This can be changed to another text by using the +:option:`--title` option. + +The installer file will be written to the "distribution directory" --- normally +:file:`dist/`, but customizable with the :option:`--dist-dir` option. + + +.. _postinstallation-script: + +The Postinstallation script +--------------------------- + +Starting with Python 2.3, a postinstallation script can be specified which the +:option:`--install-script` option. The basename of the script must be +specified, and the script filename must also be listed in the scripts argument +to the setup function. + +This script will be run at installation time on the target system after all the +files have been copied, with ``argv[1]`` set to :option:`-install`, and again at +uninstallation time before the files are removed with ``argv[1]`` set to +:option:`-remove`. + +The installation script runs embedded in the windows installer, every output +(``sys.stdout``, ``sys.stderr``) is redirected into a buffer and will be +displayed in the GUI after the script has finished. + +Some functions especially useful in this context are available as additional +built-in functions in the installation script. + + +.. function:: directory_created(path) + file_created(path) + + These functions should be called when a directory or file is created by the + postinstall script at installation time. It will register *path* with the + uninstaller, so that it will be removed when the distribution is uninstalled. + To be safe, directories are only removed if they are empty. + + +.. function:: get_special_folder_path(csidl_string) + + This function can be used to retrieve special folder locations on Windows like + the Start Menu or the Desktop. It returns the full path to the folder. + *csidl_string* must be one of the following strings:: + + "CSIDL_APPDATA" + + "CSIDL_COMMON_STARTMENU" + "CSIDL_STARTMENU" + + "CSIDL_COMMON_DESKTOPDIRECTORY" + "CSIDL_DESKTOPDIRECTORY" + + "CSIDL_COMMON_STARTUP" + "CSIDL_STARTUP" + + "CSIDL_COMMON_PROGRAMS" + "CSIDL_PROGRAMS" + + "CSIDL_FONTS" + + If the folder cannot be retrieved, :exc:`OSError` is raised. + + Which folders are available depends on the exact Windows version, and probably + also the configuration. For details refer to Microsoft's documentation of the + :cfunc:`SHGetSpecialFolderPath` function. + + +.. function:: create_shortcut(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]]) + + This function creates a shortcut. *target* is the path to the program to be + started by the shortcut. *description* is the description of the shortcut. + *filename* is the title of the shortcut that the user will see. *arguments* + specifies the command line arguments, if any. *workdir* is the working directory + for the program. *iconpath* is the file containing the icon for the shortcut, + and *iconindex* is the index of the icon in the file *iconpath*. Again, for + details consult the Microsoft documentation for the :class:`IShellLink` + interface. + + diff --git a/Doc/distutils/commandref.rst b/Doc/distutils/commandref.rst new file mode 100644 index 0000000..f5f0220 --- /dev/null +++ b/Doc/distutils/commandref.rst @@ -0,0 +1,104 @@ +.. _reference: + +***************** +Command Reference +***************** + +.. % \section{Building modules: the \protect\command{build} command family} +.. % \label{build-cmds} +.. % \subsubsection{\protect\command{build}} +.. % \label{build-cmd} +.. % \subsubsection{\protect\command{build\_py}} +.. % \label{build-py-cmd} +.. % \subsubsection{\protect\command{build\_ext}} +.. % \label{build-ext-cmd} +.. % \subsubsection{\protect\command{build\_clib}} +.. % \label{build-clib-cmd} + + +.. _install-cmd: + +Installing modules: the :command:`install` command family +========================================================= + +The install command ensures that the build commands have been run and then runs +the subcommands :command:`install_lib`, :command:`install_data` and +:command:`install_scripts`. + +.. % \subsubsection{\protect\command{install\_lib}} +.. % \label{install-lib-cmd} + + +.. _install-data-cmd: + +:command:`install_data` +----------------------- + +This command installs all data files provided with the distribution. + + +.. _install-scripts-cmd: + +:command:`install_scripts` +-------------------------- + +This command installs all (Python) scripts in the distribution. + +.. % \subsection{Cleaning up: the \protect\command{clean} command} +.. % \label{clean-cmd} + + +.. _sdist-cmd: + +Creating a source distribution: the :command:`sdist` command +============================================================ + +**\*\*** fragment moved down from above: needs context! **\*\*** + +The manifest template commands are: + ++-------------------------------------------+-----------------------------------------------+ +| Command | Description | ++===========================================+===============================================+ +| :command:`include pat1 pat2 ...` | include all files matching any of the listed | +| | patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`exclude pat1 pat2 ...` | exclude all files matching any of the listed | +| | patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`recursive-include dir pat1 pat2 | include all files under *dir* matching any of | +| ...` | the listed patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`recursive-exclude dir pat1 pat2 | exclude all files under *dir* matching any of | +| ...` | the listed patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`global-include pat1 pat2 ...` | include all files anywhere in the source tree | +| | matching --- & any of the listed patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`global-exclude pat1 pat2 ...` | exclude all files anywhere in the source tree | +| | matching --- & any of the listed patterns | ++-------------------------------------------+-----------------------------------------------+ +| :command:`prune dir` | exclude all files under *dir* | ++-------------------------------------------+-----------------------------------------------+ +| :command:`graft dir` | include all files under *dir* | ++-------------------------------------------+-----------------------------------------------+ + +The patterns here are Unix-style "glob" patterns: ``*`` matches any sequence of +regular filename characters, ``?`` matches any single regular filename +character, and ``[range]`` matches any of the characters in *range* (e.g., +``a-z``, ``a-zA-Z``, ``a-f0-9_.``). The definition of "regular filename +character" is platform-specific: on Unix it is anything except slash; on Windows +anything except backslash or colon; on Mac OS 9 anything except colon. + +**\*\*** Windows support not there yet **\*\*** + +.. % \section{Creating a built distribution: the +.. % \protect\command{bdist} command family} +.. % \label{bdist-cmds} + +.. % \subsection{\protect\command{bdist}} +.. % \subsection{\protect\command{bdist\_dumb}} +.. % \subsection{\protect\command{bdist\_rpm}} +.. % \subsection{\protect\command{bdist\_wininst}} + + diff --git a/Doc/distutils/configfile.rst b/Doc/distutils/configfile.rst new file mode 100644 index 0000000..0ccd5fd --- /dev/null +++ b/Doc/distutils/configfile.rst @@ -0,0 +1,130 @@ +.. _setup-config: + +************************************ +Writing the Setup Configuration File +************************************ + +Often, it's not possible to write down everything needed to build a distribution +*a priori*: you may need to get some information from the user, or from the +user's system, in order to proceed. As long as that information is fairly +simple---a list of directories to search for C header files or libraries, for +example---then providing a configuration file, :file:`setup.cfg`, for users to +edit is a cheap and easy way to solicit it. Configuration files also let you +provide default values for any command option, which the installer can then +override either on the command-line or by editing the config file. + +The setup configuration file is a useful middle-ground between the setup script +---which, ideally, would be opaque to installers [#]_---and the command-line to +the setup script, which is outside of your control and entirely up to the +installer. In fact, :file:`setup.cfg` (and any other Distutils configuration +files present on the target system) are processed after the contents of the +setup script, but before the command-line. This has several useful +consequences: + +.. % (If you have more advanced needs, such as determining which extensions +.. % to build based on what capabilities are present on the target system, +.. % then you need the Distutils ``auto-configuration'' facility. This +.. % started to appear in Distutils 0.9 but, as of this writing, isn't mature +.. % or stable enough yet for real-world use.) + +* installers can override some of what you put in :file:`setup.py` by editing + :file:`setup.cfg` + +* you can provide non-standard defaults for options that are not easily set in + :file:`setup.py` + +* installers can override anything in :file:`setup.cfg` using the command-line + options to :file:`setup.py` + +The basic syntax of the configuration file is simple:: + + [command] + option=value + ... + +where *command* is one of the Distutils commands (e.g. :command:`build_py`, +:command:`install`), and *option* is one of the options that command supports. +Any number of options can be supplied for each command, and any number of +command sections can be included in the file. Blank lines are ignored, as are +comments, which run from a ``'#'`` character until the end of the line. Long +option values can be split across multiple lines simply by indenting the +continuation lines. + +You can find out the list of options supported by a particular command with the +universal :option:`--help` option, e.g. :: + + > python setup.py --help build_ext + [...] + Options for 'build_ext' command: + --build-lib (-b) directory for compiled extension modules + --build-temp (-t) directory for temporary files (build by-products) + --inplace (-i) ignore build-lib and put compiled extensions into the + source directory alongside your pure Python modules + --include-dirs (-I) list of directories to search for header files + --define (-D) C preprocessor macros to define + --undef (-U) C preprocessor macros to undefine + --swig-opts list of SWIG command line options + [...] + +Note that an option spelled :option:`--foo-bar` on the command-line is spelled +:option:`foo_bar` in configuration files. + +For example, say you want your extensions to be built "in-place"---that is, you +have an extension :mod:`pkg.ext`, and you want the compiled extension file +(:file:`ext.so` on Unix, say) to be put in the same source directory as your +pure Python modules :mod:`pkg.mod1` and :mod:`pkg.mod2`. You can always use the +:option:`--inplace` option on the command-line to ensure this:: + + python setup.py build_ext --inplace + +But this requires that you always specify the :command:`build_ext` command +explicitly, and remember to provide :option:`--inplace`. An easier way is to +"set and forget" this option, by encoding it in :file:`setup.cfg`, the +configuration file for this distribution:: + + [build_ext] + inplace=1 + +This will affect all builds of this module distribution, whether or not you +explicitly specify :command:`build_ext`. If you include :file:`setup.cfg` in +your source distribution, it will also affect end-user builds---which is +probably a bad idea for this option, since always building extensions in-place +would break installation of the module distribution. In certain peculiar cases, +though, modules are built right in their installation directory, so this is +conceivably a useful ability. (Distributing extensions that expect to be built +in their installation directory is almost always a bad idea, though.) + +Another example: certain commands take a lot of options that don't change from +run to run; for example, :command:`bdist_rpm` needs to know everything required +to generate a "spec" file for creating an RPM distribution. Some of this +information comes from the setup script, and some is automatically generated by +the Distutils (such as the list of files installed). But some of it has to be +supplied as options to :command:`bdist_rpm`, which would be very tedious to do +on the command-line for every run. Hence, here is a snippet from the Distutils' +own :file:`setup.cfg`:: + + [bdist_rpm] + release = 1 + packager = Greg Ward + doc_files = CHANGES.txt + README.txt + USAGE.txt + doc/ + examples/ + +Note that the :option:`doc_files` option is simply a whitespace-separated string +split across multiple lines for readability. + + +.. seealso:: + + :ref:`inst-config-syntax` in "Installing Python Modules" + More information on the configuration files is available in the manual for + system administrators. + + +.. rubric:: Footnotes + +.. [#] This ideal probably won't be achieved until auto-configuration is fully + supported by the Distutils. + diff --git a/Doc/distutils/examples.rst b/Doc/distutils/examples.rst new file mode 100644 index 0000000..4e4adc5 --- /dev/null +++ b/Doc/distutils/examples.rst @@ -0,0 +1,241 @@ +.. _examples: + +******** +Examples +******** + +This chapter provides a number of basic examples to help get started with +distutils. Additional information about using distutils can be found in the +Distutils Cookbook. + + +.. seealso:: + + `Distutils Cookbook `_ + Collection of recipes showing how to achieve more control over distutils. + + +.. _pure-mod: + +Pure Python distribution (by module) +==================================== + +If you're just distributing a couple of modules, especially if they don't live +in a particular package, you can specify them individually using the +:option:`py_modules` option in the setup script. + +In the simplest case, you'll have two files to worry about: a setup script and +the single module you're distributing, :file:`foo.py` in this example:: + + / + setup.py + foo.py + +(In all diagrams in this section, ** will refer to the distribution root +directory.) A minimal setup script to describe this situation would be:: + + from distutils.core import setup + setup(name='foo', + version='1.0', + py_modules=['foo'], + ) + +Note that the name of the distribution is specified independently with the +:option:`name` option, and there's no rule that says it has to be the same as +the name of the sole module in the distribution (although that's probably a good +convention to follow). However, the distribution name is used to generate +filenames, so you should stick to letters, digits, underscores, and hyphens. + +Since :option:`py_modules` is a list, you can of course specify multiple +modules, eg. if you're distributing modules :mod:`foo` and :mod:`bar`, your +setup might look like this:: + + / + setup.py + foo.py + bar.py + +and the setup script might be :: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + py_modules=['foo', 'bar'], + ) + +You can put module source files into another directory, but if you have enough +modules to do that, it's probably easier to specify modules by package rather +than listing them individually. + + +.. _pure-pkg: + +Pure Python distribution (by package) +===================================== + +If you have more than a couple of modules to distribute, especially if they are +in multiple packages, it's probably easier to specify whole packages rather than +individual modules. This works even if your modules are not in a package; you +can just tell the Distutils to process modules from the root package, and that +works the same as any other package (except that you don't have to have an +:file:`__init__.py` file). + +The setup script from the last example could also be written as :: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=[''], + ) + +(The empty string stands for the root package.) + +If those two files are moved into a subdirectory, but remain in the root +package, e.g.:: + + / + setup.py + src/ foo.py + bar.py + +then you would still specify the root package, but you have to tell the +Distutils where source files in the root package live:: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'': 'src'}, + packages=[''], + ) + +More typically, though, you will want to distribute multiple modules in the same +package (or in sub-packages). For example, if the :mod:`foo` and :mod:`bar` +modules belong in package :mod:`foobar`, one way to layout your source tree is +:: + + / + setup.py + foobar/ + __init__.py + foo.py + bar.py + +This is in fact the default layout expected by the Distutils, and the one that +requires the least work to describe in your setup script:: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=['foobar'], + ) + +If you want to put modules in directories not named for their package, then you +need to use the :option:`package_dir` option again. For example, if the +:file:`src` directory holds modules in the :mod:`foobar` package:: + + / + setup.py + src/ + __init__.py + foo.py + bar.py + +an appropriate setup script would be :: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'foobar': 'src'}, + packages=['foobar'], + ) + +Or, you might put modules from your main package right in the distribution +root:: + + / + setup.py + __init__.py + foo.py + bar.py + +in which case your setup script would be :: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + package_dir={'foobar': ''}, + packages=['foobar'], + ) + +(The empty string also stands for the current directory.) + +If you have sub-packages, they must be explicitly listed in :option:`packages`, +but any entries in :option:`package_dir` automatically extend to sub-packages. +(In other words, the Distutils does *not* scan your source tree, trying to +figure out which directories correspond to Python packages by looking for +:file:`__init__.py` files.) Thus, if the default layout grows a sub-package:: + + / + setup.py + foobar/ + __init__.py + foo.py + bar.py + subfoo/ + __init__.py + blah.py + +then the corresponding setup script would be :: + + from distutils.core import setup + setup(name='foobar', + version='1.0', + packages=['foobar', 'foobar.subfoo'], + ) + +(Again, the empty string in :option:`package_dir` stands for the current +directory.) + + +.. _single-ext: + +Single extension module +======================= + +Extension modules are specified using the :option:`ext_modules` option. +:option:`package_dir` has no effect on where extension source files are found; +it only affects the source for pure Python modules. The simplest case, a +single extension module in a single C source file, is:: + + / + setup.py + foo.c + +If the :mod:`foo` extension belongs in the root package, the setup script for +this could be :: + + from distutils.core import setup + from distutils.extension import Extension + setup(name='foobar', + version='1.0', + ext_modules=[Extension('foo', ['foo.c'])], + ) + +If the extension actually belongs in a package, say :mod:`foopkg`, then + +With exactly the same source tree layout, this extension can be put in the +:mod:`foopkg` package simply by changing the name of the extension:: + + from distutils.core import setup + from distutils.extension import Extension + setup(name='foobar', + version='1.0', + ext_modules=[Extension('foopkg.foo', ['foo.c'])], + ) + +.. % \section{Multiple extension modules} +.. % \label{multiple-ext} + +.. % \section{Putting it all together} + + diff --git a/Doc/distutils/extending.rst b/Doc/distutils/extending.rst new file mode 100644 index 0000000..a2930c7 --- /dev/null +++ b/Doc/distutils/extending.rst @@ -0,0 +1,96 @@ +.. _extending: + +******************* +Extending Distutils +******************* + +Distutils can be extended in various ways. Most extensions take the form of new +commands or replacements for existing commands. New commands may be written to +support new types of platform-specific packaging, for example, while +replacements for existing commands may be made to modify details of how the +command operates on a package. + +Most extensions of the distutils are made within :file:`setup.py` scripts that +want to modify existing commands; many simply add a few file extensions that +should be copied into packages in addition to :file:`.py` files as a +convenience. + +Most distutils command implementations are subclasses of the :class:`Command` +class from :mod:`distutils.cmd`. New commands may directly inherit from +:class:`Command`, while replacements often derive from :class:`Command` +indirectly, directly subclassing the command they are replacing. Commands are +required to derive from :class:`Command`. + +.. % \section{Extending existing commands} +.. % \label{extend-existing} + +.. % \section{Writing new commands} +.. % \label{new-commands} +.. % \XXX{Would an uninstall command be a good example here?} + + +Integrating new commands +======================== + +There are different ways to integrate new command implementations into +distutils. The most difficult is to lobby for the inclusion of the new features +in distutils itself, and wait for (and require) a version of Python that +provides that support. This is really hard for many reasons. + +The most common, and possibly the most reasonable for most needs, is to include +the new implementations with your :file:`setup.py` script, and cause the +:func:`distutils.core.setup` function use them:: + + from distutils.command.build_py import build_py as _build_py + from distutils.core import setup + + class build_py(_build_py): + """Specialized Python source builder.""" + + # implement whatever needs to be different... + + setup(cmdclass={'build_py': build_py}, + ...) + +This approach is most valuable if the new implementations must be used to use a +particular package, as everyone interested in the package will need to have the +new command implementation. + +Beginning with Python 2.4, a third option is available, intended to allow new +commands to be added which can support existing :file:`setup.py` scripts without +requiring modifications to the Python installation. This is expected to allow +third-party extensions to provide support for additional packaging systems, but +the commands can be used for anything distutils commands can be used for. A new +configuration option, :option:`command_packages` (command-line option +:option:`--command-packages`), can be used to specify additional packages to be +searched for modules implementing commands. Like all distutils options, this +can be specified on the command line or in a configuration file. This option +can only be set in the ``[global]`` section of a configuration file, or before +any commands on the command line. If set in a configuration file, it can be +overridden from the command line; setting it to an empty string on the command +line causes the default to be used. This should never be set in a configuration +file provided with a package. + +This new option can be used to add any number of packages to the list of +packages searched for command implementations; multiple package names should be +separated by commas. When not specified, the search is only performed in the +:mod:`distutils.command` package. When :file:`setup.py` is run with the option +:option:`--command-packages` :option:`distcmds,buildcmds`, however, the packages +:mod:`distutils.command`, :mod:`distcmds`, and :mod:`buildcmds` will be searched +in that order. New commands are expected to be implemented in modules of the +same name as the command by classes sharing the same name. Given the example +command line option above, the command :command:`bdist_openpkg` could be +implemented by the class :class:`distcmds.bdist_openpkg.bdist_openpkg` or +:class:`buildcmds.bdist_openpkg.bdist_openpkg`. + + +Adding new distribution types +============================= + +Commands that create distributions (files in the :file:`dist/` directory) need +to add ``(command, filename)`` pairs to ``self.distribution.dist_files`` so that +:command:`upload` can upload it to PyPI. The *filename* in the pair contains no +path information, only the name of the file itself. In dry-run mode, pairs +should still be added to represent what would have been created. + + diff --git a/Doc/distutils/index.rst b/Doc/distutils/index.rst new file mode 100644 index 0000000..6d82c84 --- /dev/null +++ b/Doc/distutils/index.rst @@ -0,0 +1,30 @@ +.. _distutils-index: + +############################### + Distributing Python Modules +############################### + +:Authors: Greg Ward, Anthony Baxter +:Email: distutils-sig@python.org +:Release: |version| +:Date: |today| + +This document describes the Python Distribution Utilities ("Distutils") from +the module developer's point of view, describing how to use the Distutils to +make Python modules and extensions easily available to a wider audience with +very little overhead for build/release/install mechanics. + +.. toctree:: + :maxdepth: 2 + + introduction.rst + setupscript.rst + configfile.rst + sourcedist.rst + builtdist.rst + packageindex.rst + uploading.rst + examples.rst + extending.rst + commandref.rst + apiref.rst diff --git a/Doc/distutils/introduction.rst b/Doc/distutils/introduction.rst new file mode 100644 index 0000000..b772b01 --- /dev/null +++ b/Doc/distutils/introduction.rst @@ -0,0 +1,208 @@ +.. _distutils-intro: + +**************************** +An Introduction to Distutils +**************************** + +This document covers using the Distutils to distribute your Python modules, +concentrating on the role of developer/distributor: if you're looking for +information on installing Python modules, you should refer to the +:ref:`install-index` chapter. + + +.. _distutils-concepts: + +Concepts & Terminology +====================== + +Using the Distutils is quite simple, both for module developers and for +users/administrators installing third-party modules. As a developer, your +responsibilities (apart from writing solid, well-documented and well-tested +code, of course!) are: + +* write a setup script (:file:`setup.py` by convention) + +* (optional) write a setup configuration file + +* create a source distribution + +* (optional) create one or more built (binary) distributions + +Each of these tasks is covered in this document. + +Not all module developers have access to a multitude of platforms, so it's not +always feasible to expect them to create a multitude of built distributions. It +is hoped that a class of intermediaries, called *packagers*, will arise to +address this need. Packagers will take source distributions released by module +developers, build them on one or more platforms, and release the resulting built +distributions. Thus, users on the most popular platforms will be able to +install most popular Python module distributions in the most natural way for +their platform, without having to run a single setup script or compile a line of +code. + + +.. _distutils-simple-example: + +A Simple Example +================ + +The setup script is usually quite simple, although since it's written in Python, +there are no arbitrary limits to what you can do with it, though you should be +careful about putting arbitrarily expensive operations in your setup script. +Unlike, say, Autoconf-style configure scripts, the setup script may be run +multiple times in the course of building and installing your module +distribution. + +If all you want to do is distribute a module called :mod:`foo`, contained in a +file :file:`foo.py`, then your setup script can be as simple as this:: + + from distutils.core import setup + setup(name='foo', + version='1.0', + py_modules=['foo'], + ) + +Some observations: + +* most information that you supply to the Distutils is supplied as keyword + arguments to the :func:`setup` function + +* those keyword arguments fall into two categories: package metadata (name, + version number) and information about what's in the package (a list of pure + Python modules, in this case) + +* modules are specified by module name, not filename (the same will hold true + for packages and extensions) + +* it's recommended that you supply a little more metadata, in particular your + name, email address and a URL for the project (see section :ref:`setup-script` + for an example) + +To create a source distribution for this module, you would create a setup +script, :file:`setup.py`, containing the above code, and run:: + + python setup.py sdist + +which will create an archive file (e.g., tarball on Unix, ZIP file on Windows) +containing your setup script :file:`setup.py`, and your module :file:`foo.py`. +The archive file will be named :file:`foo-1.0.tar.gz` (or :file:`.zip`), and +will unpack into a directory :file:`foo-1.0`. + +If an end-user wishes to install your :mod:`foo` module, all she has to do is +download :file:`foo-1.0.tar.gz` (or :file:`.zip`), unpack it, and---from the +:file:`foo-1.0` directory---run :: + + python setup.py install + +which will ultimately copy :file:`foo.py` to the appropriate directory for +third-party modules in their Python installation. + +This simple example demonstrates some fundamental concepts of the Distutils. +First, both developers and installers have the same basic user interface, i.e. +the setup script. The difference is which Distutils *commands* they use: the +:command:`sdist` command is almost exclusively for module developers, while +:command:`install` is more often for installers (although most developers will +want to install their own code occasionally). + +If you want to make things really easy for your users, you can create one or +more built distributions for them. For instance, if you are running on a +Windows machine, and want to make things easy for other Windows users, you can +create an executable installer (the most appropriate type of built distribution +for this platform) with the :command:`bdist_wininst` command. For example:: + + python setup.py bdist_wininst + +will create an executable installer, :file:`foo-1.0.win32.exe`, in the current +directory. + +Other useful built distribution formats are RPM, implemented by the +:command:`bdist_rpm` command, Solaris :program:`pkgtool` +(:command:`bdist_pkgtool`), and HP-UX :program:`swinstall` +(:command:`bdist_sdux`). For example, the following command will create an RPM +file called :file:`foo-1.0.noarch.rpm`:: + + python setup.py bdist_rpm + +(The :command:`bdist_rpm` command uses the :command:`rpm` executable, therefore +this has to be run on an RPM-based system such as Red Hat Linux, SuSE Linux, or +Mandrake Linux.) + +You can find out what distribution formats are available at any time by running +:: + + python setup.py bdist --help-formats + + +.. _python-terms: + +General Python terminology +========================== + +If you're reading this document, you probably have a good idea of what modules, +extensions, and so forth are. Nevertheless, just to be sure that everyone is +operating from a common starting point, we offer the following glossary of +common Python terms: + +module + the basic unit of code reusability in Python: a block of code imported by some + other code. Three types of modules concern us here: pure Python modules, + extension modules, and packages. + +pure Python module + a module written in Python and contained in a single :file:`.py` file (and + possibly associated :file:`.pyc` and/or :file:`.pyo` files). Sometimes referred + to as a "pure module." + +extension module + a module written in the low-level language of the Python implementation: C/C++ + for Python, Java for Jython. Typically contained in a single dynamically + loadable pre-compiled file, e.g. a shared object (:file:`.so`) file for Python + extensions on Unix, a DLL (given the :file:`.pyd` extension) for Python + extensions on Windows, or a Java class file for Jython extensions. (Note that + currently, the Distutils only handles C/C++ extensions for Python.) + +package + a module that contains other modules; typically contained in a directory in the + filesystem and distinguished from other directories by the presence of a file + :file:`__init__.py`. + +root package + the root of the hierarchy of packages. (This isn't really a package, since it + doesn't have an :file:`__init__.py` file. But we have to call it something.) + The vast majority of the standard library is in the root package, as are many + small, standalone third-party modules that don't belong to a larger module + collection. Unlike regular packages, modules in the root package can be found in + many directories: in fact, every directory listed in ``sys.path`` contributes + modules to the root package. + + +.. _distutils-term: + +Distutils-specific terminology +============================== + +The following terms apply more specifically to the domain of distributing Python +modules using the Distutils: + +module distribution + a collection of Python modules distributed together as a single downloadable + resource and meant to be installed *en masse*. Examples of some well-known + module distributions are Numeric Python, PyXML, PIL (the Python Imaging + Library), or mxBase. (This would be called a *package*, except that term is + already taken in the Python context: a single module distribution may contain + zero, one, or many Python packages.) + +pure module distribution + a module distribution that contains only pure Python modules and packages. + Sometimes referred to as a "pure distribution." + +non-pure module distribution + a module distribution that contains at least one extension module. Sometimes + referred to as a "non-pure distribution." + +distribution root + the top-level directory of your source tree (or source distribution); the + directory where :file:`setup.py` exists. Generally :file:`setup.py` will be + run from this directory. + + diff --git a/Doc/distutils/packageindex.rst b/Doc/distutils/packageindex.rst new file mode 100644 index 0000000..f0f886b --- /dev/null +++ b/Doc/distutils/packageindex.rst @@ -0,0 +1,65 @@ +.. _package-index: + +********************************** +Registering with the Package Index +********************************** + +The Python Package Index (PyPI) holds meta-data describing distributions +packaged with distutils. The distutils command :command:`register` is used to +submit your distribution's meta-data to the index. It is invoked as follows:: + + python setup.py register + +Distutils will respond with the following prompt:: + + running register + We need to know who you are, so please choose either: + 1. use your existing login, + 2. register as a new user, + 3. have the server generate a new password for you (and email it to you), or + 4. quit + Your selection [default 1]: + +Note: if your username and password are saved locally, you will not see this +menu. + +If you have not registered with PyPI, then you will need to do so now. You +should choose option 2, and enter your details as required. Soon after +submitting your details, you will receive an email which will be used to confirm +your registration. + +Once you are registered, you may choose option 1 from the menu. You will be +prompted for your PyPI username and password, and :command:`register` will then +submit your meta-data to the index. + +You may submit any number of versions of your distribution to the index. If you +alter the meta-data for a particular version, you may submit it again and the +index will be updated. + +PyPI holds a record for each (name, version) combination submitted. The first +user to submit information for a given name is designated the Owner of that +name. They may submit changes through the :command:`register` command or through +the web interface. They may also designate other users as Owners or Maintainers. +Maintainers may edit the package information, but not designate other Owners or +Maintainers. + +By default PyPI will list all versions of a given package. To hide certain +versions, the Hidden property should be set to yes. This must be edited through +the web interface. + + +.. _pypirc: + +The .pypirc file +================ + +The format of the :file:`.pypirc` file is formated as follows:: + + [server-login] + repository: + username: + password: + +*repository* can be ommitted and defaults to ``http://www.python.org/pypi``. + + diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst new file mode 100644 index 0000000..26f50e6 --- /dev/null +++ b/Doc/distutils/setupscript.rst @@ -0,0 +1,669 @@ +.. _setup-script: + +************************ +Writing the Setup Script +************************ + +The setup script is the centre of all activity in building, distributing, and +installing modules using the Distutils. The main purpose of the setup script is +to describe your module distribution to the Distutils, so that the various +commands that operate on your modules do the right thing. As we saw in section +:ref:`distutils-simple-example` above, the setup script consists mainly of a call to +:func:`setup`, and most information supplied to the Distutils by the module +developer is supplied as keyword arguments to :func:`setup`. + +Here's a slightly more involved example, which we'll follow for the next couple +of sections: the Distutils' own setup script. (Keep in mind that although the +Distutils are included with Python 1.6 and later, they also have an independent +existence so that Python 1.5.2 users can use them to install other module +distributions. The Distutils' own setup script, shown here, is used to install +the package into Python 1.5.2.) :: + + #!/usr/bin/env python + + from distutils.core import setup + + setup(name='Distutils', + version='1.0', + description='Python Distribution Utilities', + author='Greg Ward', + author_email='gward@python.net', + url='http://www.python.org/sigs/distutils-sig/', + packages=['distutils', 'distutils.command'], + ) + +There are only two differences between this and the trivial one-file +distribution presented in section :ref:`distutils-simple-example`: more metadata, and the +specification of pure Python modules by package, rather than by module. This is +important since the Distutils consist of a couple of dozen modules split into +(so far) two packages; an explicit list of every module would be tedious to +generate and difficult to maintain. For more information on the additional +meta-data, see section :ref:`meta-data`. + +Note that any pathnames (files or directories) supplied in the setup script +should be written using the Unix convention, i.e. slash-separated. The +Distutils will take care of converting this platform-neutral representation into +whatever is appropriate on your current platform before actually using the +pathname. This makes your setup script portable across operating systems, which +of course is one of the major goals of the Distutils. In this spirit, all +pathnames in this document are slash-separated. (Mac OS 9 programmers should +keep in mind that the *absence* of a leading slash indicates a relative path, +the opposite of the Mac OS convention with colons.) + +This, of course, only applies to pathnames given to Distutils functions. If +you, for example, use standard Python functions such as :func:`glob.glob` or +:func:`os.listdir` to specify files, you should be careful to write portable +code instead of hardcoding path separators:: + + glob.glob(os.path.join('mydir', 'subdir', '*.html')) + os.listdir(os.path.join('mydir', 'subdir')) + + +.. _listing-packages: + +Listing whole packages +====================== + +The :option:`packages` option tells the Distutils to process (build, distribute, +install, etc.) all pure Python modules found in each package mentioned in the +:option:`packages` list. In order to do this, of course, there has to be a +correspondence between package names and directories in the filesystem. The +default correspondence is the most obvious one, i.e. package :mod:`distutils` is +found in the directory :file:`distutils` relative to the distribution root. +Thus, when you say ``packages = ['foo']`` in your setup script, you are +promising that the Distutils will find a file :file:`foo/__init__.py` (which +might be spelled differently on your system, but you get the idea) relative to +the directory where your setup script lives. If you break this promise, the +Distutils will issue a warning but still process the broken package anyways. + +If you use a different convention to lay out your source directory, that's no +problem: you just have to supply the :option:`package_dir` option to tell the +Distutils about your convention. For example, say you keep all Python source +under :file:`lib`, so that modules in the "root package" (i.e., not in any +package at all) are in :file:`lib`, modules in the :mod:`foo` package are in +:file:`lib/foo`, and so forth. Then you would put :: + + package_dir = {'': 'lib'} + +in your setup script. The keys to this dictionary are package names, and an +empty package name stands for the root package. The values are directory names +relative to your distribution root. In this case, when you say ``packages = +['foo']``, you are promising that the file :file:`lib/foo/__init__.py` exists. + +Another possible convention is to put the :mod:`foo` package right in +:file:`lib`, the :mod:`foo.bar` package in :file:`lib/bar`, etc. This would be +written in the setup script as :: + + package_dir = {'foo': 'lib'} + +A ``package: dir`` entry in the :option:`package_dir` dictionary implicitly +applies to all packages below *package*, so the :mod:`foo.bar` case is +automatically handled here. In this example, having ``packages = ['foo', +'foo.bar']`` tells the Distutils to look for :file:`lib/__init__.py` and +:file:`lib/bar/__init__.py`. (Keep in mind that although :option:`package_dir` +applies recursively, you must explicitly list all packages in +:option:`packages`: the Distutils will *not* recursively scan your source tree +looking for any directory with an :file:`__init__.py` file.) + + +.. _listing-modules: + +Listing individual modules +========================== + +For a small module distribution, you might prefer to list all modules rather +than listing packages---especially the case of a single module that goes in the +"root package" (i.e., no package at all). This simplest case was shown in +section :ref:`distutils-simple-example`; here is a slightly more involved example:: + + py_modules = ['mod1', 'pkg.mod2'] + +This describes two modules, one of them in the "root" package, the other in the +:mod:`pkg` package. Again, the default package/directory layout implies that +these two modules can be found in :file:`mod1.py` and :file:`pkg/mod2.py`, and +that :file:`pkg/__init__.py` exists as well. And again, you can override the +package/directory correspondence using the :option:`package_dir` option. + + +.. _describing-extensions: + +Describing extension modules +============================ + +Just as writing Python extension modules is a bit more complicated than writing +pure Python modules, describing them to the Distutils is a bit more complicated. +Unlike pure modules, it's not enough just to list modules or packages and expect +the Distutils to go out and find the right files; you have to specify the +extension name, source file(s), and any compile/link requirements (include +directories, libraries to link with, etc.). + +.. % XXX read over this section + +All of this is done through another keyword argument to :func:`setup`, the +:option:`ext_modules` option. :option:`ext_modules` is just a list of +:class:`Extension` instances, each of which describes a single extension module. +Suppose your distribution includes a single extension, called :mod:`foo` and +implemented by :file:`foo.c`. If no additional instructions to the +compiler/linker are needed, describing this extension is quite simple:: + + Extension('foo', ['foo.c']) + +The :class:`Extension` class can be imported from :mod:`distutils.core` along +with :func:`setup`. Thus, the setup script for a module distribution that +contains only this one extension and nothing else might be:: + + from distutils.core import setup, Extension + setup(name='foo', + version='1.0', + ext_modules=[Extension('foo', ['foo.c'])], + ) + +The :class:`Extension` class (actually, the underlying extension-building +machinery implemented by the :command:`build_ext` command) supports a great deal +of flexibility in describing Python extensions, which is explained in the +following sections. + + +Extension names and packages +---------------------------- + +The first argument to the :class:`Extension` constructor is always the name of +the extension, including any package names. For example, :: + + Extension('foo', ['src/foo1.c', 'src/foo2.c']) + +describes an extension that lives in the root package, while :: + + Extension('pkg.foo', ['src/foo1.c', 'src/foo2.c']) + +describes the same extension in the :mod:`pkg` package. The source files and +resulting object code are identical in both cases; the only difference is where +in the filesystem (and therefore where in Python's namespace hierarchy) the +resulting extension lives. + +If you have a number of extensions all in the same package (or all under the +same base package), use the :option:`ext_package` keyword argument to +:func:`setup`. For example, :: + + setup(... + ext_package='pkg', + ext_modules=[Extension('foo', ['foo.c']), + Extension('subpkg.bar', ['bar.c'])], + ) + +will compile :file:`foo.c` to the extension :mod:`pkg.foo`, and :file:`bar.c` to +:mod:`pkg.subpkg.bar`. + + +Extension source files +---------------------- + +The second argument to the :class:`Extension` constructor is a list of source +files. Since the Distutils currently only support C, C++, and Objective-C +extensions, these are normally C/C++/Objective-C source files. (Be sure to use +appropriate extensions to distinguish C++\ source files: :file:`.cc` and +:file:`.cpp` seem to be recognized by both Unix and Windows compilers.) + +However, you can also include SWIG interface (:file:`.i`) files in the list; the +:command:`build_ext` command knows how to deal with SWIG extensions: it will run +SWIG on the interface file and compile the resulting C/C++ file into your +extension. + +**\*\*** SWIG support is rough around the edges and largely untested! **\*\*** + +This warning notwithstanding, options to SWIG can be currently passed like +this:: + + setup(... + ext_modules=[Extension('_foo', ['foo.i'], + swig_opts=['-modern', '-I../include'])], + py_modules=['foo'], + ) + +Or on the commandline like this:: + + > python setup.py build_ext --swig-opts="-modern -I../include" + +On some platforms, you can include non-source files that are processed by the +compiler and included in your extension. Currently, this just means Windows +message text (:file:`.mc`) files and resource definition (:file:`.rc`) files for +Visual C++. These will be compiled to binary resource (:file:`.res`) files and +linked into the executable. + + +Preprocessor options +-------------------- + +Three optional arguments to :class:`Extension` will help if you need to specify +include directories to search or preprocessor macros to define/undefine: +``include_dirs``, ``define_macros``, and ``undef_macros``. + +For example, if your extension requires header files in the :file:`include` +directory under your distribution root, use the ``include_dirs`` option:: + + Extension('foo', ['foo.c'], include_dirs=['include']) + +You can specify absolute directories there; if you know that your extension will +only be built on Unix systems with X11R6 installed to :file:`/usr`, you can get +away with :: + + Extension('foo', ['foo.c'], include_dirs=['/usr/include/X11']) + +You should avoid this sort of non-portable usage if you plan to distribute your +code: it's probably better to write C code like :: + + #include + +If you need to include header files from some other Python extension, you can +take advantage of the fact that header files are installed in a consistent way +by the Distutils :command:`install_header` command. For example, the Numerical +Python header files are installed (on a standard Unix installation) to +:file:`/usr/local/include/python1.5/Numerical`. (The exact location will differ +according to your platform and Python installation.) Since the Python include +directory---\ :file:`/usr/local/include/python1.5` in this case---is always +included in the search path when building Python extensions, the best approach +is to write C code like :: + + #include + +If you must put the :file:`Numerical` include directory right into your header +search path, though, you can find that directory using the Distutils +:mod:`distutils.sysconfig` module:: + + from distutils.sysconfig import get_python_inc + incdir = os.path.join(get_python_inc(plat_specific=1), 'Numerical') + setup(..., + Extension(..., include_dirs=[incdir]), + ) + +Even though this is quite portable---it will work on any Python installation, +regardless of platform---it's probably easier to just write your C code in the +sensible way. + +You can define and undefine pre-processor macros with the ``define_macros`` and +``undef_macros`` options. ``define_macros`` takes a list of ``(name, value)`` +tuples, where ``name`` is the name of the macro to define (a string) and +``value`` is its value: either a string or ``None``. (Defining a macro ``FOO`` +to ``None`` is the equivalent of a bare ``#define FOO`` in your C source: with +most compilers, this sets ``FOO`` to the string ``1``.) ``undef_macros`` is +just a list of macros to undefine. + +For example:: + + Extension(..., + define_macros=[('NDEBUG', '1'), + ('HAVE_STRFTIME', None)], + undef_macros=['HAVE_FOO', 'HAVE_BAR']) + +is the equivalent of having this at the top of every C source file:: + + #define NDEBUG 1 + #define HAVE_STRFTIME + #undef HAVE_FOO + #undef HAVE_BAR + + +Library options +--------------- + +You can also specify the libraries to link against when building your extension, +and the directories to search for those libraries. The ``libraries`` option is +a list of libraries to link against, ``library_dirs`` is a list of directories +to search for libraries at link-time, and ``runtime_library_dirs`` is a list of +directories to search for shared (dynamically loaded) libraries at run-time. + +For example, if you need to link against libraries known to be in the standard +library search path on target systems :: + + Extension(..., + libraries=['gdbm', 'readline']) + +If you need to link with libraries in a non-standard location, you'll have to +include the location in ``library_dirs``:: + + Extension(..., + library_dirs=['/usr/X11R6/lib'], + libraries=['X11', 'Xt']) + +(Again, this sort of non-portable construct should be avoided if you intend to +distribute your code.) + +**\*\*** Should mention clib libraries here or somewhere else! **\*\*** + + +Other options +------------- + +There are still some other options which can be used to handle special cases. + +The :option:`extra_objects` option is a list of object files to be passed to the +linker. These files must not have extensions, as the default extension for the +compiler is used. + +:option:`extra_compile_args` and :option:`extra_link_args` can be used to +specify additional command line options for the respective compiler and linker +command lines. + +:option:`export_symbols` is only useful on Windows. It can contain a list of +symbols (functions or variables) to be exported. This option is not needed when +building compiled extensions: Distutils will automatically add ``initmodule`` +to the list of exported symbols. + + +Relationships between Distributions and Packages +================================================ + +A distribution may relate to packages in three specific ways: + +#. It can require packages or modules. + +#. It can provide packages or modules. + +#. It can obsolete packages or modules. + +These relationships can be specified using keyword arguments to the +:func:`distutils.core.setup` function. + +Dependencies on other Python modules and packages can be specified by supplying +the *requires* keyword argument to :func:`setup`. The value must be a list of +strings. Each string specifies a package that is required, and optionally what +versions are sufficient. + +To specify that any version of a module or package is required, the string +should consist entirely of the module or package name. Examples include +``'mymodule'`` and ``'xml.parsers.expat'``. + +If specific versions are required, a sequence of qualifiers can be supplied in +parentheses. Each qualifier may consist of a comparison operator and a version +number. The accepted comparison operators are:: + + < > == + <= >= != + +These can be combined by using multiple qualifiers separated by commas (and +optional whitespace). In this case, all of the qualifiers must be matched; a +logical AND is used to combine the evaluations. + +Let's look at a bunch of examples: + ++-------------------------+----------------------------------------------+ +| Requires Expression | Explanation | ++=========================+==============================================+ +| ``==1.0`` | Only version ``1.0`` is compatible | ++-------------------------+----------------------------------------------+ +| ``>1.0, !=1.5.1, <2.0`` | Any version after ``1.0`` and before ``2.0`` | +| | is compatible, except ``1.5.1`` | ++-------------------------+----------------------------------------------+ + +Now that we can specify dependencies, we also need to be able to specify what we +provide that other distributions can require. This is done using the *provides* +keyword argument to :func:`setup`. The value for this keyword is a list of +strings, each of which names a Python module or package, and optionally +identifies the version. If the version is not specified, it is assumed to match +that of the distribution. + +Some examples: + ++---------------------+----------------------------------------------+ +| Provides Expression | Explanation | ++=====================+==============================================+ +| ``mypkg`` | Provide ``mypkg``, using the distribution | +| | version | ++---------------------+----------------------------------------------+ +| ``mypkg (1.1)`` | Provide ``mypkg`` version 1.1, regardless of | +| | the distribution version | ++---------------------+----------------------------------------------+ + +A package can declare that it obsoletes other packages using the *obsoletes* +keyword argument. The value for this is similar to that of the *requires* +keyword: a list of strings giving module or package specifiers. Each specifier +consists of a module or package name optionally followed by one or more version +qualifiers. Version qualifiers are given in parentheses after the module or +package name. + +The versions identified by the qualifiers are those that are obsoleted by the +distribution being described. If no qualifiers are given, all versions of the +named module or package are understood to be obsoleted. + + +Installing Scripts +================== + +So far we have been dealing with pure and non-pure Python modules, which are +usually not run by themselves but imported by scripts. + +Scripts are files containing Python source code, intended to be started from the +command line. Scripts don't require Distutils to do anything very complicated. +The only clever feature is that if the first line of the script starts with +``#!`` and contains the word "python", the Distutils will adjust the first line +to refer to the current interpreter location. By default, it is replaced with +the current interpreter location. The :option:`--executable` (or :option:`-e`) +option will allow the interpreter path to be explicitly overridden. + +The :option:`scripts` option simply is a list of files to be handled in this +way. From the PyXML setup script:: + + setup(... + scripts=['scripts/xmlproc_parse', 'scripts/xmlproc_val'] + ) + + +Installing Package Data +======================= + +Often, additional files need to be installed into a package. These files are +often data that's closely related to the package's implementation, or text files +containing documentation that might be of interest to programmers using the +package. These files are called :dfn:`package data`. + +Package data can be added to packages using the ``package_data`` keyword +argument to the :func:`setup` function. The value must be a mapping from +package name to a list of relative path names that should be copied into the +package. The paths are interpreted as relative to the directory containing the +package (information from the ``package_dir`` mapping is used if appropriate); +that is, the files are expected to be part of the package in the source +directories. They may contain glob patterns as well. + +The path names may contain directory portions; any necessary directories will be +created in the installation. + +For example, if a package should contain a subdirectory with several data files, +the files can be arranged like this in the source tree:: + + setup.py + src/ + mypkg/ + __init__.py + module.py + data/ + tables.dat + spoons.dat + forks.dat + +The corresponding call to :func:`setup` might be:: + + setup(..., + packages=['mypkg'], + package_dir={'mypkg': 'src/mypkg'}, + package_data={'mypkg': ['data/*.dat']}, + ) + +.. versionadded:: 2.4 + + +Installing Additional Files +=========================== + +The :option:`data_files` option can be used to specify additional files needed +by the module distribution: configuration files, message catalogs, data files, +anything which doesn't fit in the previous categories. + +:option:`data_files` specifies a sequence of (*directory*, *files*) pairs in the +following way:: + + setup(... + data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), + ('config', ['cfg/data.cfg']), + ('/etc/init.d', ['init-script'])] + ) + +Note that you can specify the directory names where the data files will be +installed, but you cannot rename the data files themselves. + +Each (*directory*, *files*) pair in the sequence specifies the installation +directory and the files to install there. If *directory* is a relative path, it +is interpreted relative to the installation prefix (Python's ``sys.prefix`` for +pure-Python packages, ``sys.exec_prefix`` for packages that contain extension +modules). Each file name in *files* is interpreted relative to the +:file:`setup.py` script at the top of the package source distribution. No +directory information from *files* is used to determine the final location of +the installed file; only the name of the file is used. + +You can specify the :option:`data_files` options as a simple sequence of files +without specifying a target directory, but this is not recommended, and the +:command:`install` command will print a warning in this case. To install data +files directly in the target directory, an empty string should be given as the +directory. + + +.. _meta-data: + +Additional meta-data +==================== + +The setup script may include additional meta-data beyond the name and version. +This information includes: + ++----------------------+---------------------------+-----------------+--------+ +| Meta-Data | Description | Value | Notes | ++======================+===========================+=================+========+ +| ``name`` | name of the package | short string | \(1) | ++----------------------+---------------------------+-----------------+--------+ +| ``version`` | version of this release | short string | (1)(2) | ++----------------------+---------------------------+-----------------+--------+ +| ``author`` | package author's name | short string | \(3) | ++----------------------+---------------------------+-----------------+--------+ +| ``author_email`` | email address of the | email address | \(3) | +| | package author | | | ++----------------------+---------------------------+-----------------+--------+ +| ``maintainer`` | package maintainer's name | short string | \(3) | ++----------------------+---------------------------+-----------------+--------+ +| ``maintainer_email`` | email address of the | email address | \(3) | +| | package maintainer | | | ++----------------------+---------------------------+-----------------+--------+ +| ``url`` | home page for the package | URL | \(1) | ++----------------------+---------------------------+-----------------+--------+ +| ``description`` | short, summary | short string | | +| | description of the | | | +| | package | | | ++----------------------+---------------------------+-----------------+--------+ +| ``long_description`` | longer description of the | long string | | +| | package | | | ++----------------------+---------------------------+-----------------+--------+ +| ``download_url`` | location where the | URL | \(4) | +| | package may be downloaded | | | ++----------------------+---------------------------+-----------------+--------+ +| ``classifiers`` | a list of classifiers | list of strings | \(4) | ++----------------------+---------------------------+-----------------+--------+ + +Notes: + +(1) + These fields are required. + +(2) + It is recommended that versions take the form *major.minor[.patch[.sub]]*. + +(3) + Either the author or the maintainer must be identified. + +(4) + These fields should not be used if your package is to be compatible with Python + versions prior to 2.2.3 or 2.3. The list is available from the `PyPI website + `_. + +'short string' + A single line of text, not more than 200 characters. + +'long string' + Multiple lines of plain text in reStructuredText format (see + http://docutils.sf.net/). + +'list of strings' + See below. + +None of the string values may be Unicode. + +Encoding the version information is an art in itself. Python packages generally +adhere to the version format *major.minor[.patch][sub]*. The major number is 0 +for initial, experimental releases of software. It is incremented for releases +that represent major milestones in a package. The minor number is incremented +when important new features are added to the package. The patch number +increments when bug-fix releases are made. Additional trailing version +information is sometimes used to indicate sub-releases. These are +"a1,a2,...,aN" (for alpha releases, where functionality and API may change), +"b1,b2,...,bN" (for beta releases, which only fix bugs) and "pr1,pr2,...,prN" +(for final pre-release release testing). Some examples: + +0.1.0 + the first, experimental release of a package + +1.0.1a2 + the second alpha release of the first patch version of 1.0 + +:option:`classifiers` are specified in a python list:: + + setup(... + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: Console', + 'Environment :: Web Environment', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: Developers', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Python Software Foundation License', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX', + 'Programming Language :: Python', + 'Topic :: Communications :: Email', + 'Topic :: Office/Business', + 'Topic :: Software Development :: Bug Tracking', + ], + ) + +If you wish to include classifiers in your :file:`setup.py` file and also wish +to remain backwards-compatible with Python releases prior to 2.2.3, then you can +include the following code fragment in your :file:`setup.py` before the +:func:`setup` call. :: + + # patch distutils if it can't cope with the "classifiers" or + # "download_url" keywords + from sys import version + if version < '2.2.3': + from distutils.dist import DistributionMetadata + DistributionMetadata.classifiers = None + DistributionMetadata.download_url = None + + +Debugging the setup script +========================== + +Sometimes things go wrong, and the setup script doesn't do what the developer +wants. + +Distutils catches any exceptions when running the setup script, and print a +simple error message before the script is terminated. The motivation for this +behaviour is to not confuse administrators who don't know much about Python and +are trying to install a package. If they get a big long traceback from deep +inside the guts of Distutils, they may think the package or the Python +installation is broken because they don't read all the way down to the bottom +and see that it's a permission problem. + +On the other hand, this doesn't help the developer to find the cause of the +failure. For this purpose, the DISTUTILS_DEBUG environment variable can be set +to anything except an empty string, and distutils will now print detailed +information what it is doing, and prints the full traceback in case an exception +occurs. + + diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst new file mode 100644 index 0000000..9f15870 --- /dev/null +++ b/Doc/distutils/sourcedist.rst @@ -0,0 +1,207 @@ +.. _source-dist: + +****************************** +Creating a Source Distribution +****************************** + +As shown in section :ref:`distutils-simple-example`, you use the :command:`sdist` command +to create a source distribution. In the simplest case, :: + + python setup.py sdist + +(assuming you haven't specified any :command:`sdist` options in the setup script +or config file), :command:`sdist` creates the archive of the default format for +the current platform. The default format is a gzip'ed tar file +(:file:`.tar.gz`) on Unix, and ZIP file on Windows. + +You can specify as many formats as you like using the :option:`--formats` +option, for example:: + + python setup.py sdist --formats=gztar,zip + +to create a gzipped tarball and a zip file. The available formats are: + ++-----------+-------------------------+---------+ +| Format | Description | Notes | ++===========+=========================+=========+ +| ``zip`` | zip file (:file:`.zip`) | (1),(3) | ++-----------+-------------------------+---------+ +| ``gztar`` | gzip'ed tar file | (2),(4) | +| | (:file:`.tar.gz`) | | ++-----------+-------------------------+---------+ +| ``bztar`` | bzip2'ed tar file | \(4) | +| | (:file:`.tar.bz2`) | | ++-----------+-------------------------+---------+ +| ``ztar`` | compressed tar file | \(4) | +| | (:file:`.tar.Z`) | | ++-----------+-------------------------+---------+ +| ``tar`` | tar file (:file:`.tar`) | \(4) | ++-----------+-------------------------+---------+ + +Notes: + +(1) + default on Windows + +(2) + default on Unix + +(3) + requires either external :program:`zip` utility or :mod:`zipfile` module (part + of the standard Python library since Python 1.6) + +(4) + requires external utilities: :program:`tar` and possibly one of :program:`gzip`, + :program:`bzip2`, or :program:`compress` + + +.. _manifest: + +Specifying the files to distribute +================================== + +If you don't supply an explicit list of files (or instructions on how to +generate one), the :command:`sdist` command puts a minimal default set into the +source distribution: + +* all Python source files implied by the :option:`py_modules` and + :option:`packages` options + +* all C source files mentioned in the :option:`ext_modules` or + :option:`libraries` options ( + + **\*\*** getting C library sources currently broken---no + :meth:`get_source_files` method in :file:`build_clib.py`! **\*\***) + +* scripts identified by the :option:`scripts` option + +* anything that looks like a test script: :file:`test/test\*.py` (currently, the + Distutils don't do anything with test scripts except include them in source + distributions, but in the future there will be a standard for testing Python + module distributions) + +* :file:`README.txt` (or :file:`README`), :file:`setup.py` (or whatever you + called your setup script), and :file:`setup.cfg` + +Sometimes this is enough, but usually you will want to specify additional files +to distribute. The typical way to do this is to write a *manifest template*, +called :file:`MANIFEST.in` by default. The manifest template is just a list of +instructions for how to generate your manifest file, :file:`MANIFEST`, which is +the exact list of files to include in your source distribution. The +:command:`sdist` command processes this template and generates a manifest based +on its instructions and what it finds in the filesystem. + +If you prefer to roll your own manifest file, the format is simple: one filename +per line, regular files (or symlinks to them) only. If you do supply your own +:file:`MANIFEST`, you must specify everything: the default set of files +described above does not apply in this case. + +The manifest template has one command per line, where each command specifies a +set of files to include or exclude from the source distribution. For an +example, again we turn to the Distutils' own manifest template:: + + include *.txt + recursive-include examples *.txt *.py + prune examples/sample?/build + +The meanings should be fairly clear: include all files in the distribution root +matching :file:`\*.txt`, all files anywhere under the :file:`examples` directory +matching :file:`\*.txt` or :file:`\*.py`, and exclude all directories matching +:file:`examples/sample?/build`. All of this is done *after* the standard +include set, so you can exclude files from the standard set with explicit +instructions in the manifest template. (Or, you can use the +:option:`--no-defaults` option to disable the standard set entirely.) There are +several other commands available in the manifest template mini-language; see +section :ref:`sdist-cmd`. + +The order of commands in the manifest template matters: initially, we have the +list of default files as described above, and each command in the template adds +to or removes from that list of files. Once we have fully processed the +manifest template, we remove files that should not be included in the source +distribution: + +* all files in the Distutils "build" tree (default :file:`build/`) + +* all files in directories named :file:`RCS`, :file:`CVS` or :file:`.svn` + +Now we have our complete list of files, which is written to the manifest for +future reference, and then used to build the source distribution archive(s). + +You can disable the default set of included files with the +:option:`--no-defaults` option, and you can disable the standard exclude set +with :option:`--no-prune`. + +Following the Distutils' own manifest template, let's trace how the +:command:`sdist` command builds the list of files to include in the Distutils +source distribution: + +#. include all Python source files in the :file:`distutils` and + :file:`distutils/command` subdirectories (because packages corresponding to + those two directories were mentioned in the :option:`packages` option in the + setup script---see section :ref:`setup-script`) + +#. include :file:`README.txt`, :file:`setup.py`, and :file:`setup.cfg` (standard + files) + +#. include :file:`test/test\*.py` (standard files) + +#. include :file:`\*.txt` in the distribution root (this will find + :file:`README.txt` a second time, but such redundancies are weeded out later) + +#. include anything matching :file:`\*.txt` or :file:`\*.py` in the sub-tree + under :file:`examples`, + +#. exclude all files in the sub-trees starting at directories matching + :file:`examples/sample?/build`\ ---this may exclude files included by the + previous two steps, so it's important that the ``prune`` command in the manifest + template comes after the ``recursive-include`` command + +#. exclude the entire :file:`build` tree, and any :file:`RCS`, :file:`CVS` and + :file:`.svn` directories + +Just like in the setup script, file and directory names in the manifest template +should always be slash-separated; the Distutils will take care of converting +them to the standard representation on your platform. That way, the manifest +template is portable across operating systems. + + +.. _manifest-options: + +Manifest-related options +======================== + +The normal course of operations for the :command:`sdist` command is as follows: + +* if the manifest file, :file:`MANIFEST` doesn't exist, read :file:`MANIFEST.in` + and create the manifest + +* if neither :file:`MANIFEST` nor :file:`MANIFEST.in` exist, create a manifest + with just the default file set + +* if either :file:`MANIFEST.in` or the setup script (:file:`setup.py`) are more + recent than :file:`MANIFEST`, recreate :file:`MANIFEST` by reading + :file:`MANIFEST.in` + +* use the list of files now in :file:`MANIFEST` (either just generated or read + in) to create the source distribution archive(s) + +There are a couple of options that modify this behaviour. First, use the +:option:`--no-defaults` and :option:`--no-prune` to disable the standard +"include" and "exclude" sets. + +Second, you might want to force the manifest to be regenerated---for example, if +you have added or removed files or directories that match an existing pattern in +the manifest template, you should regenerate the manifest:: + + python setup.py sdist --force-manifest + +Or, you might just want to (re)generate the manifest, but not create a source +distribution:: + + python setup.py sdist --manifest-only + +:option:`--manifest-only` implies :option:`--force-manifest`. :option:`-o` is a +shortcut for :option:`--manifest-only`, and :option:`-f` for +:option:`--force-manifest`. + + diff --git a/Doc/distutils/uploading.rst b/Doc/distutils/uploading.rst new file mode 100644 index 0000000..0b82184 --- /dev/null +++ b/Doc/distutils/uploading.rst @@ -0,0 +1,37 @@ +.. _package-upload: + +*************************************** +Uploading Packages to the Package Index +*************************************** + +.. versionadded:: 2.5 + +The Python Package Index (PyPI) not only stores the package info, but also the +package data if the author of the package wishes to. The distutils command +:command:`upload` pushes the distribution files to PyPI. + +The command is invoked immediately after building one or more distribution +files. For example, the command :: + + python setup.py sdist bdist_wininst upload + +will cause the source distribution and the Windows installer to be uploaded to +PyPI. Note that these will be uploaded even if they are built using an earlier +invocation of :file:`setup.py`, but that only distributions named on the command +line for the invocation including the :command:`upload` command are uploaded. + +The :command:`upload` command uses the username, password, and repository URL +from the :file:`$HOME/.pypirc` file (see section :ref:`pypirc` for more on this +file). + +You can use the :option:`--sign` option to tell :command:`upload` to sign each +uploaded file using GPG (GNU Privacy Guard). The :program:`gpg` program must +be available for execution on the system :envvar:`PATH`. You can also specify +which key to use for signing using the :option:`--identity=*name*` option. + +Other :command:`upload` options include :option:`--repository=*url*` (which +lets you override the repository setting from :file:`$HOME/.pypirc`), and +:option:`--show-response` (which displays the full response text from the PyPI +server for help in debugging upload problems). + + diff --git a/Doc/documenting/fromlatex.rst b/Doc/documenting/fromlatex.rst new file mode 100644 index 0000000..67abe8a --- /dev/null +++ b/Doc/documenting/fromlatex.rst @@ -0,0 +1,192 @@ +.. highlightlang:: rest + +Differences to the LaTeX markup +=============================== + +Though the markup language is different, most of the concepts and markup types +of the old LaTeX docs have been kept -- environments as reST directives, inline +commands as reST roles and so forth. + +However, there are some differences in the way these work, partly due to the +differences in the markup languages, partly due to improvements in Sphinx. This +section lists these differences, in order to give those familiar with the old +format a quick overview of what they might run into. + +Inline markup +------------- + +These changes have been made to inline markup: + +* **Cross-reference roles** + + Most of the following semantic roles existed previously as inline commands, + but didn't do anything except formatting the content as code. Now, they + cross-reference to known targets (some names have also been shortened): + + | *mod* (previously *refmodule* or *module*) + | *func* (previously *function*) + | *data* (new) + | *const* + | *class* + | *meth* (previously *method*) + | *attr* (previously *member*) + | *exc* (previously *exception*) + | *cdata* + | *cfunc* (previously *cfunction*) + | *cmacro* (previously *csimplemacro*) + | *ctype* + + Also different is the handling of *func* and *meth*: while previously + parentheses were added to the callable name (like ``\func{str()}``), they are + now appended by the build system -- appending them in the source will result + in double parentheses. This also means that ``:func:`str(object)``` will not + work as expected -- use ````str(object)```` instead! + +* **Inline commands implemented as directives** + + These were inline commands in LaTeX, but are now directives in reST: + + | *deprecated* + | *versionadded* + | *versionchanged* + + These are used like so:: + + .. deprecated:: 2.5 + Reason of deprecation. + + Also, no period is appended to the text for *versionadded* and + *versionchanged*. + + | *note* + | *warning* + + These are used like so:: + + .. note:: + + Content of note. + +* **Otherwise changed commands** + + The *samp* command previously formatted code and added quotation marks around + it. The *samp* role, however, features a new highlighting system just like + *file* does: + + ``:samp:`open({filename}, {mode})``` results in :samp:`open({filename}, {mode})` + +* **Dropped commands** + + These were commands in LaTeX, but are not available as roles: + + | *bfcode* + | *character* (use :samp:`\`\`'c'\`\``) + | *citetitle* (use ```Title `_``) + | *code* (use ````code````) + | *email* (just write the address in body text) + | *filenq* + | *filevar* (use the ``{...}`` highlighting feature of *file*) + | *programopt*, *longprogramopt* (use *option*) + | *ulink* (use ```Title `_``) + | *url* (just write the URL in body text) + | *var* (use ``*var*``) + | *infinity*, *plusminus* (use the Unicode character) + | *shortversion*, *version* (use the ``|version|`` and ``|release|`` substitutions) + | *emph*, *strong* (use the reST markup) + +* **Backslash escaping** + + In reST, a backslash must be escaped in normal text, and in the content of + roles. However, in code literals and literal blocks, it must not be escaped. + Example: ``:file:`C:\\Temp\\my.tmp``` vs. ````open("C:\Temp\my.tmp")````. + + +Information units +----------------- + +Information units (*...desc* environments) have been made reST directives. +These changes to information units should be noted: + +* **New names** + + "desc" has been removed from every name. Additionally, these directives have + new names: + + | *cfunction* (previously *cfuncdesc*) + | *cmacro* (previously *csimplemacrodesc*) + | *exception* (previously *excdesc*) + | *function* (previously *funcdesc*) + | *attribute* (previously *memberdesc*) + + The *classdesc\** and *excclassdesc* environments have been dropped, the + *class* and *exception* directives support classes documented with and without + constructor arguments. + +* **Multiple objects** + + The equivalent of the *...line* commands is:: + + .. function:: do_foo(bar) + do_bar(baz) + + Description of the functions. + + IOW, just give one signatures per line, at the same indentation level. + +* **Arguments** + + There is no *optional* command. Just give function signatures like they + should appear in the output:: + + .. function:: open(filename[, mode[, buffering]]) + + Description. + + Note: markup in the signature is not supported. + +* **Indexing** + + The *...descni* environments have been dropped. To mark an information unit + as unsuitable for index entry generation, use the *noindex* option like so:: + + .. function:: foo_* + :noindex: + + Description. + +* **New information unit** + + There is a new generic information unit called "describe" which can be used + to document things that are not covered by the other units:: + + .. describe:: a == b + + The equals operator. + + +Structure +--------- + +The LaTeX docs were split in several toplevel manuals. Now, all files +are part of the same documentation tree, as indicated by the *toctree* +directives in the sources. Every *toctree* directive embeds other files +as subdocuments of the current file (this structure is not necessarily +mirrored in the filesystem layout). The toplevel file is +:file:`contents.rst`. + +However, most of the old directory structure has been kept, with the +directories renamed as follows: + +* :file:`api` -> :file:`c-api` +* :file:`dist` -> :file:`distutils`, with the single TeX file split up +* :file:`doc` -> :file:`documenting` +* :file:`ext` -> :file:`extending` +* :file:`inst` -> :file:`installing` +* :file:`lib` -> :file:`library` +* :file:`mac` -> merged into :file:`library`, with `mac/using.tex` + moved to `howto/pythonmac.rst` +* :file:`ref` -> :file:`reference` +* :file:`tut` -> :file:`tutorial`, with the single TeX file split up + + +.. XXX more (index-generating, production lists, ...) diff --git a/Doc/documenting/index.rst b/Doc/documenting/index.rst new file mode 100644 index 0000000..1a3778b --- /dev/null +++ b/Doc/documenting/index.rst @@ -0,0 +1,33 @@ +.. _documenting-index: + +###################### + Documenting Python +###################### + + +The Python language has a substantial body of documentation, much of it +contributed by various authors. The markup used for the Python documentation is +`reStructuredText`_, developed by the `docutils`_ project, amended by custom +directives and using a toolset named *Sphinx* to postprocess the HTML output. + +This document describes the style guide for our documentation, the custom +reStructuredText markup introduced to support Python documentation and how it +should be used, as well as the Sphinx build system. + +.. _reStructuredText: http://docutils.sf.net/rst.html +.. _docutils: http://docutils.sf.net/ + +If you're interested in contributing to Python's documentation, there's no need +to write reStructuredText if you're not so inclined; plain text contributions +are more than welcome as well. + +.. toctree:: + + intro.rst + style.rst + rest.rst + markup.rst + sphinx.rst + +.. XXX add credits, thanks etc. + diff --git a/Doc/documenting/intro.rst b/Doc/documenting/intro.rst new file mode 100644 index 0000000..e02ad7d --- /dev/null +++ b/Doc/documenting/intro.rst @@ -0,0 +1,29 @@ +Introduction +============ + +Python's documentation has long been considered to be good for a free +programming language. There are a number of reasons for this, the most +important being the early commitment of Python's creator, Guido van Rossum, to +providing documentation on the language and its libraries, and the continuing +involvement of the user community in providing assistance for creating and +maintaining documentation. + +The involvement of the community takes many forms, from authoring to bug reports +to just plain complaining when the documentation could be more complete or +easier to use. + +This document is aimed at authors and potential authors of documentation for +Python. More specifically, it is for people contributing to the standard +documentation and developing additional documents using the same tools as the +standard documents. This guide will be less useful for authors using the Python +documentation tools for topics other than Python, and less useful still for +authors not using the tools at all. + +If your interest is in contributing to the Python documentation, but you don't +have the time or inclination to learn reStructuredText and the markup structures +documented here, there's a welcoming place for you among the Python contributors +as well. Any time you feel that you can clarify existing documentation or +provide documentation that's missing, the existing documentation team will +gladly work with you to integrate your text, dealing with the markup for you. +Please don't let the material in this document stand between the documentation +and your desire to help out! \ No newline at end of file diff --git a/Doc/documenting/markup.rst b/Doc/documenting/markup.rst new file mode 100644 index 0000000..831fad9 --- /dev/null +++ b/Doc/documenting/markup.rst @@ -0,0 +1,775 @@ +.. highlightlang:: rest + +Additional Markup Constructs +============================ + +Sphinx adds a lot of new directives and interpreted text roles to standard reST +markup. This section contains the reference material for these facilities. +Documentation for "standard" reST constructs is not included here, though +they are used in the Python documentation. + +File-wide metadata +------------------ + +reST has the concept of "field lists"; these are a sequence of fields marked up +like this:: + + :Field name: Field content + +A field list at the very top of a file is parsed as the "docinfo", which in +normal documents can be used to record the author, date of publication and +other metadata. In Sphinx, the docinfo is used as metadata, too, but not +displayed in the output. + +At the moment, only one metadata field is recognized: + +``nocomments`` + If set, the web application won't display a comment form for a page generated + from this source file. + + +Meta-information markup +----------------------- + +.. describe:: sectionauthor + + Identifies the author of the current section. The argument should include + the author's name such that it can be used for presentation (though it isn't) + and email address. The domain name portion of the address should be lower + case. Example:: + + .. sectionauthor:: Guido van Rossum + + Currently, this markup isn't reflected in the output in any way, but it helps + keep track of contributions. + + +Module-specific markup +---------------------- + +The markup described in this section is used to provide information about a +module being documented. Each module should be documented in its own file. +Normally this markup appears after the title heading of that file; a typical +file might start like this:: + + :mod:`parrot` -- Dead parrot access + =================================== + + .. module:: parrot + :platform: Unix, Windows + :synopsis: Analyze and reanimate dead parrots. + .. moduleauthor:: Eric Cleese + .. moduleauthor:: John Idle + +As you can see, the module-specific markup consists of two directives, the +``module`` directive and the ``moduleauthor`` directive. + +.. describe:: module + + This directive marks the beginning of the description of a module (or package + submodule, in which case the name should be fully qualified, including the + package name). + + The ``platform`` option, if present, is a comma-separated list of the + platforms on which the module is available (if it is available on all + platforms, the option should be omitted). The keys are short identifiers; + examples that are in use include "IRIX", "Mac", "Windows", and "Unix". It is + important to use a key which has already been used when applicable. + + The ``synopsis`` option should consist of one sentence describing the + module's purpose -- it is currently only used in the Global Module Index. + +.. describe:: moduleauthor + + The ``moduleauthor`` directive, which can appear multiple times, names the + authors of the module code, just like ``sectionauthor`` names the author(s) + of a piece of documentation. It too does not result in any output currently. + + +.. note:: + + It is important to make the section title of a module-describing file + meaningful since that value will be inserted in the table-of-contents trees + in overview files. + + +Information units +----------------- + +There are a number of directives used to describe specific features provided by +modules. Each directive requires one or more signatures to provide basic +information about what is being described, and the content should be the +description. The basic version makes entries in the general index; if no index +entry is desired, you can give the directive option flag ``:noindex:``. The +following example shows all of the features of this directive type:: + + .. function:: spam(eggs) + ham(eggs) + :noindex: + + Spam or ham the foo. + +The signatures of object methods or data attributes should always include the +type name (``.. method:: FileInput.input(...)``), even if it is obvious from the +context which type they belong to; this is to enable consistent +cross-references. If you describe methods belonging to an abstract protocol, +such as "context managers", include a (pseudo-)type name too to make the +index entries more informative. + +The directives are: + +.. describe:: cfunction + + Describes a C function. The signature should be given as in C, e.g.:: + + .. cfunction:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems) + + This is also used to describe function-like preprocessor macros. The names + of the arguments should be given so they may be used in the description. + + Note that you don't have to backslash-escape asterisks in the signature, + as it is not parsed by the reST inliner. + +.. describe:: cmember + + Describes a C struct member. Example signature:: + + .. cmember:: PyObject* PyTypeObject.tp_bases + + The text of the description should include the range of values allowed, how + the value should be interpreted, and whether the value can be changed. + References to structure members in text should use the ``member`` role. + +.. describe:: cmacro + + Describes a "simple" C macro. Simple macros are macros which are used + for code expansion, but which do not take arguments so cannot be described as + functions. This is not to be used for simple constant definitions. Examples + of its use in the Python documentation include :cmacro:`PyObject_HEAD` and + :cmacro:`Py_BEGIN_ALLOW_THREADS`. + +.. describe:: ctype + + Describes a C type. The signature should just be the type name. + +.. describe:: cvar + + Describes a global C variable. The signature should include the type, such + as:: + + .. cvar:: PyObject* PyClass_Type + +.. describe:: data + + Describes global data in a module, including both variables and values used + as "defined constants." Class and object attributes are not documented + using this environment. + +.. describe:: exception + + Describes an exception class. The signature can, but need not include + parentheses with constructor arguments. + +.. describe:: function + + Describes a module-level function. The signature should include the + parameters, enclosing optional parameters in brackets. Default values can be + given if it enhances clarity. For example:: + + .. function:: Timer.repeat([repeat=3[, number=1000000]]) + + Object methods are not documented using this directive. Bound object methods + placed in the module namespace as part of the public interface of the module + are documented using this, as they are equivalent to normal functions for + most purposes. + + The description should include information about the parameters required and + how they are used (especially whether mutable objects passed as parameters + are modified), side effects, and possible exceptions. A small example may be + provided. + +.. describe:: class + + Describes a class. The signature can include parentheses with parameters + which will be shown as the constructor arguments. + +.. describe:: attribute + + Describes an object data attribute. The description should include + information about the type of the data to be expected and whether it may be + changed directly. + +.. describe:: method + + Describes an object method. The parameters should not include the ``self`` + parameter. The description should include similar information to that + described for ``function``. + +.. describe:: opcode + + Describes a Python bytecode instruction. + + +There is also a generic version of these directives: + +.. describe:: describe + + This directive produces the same formatting as the specific ones explained + above but does not create index entries or cross-referencing targets. It is + used, for example, to describe the directives in this document. Example:: + + .. describe:: opcode + + Describes a Python bytecode instruction. + + +Showing code examples +--------------------- + +Examples of Python source code or interactive sessions are represented using +standard reST literal blocks. They are started by a ``::`` at the end of the +preceding paragraph and delimited by indentation. + +Representing an interactive session requires including the prompts and output +along with the Python code. No special markup is required for interactive +sessions. After the last line of input or output presented, there should not be +an "unused" primary prompt; this is an example of what *not* to do:: + + >>> 1 + 1 + 2 + >>> + +Syntax highlighting is handled in a smart way: + +* There is a "highlighting language" for each source file. Per default, + this is ``'python'`` as the majority of files will have to highlight Python + snippets. + +* Within Python highlighting mode, interactive sessions are recognized + automatically and highlighted appropriately. + +* The highlighting language can be changed using the ``highlightlang`` + directive, used as follows:: + + .. highlightlang:: c + + This language is used until the next ``highlightlang`` directive is + encountered. + +* The valid values for the highlighting language are: + + * ``python`` (the default) + * ``c`` + * ``rest`` + * ``none`` (no highlighting) + +* If highlighting with the current language fails, the block is not highlighted + in any way. + +Longer displays of verbatim text may be included by storing the example text in +an external file containing only plain text. The file may be included using the +``literalinclude`` directive. [1]_ For example, to include the Python source file +:file:`example.py`, use:: + + .. literalinclude:: example.py + +The file name is relative to the current file's path. Documentation-specific +include files should be placed in the ``Doc/includes`` subdirectory. + + +Inline markup +------------- + +As said before, Sphinx uses interpreted text roles to insert semantic markup in +documents. + +Variable names are an exception, they should be marked simply with ``*var*``. + +For all other roles, you have to write ``:rolename:`content```. + +The following roles refer to objects in modules and are possibly hyperlinked if +a matching identifier is found: + +.. describe:: mod + + The name of a module; a dotted name may be used. This should also be used for + package names. + +.. describe:: func + + The name of a Python function; dotted names may be used. The role text + should include trailing parentheses to enhance readability. The parentheses + are stripped when searching for identifiers. + +.. describe:: data + + The name of a module-level variable. + +.. describe:: const + + The name of a "defined" constant. This may be a C-language ``#define`` + or a Python variable that is not intended to be changed. + +.. describe:: class + + A class name; a dotted name may be used. + +.. describe:: meth + + The name of a method of an object. The role text should include the type + name, method name and the trailing parentheses. A dotted name may be used. + +.. describe:: attr + + The name of a data attribute of an object. + +.. describe:: exc + + The name of an exception. A dotted name may be used. + +The name enclosed in this markup can include a module name and/or a class name. +For example, ``:func:`filter``` could refer to a function named ``filter`` in +the current module, or the built-in function of that name. In contrast, +``:func:`foo.filter``` clearly refers to the ``filter`` function in the ``foo`` +module. + +A similar heuristic is used to determine whether the name is an attribute of +the currently documented class. + +The following roles create cross-references to C-language constructs if they +are defined in the API documentation: + +.. describe:: cdata + + The name of a C-language variable. + +.. describe:: cfunc + + The name of a C-language function. Should include trailing parentheses. + +.. describe:: cmacro + + The name of a "simple" C macro, as defined above. + +.. describe:: ctype + + The name of a C-language type. + + +The following role does possibly create a cross-reference, but does not refer +to objects: + +.. describe:: token + + The name of a grammar token (used in the reference manual to create links + between production displays). + +--------- + +The following roles don't do anything special except formatting the text +in a different style: + +.. describe:: command + + The name of an OS-level command, such as ``rm``. + +.. describe:: dfn + + Mark the defining instance of a term in the text. (No index entries are + generated.) + +.. describe:: envvar + + An environment variable. Index entries are generated. + +.. describe:: file + + The name of a file or directory. Within the contents, you can use curly + braces to indicate a "variable" part, for example:: + + ... is installed in :file:`/usr/lib/python2.{x}/site-packages` ... + + In the built documentation, the ``x`` will be displayed differently to + indicate that it is to be replaced by the Python minor version. + +.. describe:: guilabel + + Labels presented as part of an interactive user interface should be marked + using ``guilabel``. This includes labels from text-based interfaces such as + those created using :mod:`curses` or other text-based libraries. Any label + used in the interface should be marked with this role, including button + labels, window titles, field names, menu and menu selection names, and even + values in selection lists. + +.. describe:: kbd + + Mark a sequence of keystrokes. What form the key sequence takes may depend + on platform- or application-specific conventions. When there are no relevant + conventions, the names of modifier keys should be spelled out, to improve + accessibility for new users and non-native speakers. For example, an + *xemacs* key sequence may be marked like ``:kbd:`C-x C-f```, but without + reference to a specific application or platform, the same sequence should be + marked as ``:kbd:`Control-x Control-f```. + +.. describe:: keyword + + The name of a keyword in a programming language. + +.. describe:: mailheader + + The name of an RFC 822-style mail header. This markup does not imply that + the header is being used in an email message, but can be used to refer to any + header of the same "style." This is also used for headers defined by the + various MIME specifications. The header name should be entered in the same + way it would normally be found in practice, with the camel-casing conventions + being preferred where there is more than one common usage. For example: + ``:mailheader:`Content-Type```. + +.. describe:: makevar + + The name of a :command:`make` variable. + +.. describe:: manpage + + A reference to a Unix manual page including the section, + e.g. ``:manpage:`ls(1)```. + +.. describe:: menuselection + + Menu selections should be marked using the ``menuselection`` role. This is + used to mark a complete sequence of menu selections, including selecting + submenus and choosing a specific operation, or any subsequence of such a + sequence. The names of individual selections should be separated by + ``-->``. + + For example, to mark the selection "Start > Programs", use this markup:: + + :menuselection:`Start --> Programs` + + When including a selection that includes some trailing indicator, such as the + ellipsis some operating systems use to indicate that the command opens a + dialog, the indicator should be omitted from the selection name. + +.. describe:: mimetype + + The name of a MIME type, or a component of a MIME type (the major or minor + portion, taken alone). + +.. describe:: newsgroup + + The name of a Usenet newsgroup. + +.. describe:: option + + A command-line option to an executable program. The leading hyphen(s) must + be included. + +.. describe:: program + + The name of an executable program. This may differ from the file name for + the executable for some platforms. In particular, the ``.exe`` (or other) + extension should be omitted for Windows programs. + +.. describe:: regexp + + A regular expression. Quotes should not be included. + +.. describe:: samp + + A piece of literal text, such as code. Within the contents, you can use + curly braces to indicate a "variable" part, as in ``:file:``. + + If you don't need the "variable part" indication, use the standard + ````code```` instead. + +.. describe:: var + + A Python or C variable or parameter name. + + +The following roles generate external links: + +.. describe:: pep + + A reference to a Python Enhancement Proposal. This generates appropriate + index entries. The text "PEP *number*\ " is generated; in the HTML output, + this text is a hyperlink to an online copy of the specified PEP. + +.. describe:: rfc + + A reference to an Internet Request for Comments. This generates appropriate + index entries. The text "RFC *number*\ " is generated; in the HTML output, + this text is a hyperlink to an online copy of the specified RFC. + + +Note that there are no special roles for including hyperlinks as you can use +the standard reST markup for that purpose. + + +.. _doc-ref-role: + +Cross-linking markup +-------------------- + +To support cross-referencing to arbitrary sections in the documentation, the +standard reST labels are "abused" a bit: Every label must precede a section +title; and every label name must be unique throughout the entire documentation +source. + +You can then reference to these sections using the ``:ref:`label-name``` role. + +Example:: + + .. _my-reference-label: + + Section to cross-reference + -------------------------- + + This is the text of the section. + + It refers to the section itself, see :ref:`my-reference-label`. + +The ``:ref:`` invocation is replaced with the section title. + + +Paragraph-level markup +---------------------- + +These directives create short paragraphs and can be used inside information +units as well as normal text: + +.. describe:: note + + An especially important bit of information about an API that a user should be + aware of when using whatever bit of API the note pertains to. The content of + the directive should be written in complete sentences and include all + appropriate punctuation. + + Example:: + + .. note:: + + This function is not suitable for sending spam e-mails. + +.. describe:: warning + + An important bit of information about an API that a user should be very aware + of when using whatever bit of API the warning pertains to. The content of + the directive should be written in complete sentences and include all + appropriate punctuation. This differs from ``note`` in that it is recommended + over ``note`` for information regarding security. + +.. describe:: versionadded + + This directive documents the version of Python which added the described + feature to the library or C API. When this applies to an entire module, it + should be placed at the top of the module section before any prose. + + The first argument must be given and is the version in question; you can add + a second argument consisting of a *brief* explanation of the change. + + Example:: + + .. versionadded:: 2.5 + The `spam` parameter. + + Note that there must be no blank line between the directive head and the + explanation; this is to make these blocks visually continuous in the markup. + +.. describe:: versionchanged + + Similar to ``versionadded``, but describes when and what changed in the named + feature in some way (new parameters, changed side effects, etc.). + +-------------- + +.. describe:: seealso + + Many sections include a list of references to module documentation or + external documents. These lists are created using the ``seealso`` directive. + + The ``seealso`` directive is typically placed in a section just before any + sub-sections. For the HTML output, it is shown boxed off from the main flow + of the text. + + The content of the ``seealso`` directive should be a reST definition list. + Example:: + + .. seealso:: + + Module :mod:`zipfile` + Documentation of the :mod:`zipfile` standard module. + + `GNU tar manual, Basic Tar Format `_ + Documentation for tar archive files, including GNU tar extensions. + +.. describe:: rubric + + This directive creates a paragraph heading that is not used to create a + table of contents node. It is currently used for the "Footnotes" caption. + +.. describe:: centered + + This directive creates a centered boldfaced paragraph. Use it as follows:: + + .. centered:: + + Paragraph contents. + + +Table-of-contents markup +------------------------ + +Since reST does not have facilities to interconnect several documents, or split +documents into multiple output files, Sphinx uses a custom directive to add +relations between the single files the documentation is made of, as well as +tables of contents. The ``toctree`` directive is the central element. + +.. describe:: toctree + + This directive inserts a "TOC tree" at the current location, using the + individual TOCs (including "sub-TOC trees") of the files given in the + directive body. A numeric ``maxdepth`` option may be given to indicate the + depth of the tree; by default, all levels are included. + + Consider this example (taken from the library reference index):: + + .. toctree:: + :maxdepth: 2 + + intro.rst + strings.rst + datatypes.rst + numeric.rst + (many more files listed here) + + This accomplishes two things: + + * Tables of contents from all those files are inserted, with a maximum depth + of two, that means one nested heading. ``toctree`` directives in those + files are also taken into account. + * Sphinx knows that the relative order of the files ``intro.rst``, + ``strings.rst`` and so forth, and it knows that they are children of the + shown file, the library index. From this information it generates "next + chapter", "previous chapter" and "parent chapter" links. + + In the end, all files included in the build process must occur in one + ``toctree`` directive; Sphinx will emit a warning if it finds a file that is + not included, because that means that this file will not be reachable through + standard navigation. + + The special file ``contents.rst`` at the root of the source directory is the + "root" of the TOC tree hierarchy; from it the "Contents" page is generated. + + +Index-generating markup +----------------------- + +Sphinx automatically creates index entries from all information units (like +functions, classes or attributes) like discussed before. + +However, there is also an explicit directive available, to make the index more +comprehensive and enable index entries in documents where information is not +mainly contained in information units, such as the language reference. + +The directive is ``index`` and contains one or more index entries. Each entry +consists of a type and a value, separated by a colon. + +For example:: + + .. index:: + single: execution!context + module: __main__ + module: sys + triple: module; search; path + +This directive contains five entries, which will be converted to entries in the +generated index which link to the exact location of the index statement (or, in +case of offline media, the corresponding page number). + +The possible entry types are: + +single + Creates a single index entry. Can be made a subentry by separating the + subentry text with a semicolon (this is also used below to describe what + entries are created). +pair + ``pair: loop; statement`` is a shortcut that creates two index entries, + namely ``loop; statement`` and ``statement; loop``. +triple + Likewise, ``triple: module; search; path`` is a shortcut that creates three + index entries, which are ``module; search path``, ``search; path, module`` and + ``path; module search``. +module, keyword, operator, object, exception, statement, builtin + These all create two index entries. For example, ``module: hashlib`` creates + the entries ``module; hashlib`` and ``hashlib; module``. + + +Grammar production displays +--------------------------- + +Special markup is available for displaying the productions of a formal grammar. +The markup is simple and does not attempt to model all aspects of BNF (or any +derived forms), but provides enough to allow context-free grammars to be +displayed in a way that causes uses of a symbol to be rendered as hyperlinks to +the definition of the symbol. There is this directive: + +.. describe:: productionlist + + This directive is used to enclose a group of productions. Each production is + given on a single line and consists of a name, separated by a colon from the + following definition. If the definition spans multiple lines, each + continuation line must begin with a colon placed at the same column as in the + first line. + + Blank lines are not allowed within ``productionlist`` directive arguments. + + The definition can contain token names which are marked as interpreted text + (e.g. ``sum ::= `integer` "+" `integer```) -- this generates cross-references + to the productions of these tokens. + + Note that no further reST parsing is done in the production, so that you + don't have to escape ``*`` or ``|`` characters. + + +.. XXX describe optional first parameter + +The following is an example taken from the Python Reference Manual:: + + .. productionlist:: + try_stmt: try1_stmt | try2_stmt + try1_stmt: "try" ":" `suite` + : ("except" [`expression` ["," `target`]] ":" `suite`)+ + : ["else" ":" `suite`] + : ["finally" ":" `suite`] + try2_stmt: "try" ":" `suite` + : "finally" ":" `suite` + + +Substitutions +------------- + +The documentation system provides three substitutions that are defined by default. +They are set in the build configuration file, see :ref:`doc-build-config`. + +.. describe:: |release| + + Replaced by the Python release the documentation refers to. This is the full + version string including alpha/beta/release candidate tags, e.g. ``2.5.2b3``. + +.. describe:: |version| + + Replaced by the Python version the documentation refers to. This consists + only of the major and minor version parts, e.g. ``2.5``, even for version + 2.5.1. + +.. describe:: |today| + + Replaced by either today's date, or the date set in the build configuration + file. Normally has the format ``April 14, 2007``. + + +.. rubric:: Footnotes + +.. [1] There is a standard ``.. include`` directive, but it raises errors if the + file is not found. This one only emits a warning. diff --git a/Doc/documenting/rest.rst b/Doc/documenting/rest.rst new file mode 100644 index 0000000..8a4fc3d --- /dev/null +++ b/Doc/documenting/rest.rst @@ -0,0 +1,251 @@ +.. highlightlang:: rest + +reStructuredText Primer +======================= + +This section is a brief introduction to reStructuredText (reST) concepts and +syntax, intended to provide authors with enough information to author documents +productively. Since reST was designed to be a simple, unobtrusive markup +language, this will not take too long. + +.. seealso:: + + The authoritative `reStructuredText User + Documentation `_. + + +Paragraphs +---------- + +The paragraph is the most basic block in a reST document. Paragraphs are simply +chunks of text separated by one or more blank lines. As in Python, indentation +is significant in reST, so all lines of the same paragraph must be left-aligned +to the same level of indentation. + + +Inline markup +------------- + +The standard reST inline markup is quite simple: use + +* one asterisk: ``*text*`` for emphasis (italics), +* two asterisks: ``**text**`` for strong emphasis (boldface), and +* backquotes: ````text```` for code samples. + +If asterisks or backquotes appear in running text and could be confused with +inline markup delimiters, they have to be escaped with a backslash. + +Be aware of some restrictions of this markup: + +* it may not be nested, +* content may not start or end with whitespace: ``* text*`` is wrong, +* it must be separated from surrounding text by non-word characters. Use a + backslash escaped space to work around that: ``thisis\ *one*\ word``. + +These restrictions may be lifted in future versions of the docutils. + +reST also allows for custom "interpreted text roles"', which signify that the +enclosed text should be interpreted in a specific way. Sphinx uses this to +provide semantic markup and cross-referencing of identifiers, as described in +the appropriate section. The general syntax is ``:rolename:`content```. + + +Lists and Quotes +---------------- + +List markup is natural: just place an asterisk at the start of a paragraph and +indent properly. The same goes for numbered lists; they can also be +autonumbered using a ``#`` sign:: + + * This is a bulleted list. + * It has two items, the second + item uses two lines. + + 1. This is a numbered list. + 2. It has two items too. + + #. This is a numbered list. + #. It has two items too. + +Note that Sphinx disables the use of enumerated lists introduced by alphabetic +or roman numerals, such as :: + + A. First item + B. Second item + + +Nested lists are possible, but be aware that they must be separated from the +parent list items by blank lines:: + + * this is + * a list + + * with a nested list + * and some subitems + + * and here the parent list continues + +Definition lists are created as follows:: + + term (up to a line of text) + Definition of the term, which must be indented + + and can even consist of multiple paragraphs + + next term + Description. + + +Paragraphs are quoted by just indenting them more than the surrounding +paragraphs. + + +Source Code +----------- + +Literal code blocks are introduced by ending a paragraph with the special marker +``::``. The literal block must be indented, to be able to include blank lines:: + + This is a normal text paragraph. The next paragraph is a code sample:: + + It is not processed in any way, except + that the indentation is removed. + + It can span multiple lines. + + This is a normal text paragraph again. + +The handling of the ``::`` marker is smart: + +* If it occurs as a paragraph of its own, that paragraph is completely left + out of the document. +* If it is preceded by whitespace, the marker is removed. +* If it is preceded by non-whitespace, the marker is replaced by a single + colon. + +That way, the second sentence in the above example's first paragraph would be +rendered as "The next paragraph is a code sample:". + + +Hyperlinks +---------- + +External links +^^^^^^^^^^^^^^ + +Use ```Link text `_`` for inline web links. If the link text +should be the web address, you don't need special markup at all, the parser +finds links and mail addresses in ordinary text. + +Internal links +^^^^^^^^^^^^^^ + +Internal linking is done via a special reST role, see the section on specific +markup, :ref:`doc-ref-role`. + + +Sections +-------- + +Section headers are created by underlining (and optionally overlining) the +section title with a punctuation character, at least as long as the text:: + + ================= + This is a heading + ================= + +Normally, there are no heading levels assigned to certain characters as the +structure is determined from the succession of headings. However, for the +Python documentation, we use this convention: + +* ``#`` with overline, for parts +* ``*`` with overline, for chapters +* ``=``, for sections +* ``-``, for subsections +* ``^``, for subsubsections +* ``"``, for paragraphs + + +Explicit Markup +--------------- + +"Explicit markup" is used in reST for most constructs that need special +handling, such as footnotes, specially-highlighted paragraphs, comments, and +generic directives. + +An explicit markup block begins with a line starting with ``..`` followed by +whitespace and is terminated by the next paragraph at the same level of +indentation. (There needs to be a blank line between explicit markup and normal +paragraphs. This may all sound a bit complicated, but it is intuitive enough +when you write it.) + + +Directives +---------- + +A directive is a generic block of explicit markup. Besides roles, it is one of +the extension mechanisms of reST, and Sphinx makes heavy use of it. + +Basically, a directive consists of a name, arguments, options and content. (Keep +this terminology in mind, it is used in the next chapter describing custom +directives.) Looking at this example, :: + + .. function:: foo(x) + foo(y, z) + :bar: no + + Return a line of text input from the user. + +``function`` is the directive name. It is given two arguments here, the +remainder of the first line and the second line, as well as one option ``bar`` +(as you can see, options are given in the lines immediately following the +arguments and indicated by the colons). + +The directive content follows after a blank line and is indented relative to the +directive start. + + +Footnotes +--------- + +For footnotes, use ``[#]_`` to mark the footnote location, and add the footnote +body at the bottom of the document after a "Footnotes" rubric heading, like so:: + + Lorem ipsum [#]_ dolor sit amet ... [#]_ + + .. rubric:: Footnotes + + .. [#] Text of the first footnote. + .. [#] Text of the second footnote. + +You can also explicitly number the footnotes for better context. + + +Comments +-------- + +Every explicit markup block which isn't a valid markup construct (like the +footnotes above) is regarded as a comment. + + +Source encoding +--------------- + +Since the easiest way to include special characters like em dashes or copyright +signs in reST is to directly write them as Unicode characters, one has to +specify an encoding: + +All Python documentation source files must be in UTF-8 encoding, and the HTML +documents written from them will be in that encoding as well. + + +Gotchas +------- + +There are some problems one commonly runs into while authoring reST documents: + +* **Separation of inline markup:** As said above, inline markup spans must be + separated from the surrounding text by non-word characters, you have to use + an escaped space to get around that. + +.. XXX more? diff --git a/Doc/documenting/sphinx.rst b/Doc/documenting/sphinx.rst new file mode 100644 index 0000000..85e8b5e --- /dev/null +++ b/Doc/documenting/sphinx.rst @@ -0,0 +1,60 @@ +.. highlightlang:: rest + +The Sphinx build system +======================= + +.. XXX: intro... + +.. _doc-build-config: + +The build configuration file +---------------------------- + +The documentation root, that is the ``Doc`` subdirectory of the source +distribution, contains a file named ``conf.py``. This file is called the "build +configuration file", and it contains several variables that are read and used +during a build run. + +These variables are: + +version : string + A string that is used as a replacement for the ``|version|`` reST + substitution. It should be the Python version the documentation refers to. + This consists only of the major and minor version parts, e.g. ``2.5``, even + for version 2.5.1. + +release : string + A string that is used as a replacement for the ``|release|`` reST + substitution. It should be the full version string including + alpha/beta/release candidate tags, e.g. ``2.5.2b3``. + +Both ``release`` and ``version`` can be ``'auto'``, which means that they are +determined at runtime from the ``Include/patchlevel.h`` file, if a complete +Python source distribution can be found, or else from the interpreter running +Sphinx. + +today_fmt : string + A ``strftime`` format that is used to format a replacement for the + ``|today|`` reST substitution. + +today : string + A string that can contain a date that should be written to the documentation + output literally. If this is nonzero, it is used instead of + ``strftime(today_fmt)``. + +unused_files : list of strings + A list of reST filenames that are to be disregarded during building. This + could be docs for temporarily disabled modules or documentation that's not + yet ready for public consumption. + +last_updated_format : string + If this is not an empty string, it will be given to ``time.strftime()`` and + written to each generated output file after "last updated on:". + +use_smartypants : bool + If true, use SmartyPants to convert quotes and dashes to the typographically + correct entities. + +add_function_parentheses : bool + If true, ``()`` will be appended to the content of ``:func:``, ``:meth:`` and + ``:cfunc:`` cross-references. \ No newline at end of file diff --git a/Doc/documenting/style.rst b/Doc/documenting/style.rst new file mode 100644 index 0000000..5d0ccb7 --- /dev/null +++ b/Doc/documenting/style.rst @@ -0,0 +1,70 @@ +.. highlightlang:: rest + +Style Guide +=========== + +The Python documentation should follow the `Apple Publications Style Guide`_ +wherever possible. This particular style guide was selected mostly because it +seems reasonable and is easy to get online. + +Topics which are not covered in the Apple's style guide will be discussed in +this document. + +All reST files use an indentation of 3 spaces. The maximum line length is 80 +characters for normal text, but tables, deeply indented code samples and long +links may extend beyond that. + +Make generous use of blank lines where applicable; they help grouping things +together. + +A sentence-ending period may be followed by one or two spaces; while reST +ignores the second space, it is customarily put in by some users, for example +to aid Emacs' auto-fill mode. + +Footnotes are generally discouraged, though they may be used when they are the +best way to present specific information. When a footnote reference is added at +the end of the sentence, it should follow the sentence-ending punctuation. The +reST markup should appear something like this:: + + This sentence has a footnote reference. [#]_ This is the next sentence. + +Footnotes should be gathered at the end of a file, or if the file is very long, +at the end of a section. The docutils will automatically create backlinks to +the footnote reference. + +Footnotes may appear in the middle of sentences where appropriate. + +Many special names are used in the Python documentation, including the names of +operating systems, programming languages, standards bodies, and the like. Most +of these entities are not assigned any special markup, but the preferred +spellings are given here to aid authors in maintaining the consistency of +presentation in the Python documentation. + +Other terms and words deserve special mention as well; these conventions should +be used to ensure consistency throughout the documentation: + +CPU + For "central processing unit." Many style guides say this should be spelled + out on the first use (and if you must use it, do so!). For the Python + documentation, this abbreviation should be avoided since there's no + reasonable way to predict which occurrence will be the first seen by the + reader. It is better to use the word "processor" instead. + +POSIX + The name assigned to a particular group of standards. This is always + uppercase. + +Python + The name of our favorite programming language is always capitalized. + +Unicode + The name of a character set and matching encoding. This is always written + capitalized. + +Unix + The name of the operating system developed at AT&T Bell Labs in the early + 1970s. + + +.. _Apple Publications Style Guide: http://developer.apple.com/documentation/UserExperience/Conceptual/APStyleGuide/AppleStyleGuide2003.pdf + diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst new file mode 100644 index 0000000..5e1dec8 --- /dev/null +++ b/Doc/extending/building.rst @@ -0,0 +1,131 @@ +.. highlightlang:: c + + +.. _building: + +******************************************** +Building C and C++ Extensions with distutils +******************************************** + +.. sectionauthor:: Martin v. Löwis + + +Starting in Python 1.4, Python provides, on Unix, a special make file for +building make files for building dynamically-linked extensions and custom +interpreters. Starting with Python 2.0, this mechanism (known as related to +Makefile.pre.in, and Setup files) is no longer supported. Building custom +interpreters was rarely used, and extension modules can be built using +distutils. + +Building an extension module using distutils requires that distutils is +installed on the build machine, which is included in Python 2.x and available +separately for Python 1.5. Since distutils also supports creation of binary +packages, users don't necessarily need a compiler and distutils to install the +extension. + +A distutils package contains a driver script, :file:`setup.py`. This is a plain +Python file, which, in the most simple case, could look like this:: + + from distutils.core import setup, Extension + + module1 = Extension('demo', + sources = ['demo.c']) + + setup (name = 'PackageName', + version = '1.0', + description = 'This is a demo package', + ext_modules = [module1]) + + +With this :file:`setup.py`, and a file :file:`demo.c`, running :: + + python setup.py build + +will compile :file:`demo.c`, and produce an extension module named ``demo`` in +the :file:`build` directory. Depending on the system, the module file will end +up in a subdirectory :file:`build/lib.system`, and may have a name like +:file:`demo.so` or :file:`demo.pyd`. + +In the :file:`setup.py`, all execution is performed by calling the ``setup`` +function. This takes a variable number of keyword arguments, of which the +example above uses only a subset. Specifically, the example specifies +meta-information to build packages, and it specifies the contents of the +package. Normally, a package will contain of addition modules, like Python +source modules, documentation, subpackages, etc. Please refer to the distutils +documentation in :ref:`distutils-index` to learn more about the features of +distutils; this section explains building extension modules only. + +It is common to pre-compute arguments to :func:`setup`, to better structure the +driver script. In the example above, the\ ``ext_modules`` argument to +:func:`setup` is a list of extension modules, each of which is an instance of +the :class:`Extension`. In the example, the instance defines an extension named +``demo`` which is build by compiling a single source file, :file:`demo.c`. + +In many cases, building an extension is more complex, since additional +preprocessor defines and libraries may be needed. This is demonstrated in the +example below. :: + + from distutils.core import setup, Extension + + module1 = Extension('demo', + define_macros = [('MAJOR_VERSION', '1'), + ('MINOR_VERSION', '0')], + include_dirs = ['/usr/local/include'], + libraries = ['tcl83'], + library_dirs = ['/usr/local/lib'], + sources = ['demo.c']) + + setup (name = 'PackageName', + version = '1.0', + description = 'This is a demo package', + author = 'Martin v. Loewis', + author_email = 'martin@v.loewis.de', + url = 'http://www.python.org/doc/current/ext/building.html', + long_description = ''' + This is really just a demo package. + ''', + ext_modules = [module1]) + + +In this example, :func:`setup` is called with additional meta-information, which +is recommended when distribution packages have to be built. For the extension +itself, it specifies preprocessor defines, include directories, library +directories, and libraries. Depending on the compiler, distutils passes this +information in different ways to the compiler. For example, on Unix, this may +result in the compilation commands :: + + gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o + + gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so + +These lines are for demonstration purposes only; distutils users should trust +that distutils gets the invocations right. + + +.. _distributing: + +Distributing your extension modules +=================================== + +When an extension has been successfully build, there are three ways to use it. + +End-users will typically want to install the module, they do so by running :: + + python setup.py install + +Module maintainers should produce source packages; to do so, they run :: + + python setup.py sdist + +In some cases, additional files need to be included in a source distribution; +this is done through a :file:`MANIFEST.in` file; see the distutils documentation +for details. + +If the source distribution has been build successfully, maintainers can also +create binary distributions. Depending on the platform, one of the following +commands can be used to do so. :: + + python setup.py bdist_wininst + python setup.py bdist_rpm + python setup.py bdist_dumb + diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst new file mode 100644 index 0000000..b9a567c --- /dev/null +++ b/Doc/extending/embedding.rst @@ -0,0 +1,297 @@ +.. highlightlang:: c + + +.. _embedding: + +*************************************** +Embedding Python in Another Application +*************************************** + +The previous chapters discussed how to extend Python, that is, how to extend the +functionality of Python by attaching a library of C functions to it. It is also +possible to do it the other way around: enrich your C/C++ application by +embedding Python in it. Embedding provides your application with the ability to +implement some of the functionality of your application in Python rather than C +or C++. This can be used for many purposes; one example would be to allow users +to tailor the application to their needs by writing some scripts in Python. You +can also use it yourself if some of the functionality can be written in Python +more easily. + +Embedding Python is similar to extending it, but not quite. The difference is +that when you extend Python, the main program of the application is still the +Python interpreter, while if you embed Python, the main program may have nothing +to do with Python --- instead, some parts of the application occasionally call +the Python interpreter to run some Python code. + +So if you are embedding Python, you are providing your own main program. One of +the things this main program has to do is initialize the Python interpreter. At +the very least, you have to call the function :cfunc:`Py_Initialize` (on Mac OS, +call :cfunc:`PyMac_Initialize` instead). There are optional calls to pass +command line arguments to Python. Then later you can call the interpreter from +any part of the application. + +There are several different ways to call the interpreter: you can pass a string +containing Python statements to :cfunc:`PyRun_SimpleString`, or you can pass a +stdio file pointer and a file name (for identification in error messages only) +to :cfunc:`PyRun_SimpleFile`. You can also call the lower-level operations +described in the previous chapters to construct and use Python objects. + +A simple demo of embedding Python can be found in the directory +:file:`Demo/embed/` of the source distribution. + + +.. seealso:: + + :ref:`c-api-index` + The details of Python's C interface are given in this manual. A great deal of + necessary information can be found here. + + +.. _high-level-embedding: + +Very High Level Embedding +========================= + +The simplest form of embedding Python is the use of the very high level +interface. This interface is intended to execute a Python script without needing +to interact with the application directly. This can for example be used to +perform some operation on a file. :: + + #include + + int + main(int argc, char *argv[]) + { + Py_Initialize(); + PyRun_SimpleString("from time import time,ctime\n" + "print 'Today is',ctime(time())\n"); + Py_Finalize(); + return 0; + } + +The above code first initializes the Python interpreter with +:cfunc:`Py_Initialize`, followed by the execution of a hard-coded Python script +that print the date and time. Afterwards, the :cfunc:`Py_Finalize` call shuts +the interpreter down, followed by the end of the program. In a real program, +you may want to get the Python script from another source, perhaps a text-editor +routine, a file, or a database. Getting the Python code from a file can better +be done by using the :cfunc:`PyRun_SimpleFile` function, which saves you the +trouble of allocating memory space and loading the file contents. + + +.. _lower-level-embedding: + +Beyond Very High Level Embedding: An overview +============================================= + +The high level interface gives you the ability to execute arbitrary pieces of +Python code from your application, but exchanging data values is quite +cumbersome to say the least. If you want that, you should use lower level calls. +At the cost of having to write more C code, you can achieve almost anything. + +It should be noted that extending Python and embedding Python is quite the same +activity, despite the different intent. Most topics discussed in the previous +chapters are still valid. To show this, consider what the extension code from +Python to C really does: + +#. Convert data values from Python to C, + +#. Perform a function call to a C routine using the converted values, and + +#. Convert the data values from the call from C to Python. + +When embedding Python, the interface code does: + +#. Convert data values from C to Python, + +#. Perform a function call to a Python interface routine using the converted + values, and + +#. Convert the data values from the call from Python to C. + +As you can see, the data conversion steps are simply swapped to accommodate the +different direction of the cross-language transfer. The only difference is the +routine that you call between both data conversions. When extending, you call a +C routine, when embedding, you call a Python routine. + +This chapter will not discuss how to convert data from Python to C and vice +versa. Also, proper use of references and dealing with errors is assumed to be +understood. Since these aspects do not differ from extending the interpreter, +you can refer to earlier chapters for the required information. + + +.. _pure-embedding: + +Pure Embedding +============== + +The first program aims to execute a function in a Python script. Like in the +section about the very high level interface, the Python interpreter does not +directly interact with the application (but that will change in the next +section). + +The code to run a function defined in a Python script is: + +.. literalinclude:: ../includes/run-func.c + + +This code loads a Python script using ``argv[1]``, and calls the function named +in ``argv[2]``. Its integer arguments are the other values of the ``argv`` +array. If you compile and link this program (let's call the finished executable +:program:`call`), and use it to execute a Python script, such as:: + + def multiply(a,b): + print "Will compute", a, "times", b + c = 0 + for i in range(0, a): + c = c + b + return c + +then the result should be:: + + $ call multiply multiply 3 2 + Will compute 3 times 2 + Result of call: 6 + +Although the program is quite large for its functionality, most of the code is +for data conversion between Python and C, and for error reporting. The +interesting part with respect to embedding Python starts with + +.. % $ + +:: + + Py_Initialize(); + pName = PyString_FromString(argv[1]); + /* Error checking of pName left out */ + pModule = PyImport_Import(pName); + +After initializing the interpreter, the script is loaded using +:cfunc:`PyImport_Import`. This routine needs a Python string as its argument, +which is constructed using the :cfunc:`PyString_FromString` data conversion +routine. :: + + pFunc = PyObject_GetAttrString(pModule, argv[2]); + /* pFunc is a new reference */ + + if (pFunc && PyCallable_Check(pFunc)) { + ... + } + Py_XDECREF(pFunc); + +Once the script is loaded, the name we're looking for is retrieved using +:cfunc:`PyObject_GetAttrString`. If the name exists, and the object returned is +callable, you can safely assume that it is a function. The program then +proceeds by constructing a tuple of arguments as normal. The call to the Python +function is then made with:: + + pValue = PyObject_CallObject(pFunc, pArgs); + +Upon return of the function, ``pValue`` is either *NULL* or it contains a +reference to the return value of the function. Be sure to release the reference +after examining the value. + + +.. _extending-with-embedding: + +Extending Embedded Python +========================= + +Until now, the embedded Python interpreter had no access to functionality from +the application itself. The Python API allows this by extending the embedded +interpreter. That is, the embedded interpreter gets extended with routines +provided by the application. While it sounds complex, it is not so bad. Simply +forget for a while that the application starts the Python interpreter. Instead, +consider the application to be a set of subroutines, and write some glue code +that gives Python access to those routines, just like you would write a normal +Python extension. For example:: + + static int numargs=0; + + /* Return the number of arguments of the application command line */ + static PyObject* + emb_numargs(PyObject *self, PyObject *args) + { + if(!PyArg_ParseTuple(args, ":numargs")) + return NULL; + return Py_BuildValue("i", numargs); + } + + static PyMethodDef EmbMethods[] = { + {"numargs", emb_numargs, METH_VARARGS, + "Return the number of arguments received by the process."}, + {NULL, NULL, 0, NULL} + }; + +Insert the above code just above the :cfunc:`main` function. Also, insert the +following two statements directly after :cfunc:`Py_Initialize`:: + + numargs = argc; + Py_InitModule("emb", EmbMethods); + +These two lines initialize the ``numargs`` variable, and make the +:func:`emb.numargs` function accessible to the embedded Python interpreter. +With these extensions, the Python script can do things like :: + + import emb + print "Number of arguments", emb.numargs() + +In a real application, the methods will expose an API of the application to +Python. + +.. % \section{For the future} +.. % +.. % You don't happen to have a nice library to get textual +.. % equivalents of numeric values do you :-) ? +.. % Callbacks here ? (I may be using information from that section +.. % ?!) +.. % threads +.. % code examples do not really behave well if errors happen +.. % (what to watch out for) + + +.. _embeddingincplusplus: + +Embedding Python in C++ +======================= + +It is also possible to embed Python in a C++ program; precisely how this is done +will depend on the details of the C++ system used; in general you will need to +write the main program in C++, and use the C++ compiler to compile and link your +program. There is no need to recompile Python itself using C++. + + +.. _link-reqs: + +Linking Requirements +==================== + +While the :program:`configure` script shipped with the Python sources will +correctly build Python to export the symbols needed by dynamically linked +extensions, this is not automatically inherited by applications which embed the +Python library statically, at least on Unix. This is an issue when the +application is linked to the static runtime library (:file:`libpython.a`) and +needs to load dynamic extensions (implemented as :file:`.so` files). + +The problem is that some entry points are defined by the Python runtime solely +for extension modules to use. If the embedding application does not use any of +these entry points, some linkers will not include those entries in the symbol +table of the finished executable. Some additional options are needed to inform +the linker not to remove these symbols. + +Determining the right options to use for any given platform can be quite +difficult, but fortunately the Python configuration already has those values. +To retrieve them from an installed Python interpreter, start an interactive +interpreter and have a short session like this:: + + >>> import distutils.sysconfig + >>> distutils.sysconfig.get_config_var('LINKFORSHARED') + '-Xlinker -export-dynamic' + +.. index:: module: distutils.sysconfig + +The contents of the string presented will be the options that should be used. +If the string is empty, there's no need to add any additional options. The +:const:`LINKFORSHARED` definition corresponds to the variable of the same name +in Python's top-level :file:`Makefile`. + diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst new file mode 100644 index 0000000..bf48c49 --- /dev/null +++ b/Doc/extending/extending.rst @@ -0,0 +1,1273 @@ +.. highlightlang:: c + + +.. _extending-intro: + +****************************** +Extending Python with C or C++ +****************************** + +It is quite easy to add new built-in modules to Python, if you know how to +program in C. Such :dfn:`extension modules` can do two things that can't be +done directly in Python: they can implement new built-in object types, and they +can call C library functions and system calls. + +To support extensions, the Python API (Application Programmers Interface) +defines a set of functions, macros and variables that provide access to most +aspects of the Python run-time system. The Python API is incorporated in a C +source file by including the header ``"Python.h"``. + +The compilation of an extension module depends on its intended use as well as on +your system setup; details are given in later chapters. + + +.. _extending-simpleexample: + +A Simple Example +================ + +Let's create an extension module called ``spam`` (the favorite food of Monty +Python fans...) and let's say we want to create a Python interface to the C +library function :cfunc:`system`. [#]_ This function takes a null-terminated +character string as argument and returns an integer. We want this function to +be callable from Python as follows:: + + >>> import spam + >>> status = spam.system("ls -l") + +Begin by creating a file :file:`spammodule.c`. (Historically, if a module is +called ``spam``, the C file containing its implementation is called +:file:`spammodule.c`; if the module name is very long, like ``spammify``, the +module name can be just :file:`spammify.c`.) + +The first line of our file can be:: + + #include + +which pulls in the Python API (you can add a comment describing the purpose of +the module and a copyright notice if you like). + +.. warning:: + + Since Python may define some pre-processor definitions which affect the standard + headers on some systems, you *must* include :file:`Python.h` before any standard + headers are included. + +All user-visible symbols defined by :file:`Python.h` have a prefix of ``Py`` or +``PY``, except those defined in standard header files. For convenience, and +since they are used extensively by the Python interpreter, ``"Python.h"`` +includes a few standard header files: ````, ````, +````, and ````. If the latter header file does not exist on +your system, it declares the functions :cfunc:`malloc`, :cfunc:`free` and +:cfunc:`realloc` directly. + +The next thing we add to our module file is the C function that will be called +when the Python expression ``spam.system(string)`` is evaluated (we'll see +shortly how it ends up being called):: + + static PyObject * + spam_system(PyObject *self, PyObject *args) + { + const char *command; + int sts; + + if (!PyArg_ParseTuple(args, "s", &command)) + return NULL; + sts = system(command); + return Py_BuildValue("i", sts); + } + +There is a straightforward translation from the argument list in Python (for +example, the single expression ``"ls -l"``) to the arguments passed to the C +function. The C function always has two arguments, conventionally named *self* +and *args*. + +The *self* argument is only used when the C function implements a built-in +method, not a function. In the example, *self* will always be a *NULL* pointer, +since we are defining a function, not a method. (This is done so that the +interpreter doesn't have to understand two different types of C functions.) + +The *args* argument will be a pointer to a Python tuple object containing the +arguments. Each item of the tuple corresponds to an argument in the call's +argument list. The arguments are Python objects --- in order to do anything +with them in our C function we have to convert them to C values. The function +:cfunc:`PyArg_ParseTuple` in the Python API checks the argument types and +converts them to C values. It uses a template string to determine the required +types of the arguments as well as the types of the C variables into which to +store the converted values. More about this later. + +:cfunc:`PyArg_ParseTuple` returns true (nonzero) if all arguments have the right +type and its components have been stored in the variables whose addresses are +passed. It returns false (zero) if an invalid argument list was passed. In the +latter case it also raises an appropriate exception so the calling function can +return *NULL* immediately (as we saw in the example). + + +.. _extending-errors: + +Intermezzo: Errors and Exceptions +================================= + +An important convention throughout the Python interpreter is the following: when +a function fails, it should set an exception condition and return an error value +(usually a *NULL* pointer). Exceptions are stored in a static global variable +inside the interpreter; if this variable is *NULL* no exception has occurred. A +second global variable stores the "associated value" of the exception (the +second argument to :keyword:`raise`). A third variable contains the stack +traceback in case the error originated in Python code. These three variables +are the C equivalents of the result in Python of :meth:`sys.exc_info` (see the +section on module :mod:`sys` in the Python Library Reference). It is important +to know about them to understand how errors are passed around. + +The Python API defines a number of functions to set various types of exceptions. + +The most common one is :cfunc:`PyErr_SetString`. Its arguments are an exception +object and a C string. The exception object is usually a predefined object like +:cdata:`PyExc_ZeroDivisionError`. The C string indicates the cause of the error +and is converted to a Python string object and stored as the "associated value" +of the exception. + +Another useful function is :cfunc:`PyErr_SetFromErrno`, which only takes an +exception argument and constructs the associated value by inspection of the +global variable :cdata:`errno`. The most general function is +:cfunc:`PyErr_SetObject`, which takes two object arguments, the exception and +its associated value. You don't need to :cfunc:`Py_INCREF` the objects passed +to any of these functions. + +You can test non-destructively whether an exception has been set with +:cfunc:`PyErr_Occurred`. This returns the current exception object, or *NULL* +if no exception has occurred. You normally don't need to call +:cfunc:`PyErr_Occurred` to see whether an error occurred in a function call, +since you should be able to tell from the return value. + +When a function *f* that calls another function *g* detects that the latter +fails, *f* should itself return an error value (usually *NULL* or ``-1``). It +should *not* call one of the :cfunc:`PyErr_\*` functions --- one has already +been called by *g*. *f*'s caller is then supposed to also return an error +indication to *its* caller, again *without* calling :cfunc:`PyErr_\*`, and so on +--- the most detailed cause of the error was already reported by the function +that first detected it. Once the error reaches the Python interpreter's main +loop, this aborts the currently executing Python code and tries to find an +exception handler specified by the Python programmer. + +(There are situations where a module can actually give a more detailed error +message by calling another :cfunc:`PyErr_\*` function, and in such cases it is +fine to do so. As a general rule, however, this is not necessary, and can cause +information about the cause of the error to be lost: most operations can fail +for a variety of reasons.) + +To ignore an exception set by a function call that failed, the exception +condition must be cleared explicitly by calling :cfunc:`PyErr_Clear`. The only +time C code should call :cfunc:`PyErr_Clear` is if it doesn't want to pass the +error on to the interpreter but wants to handle it completely by itself +(possibly by trying something else, or pretending nothing went wrong). + +Every failing :cfunc:`malloc` call must be turned into an exception --- the +direct caller of :cfunc:`malloc` (or :cfunc:`realloc`) must call +:cfunc:`PyErr_NoMemory` and return a failure indicator itself. All the +object-creating functions (for example, :cfunc:`PyInt_FromLong`) already do +this, so this note is only relevant to those who call :cfunc:`malloc` directly. + +Also note that, with the important exception of :cfunc:`PyArg_ParseTuple` and +friends, functions that return an integer status usually return a positive value +or zero for success and ``-1`` for failure, like Unix system calls. + +Finally, be careful to clean up garbage (by making :cfunc:`Py_XDECREF` or +:cfunc:`Py_DECREF` calls for objects you have already created) when you return +an error indicator! + +The choice of which exception to raise is entirely yours. There are predeclared +C objects corresponding to all built-in Python exceptions, such as +:cdata:`PyExc_ZeroDivisionError`, which you can use directly. Of course, you +should choose exceptions wisely --- don't use :cdata:`PyExc_TypeError` to mean +that a file couldn't be opened (that should probably be :cdata:`PyExc_IOError`). +If something's wrong with the argument list, the :cfunc:`PyArg_ParseTuple` +function usually raises :cdata:`PyExc_TypeError`. If you have an argument whose +value must be in a particular range or must satisfy other conditions, +:cdata:`PyExc_ValueError` is appropriate. + +You can also define a new exception that is unique to your module. For this, you +usually declare a static object variable at the beginning of your file:: + + static PyObject *SpamError; + +and initialize it in your module's initialization function (:cfunc:`initspam`) +with an exception object (leaving out the error checking for now):: + + PyMODINIT_FUNC + initspam(void) + { + PyObject *m; + + m = Py_InitModule("spam", SpamMethods); + if (m == NULL) + return; + + SpamError = PyErr_NewException("spam.error", NULL, NULL); + Py_INCREF(SpamError); + PyModule_AddObject(m, "error", SpamError); + } + +Note that the Python name for the exception object is :exc:`spam.error`. The +:cfunc:`PyErr_NewException` function may create a class with the base class +being :exc:`Exception` (unless another class is passed in instead of *NULL*), +described in :ref:`bltin-exceptions`. + +Note also that the :cdata:`SpamError` variable retains a reference to the newly +created exception class; this is intentional! Since the exception could be +removed from the module by external code, an owned reference to the class is +needed to ensure that it will not be discarded, causing :cdata:`SpamError` to +become a dangling pointer. Should it become a dangling pointer, C code which +raises the exception could cause a core dump or other unintended side effects. + +We discuss the use of PyMODINIT_FUNC as a function return type later in this +sample. + + +.. _backtoexample: + +Back to the Example +=================== + +Going back to our example function, you should now be able to understand this +statement:: + + if (!PyArg_ParseTuple(args, "s", &command)) + return NULL; + +It returns *NULL* (the error indicator for functions returning object pointers) +if an error is detected in the argument list, relying on the exception set by +:cfunc:`PyArg_ParseTuple`. Otherwise the string value of the argument has been +copied to the local variable :cdata:`command`. This is a pointer assignment and +you are not supposed to modify the string to which it points (so in Standard C, +the variable :cdata:`command` should properly be declared as ``const char +*command``). + +The next statement is a call to the Unix function :cfunc:`system`, passing it +the string we just got from :cfunc:`PyArg_ParseTuple`:: + + sts = system(command); + +Our :func:`spam.system` function must return the value of :cdata:`sts` as a +Python object. This is done using the function :cfunc:`Py_BuildValue`, which is +something like the inverse of :cfunc:`PyArg_ParseTuple`: it takes a format +string and an arbitrary number of C values, and returns a new Python object. +More info on :cfunc:`Py_BuildValue` is given later. :: + + return Py_BuildValue("i", sts); + +In this case, it will return an integer object. (Yes, even integers are objects +on the heap in Python!) + +If you have a C function that returns no useful argument (a function returning +:ctype:`void`), the corresponding Python function must return ``None``. You +need this idiom to do so (which is implemented by the :cmacro:`Py_RETURN_NONE` +macro):: + + Py_INCREF(Py_None); + return Py_None; + +:cdata:`Py_None` is the C name for the special Python object ``None``. It is a +genuine Python object rather than a *NULL* pointer, which means "error" in most +contexts, as we have seen. + + +.. _methodtable: + +The Module's Method Table and Initialization Function +===================================================== + +I promised to show how :cfunc:`spam_system` is called from Python programs. +First, we need to list its name and address in a "method table":: + + static PyMethodDef SpamMethods[] = { + ... + {"system", spam_system, METH_VARARGS, + "Execute a shell command."}, + ... + {NULL, NULL, 0, NULL} /* Sentinel */ + }; + +Note the third entry (``METH_VARARGS``). This is a flag telling the interpreter +the calling convention to be used for the C function. It should normally always +be ``METH_VARARGS`` or ``METH_VARARGS | METH_KEYWORDS``; a value of ``0`` means +that an obsolete variant of :cfunc:`PyArg_ParseTuple` is used. + +When using only ``METH_VARARGS``, the function should expect the Python-level +parameters to be passed in as a tuple acceptable for parsing via +:cfunc:`PyArg_ParseTuple`; more information on this function is provided below. + +The :const:`METH_KEYWORDS` bit may be set in the third field if keyword +arguments should be passed to the function. In this case, the C function should +accept a third ``PyObject *`` parameter which will be a dictionary of keywords. +Use :cfunc:`PyArg_ParseTupleAndKeywords` to parse the arguments to such a +function. + +The method table must be passed to the interpreter in the module's +initialization function. The initialization function must be named +:cfunc:`initname`, where *name* is the name of the module, and should be the +only non-\ :keyword:`static` item defined in the module file:: + + PyMODINIT_FUNC + initspam(void) + { + (void) Py_InitModule("spam", SpamMethods); + } + +Note that PyMODINIT_FUNC declares the function as ``void`` return type, +declares any special linkage declarations required by the platform, and for C++ +declares the function as ``extern "C"``. + +When the Python program imports module :mod:`spam` for the first time, +:cfunc:`initspam` is called. (See below for comments about embedding Python.) +It calls :cfunc:`Py_InitModule`, which creates a "module object" (which is +inserted in the dictionary ``sys.modules`` under the key ``"spam"``), and +inserts built-in function objects into the newly created module based upon the +table (an array of :ctype:`PyMethodDef` structures) that was passed as its +second argument. :cfunc:`Py_InitModule` returns a pointer to the module object +that it creates (which is unused here). It may abort with a fatal error for +certain errors, or return *NULL* if the module could not be initialized +satisfactorily. + +When embedding Python, the :cfunc:`initspam` function is not called +automatically unless there's an entry in the :cdata:`_PyImport_Inittab` table. +The easiest way to handle this is to statically initialize your +statically-linked modules by directly calling :cfunc:`initspam` after the call +to :cfunc:`Py_Initialize`:: + + int + main(int argc, char *argv[]) + { + /* Pass argv[0] to the Python interpreter */ + Py_SetProgramName(argv[0]); + + /* Initialize the Python interpreter. Required. */ + Py_Initialize(); + + /* Add a static module */ + initspam(); + +An example may be found in the file :file:`Demo/embed/demo.c` in the Python +source distribution. + +.. note:: + + Removing entries from ``sys.modules`` or importing compiled modules into + multiple interpreters within a process (or following a :cfunc:`fork` without an + intervening :cfunc:`exec`) can create problems for some extension modules. + Extension module authors should exercise caution when initializing internal data + structures. + +A more substantial example module is included in the Python source distribution +as :file:`Modules/xxmodule.c`. This file may be used as a template or simply +read as an example. The :program:`modulator.py` script included in the source +distribution or Windows install provides a simple graphical user interface for +declaring the functions and objects which a module should implement, and can +generate a template which can be filled in. The script lives in the +:file:`Tools/modulator/` directory; see the :file:`README` file there for more +information. + + +.. _compilation: + +Compilation and Linkage +======================= + +There are two more things to do before you can use your new extension: compiling +and linking it with the Python system. If you use dynamic loading, the details +may depend on the style of dynamic loading your system uses; see the chapters +about building extension modules (chapter :ref:`building`) and additional +information that pertains only to building on Windows (chapter +:ref:`building-on-windows`) for more information about this. + +If you can't use dynamic loading, or if you want to make your module a permanent +part of the Python interpreter, you will have to change the configuration setup +and rebuild the interpreter. Luckily, this is very simple on Unix: just place +your file (:file:`spammodule.c` for example) in the :file:`Modules/` directory +of an unpacked source distribution, add a line to the file +:file:`Modules/Setup.local` describing your file:: + + spam spammodule.o + +and rebuild the interpreter by running :program:`make` in the toplevel +directory. You can also run :program:`make` in the :file:`Modules/` +subdirectory, but then you must first rebuild :file:`Makefile` there by running +':program:`make` Makefile'. (This is necessary each time you change the +:file:`Setup` file.) + +If your module requires additional libraries to link with, these can be listed +on the line in the configuration file as well, for instance:: + + spam spammodule.o -lX11 + + +.. _callingpython: + +Calling Python Functions from C +=============================== + +So far we have concentrated on making C functions callable from Python. The +reverse is also useful: calling Python functions from C. This is especially the +case for libraries that support so-called "callback" functions. If a C +interface makes use of callbacks, the equivalent Python often needs to provide a +callback mechanism to the Python programmer; the implementation will require +calling the Python callback functions from a C callback. Other uses are also +imaginable. + +Fortunately, the Python interpreter is easily called recursively, and there is a +standard interface to call a Python function. (I won't dwell on how to call the +Python parser with a particular string as input --- if you're interested, have a +look at the implementation of the :option:`-c` command line option in +:file:`Python/pythonmain.c` from the Python source code.) + +Calling a Python function is easy. First, the Python program must somehow pass +you the Python function object. You should provide a function (or some other +interface) to do this. When this function is called, save a pointer to the +Python function object (be careful to :cfunc:`Py_INCREF` it!) in a global +variable --- or wherever you see fit. For example, the following function might +be part of a module definition:: + + static PyObject *my_callback = NULL; + + static PyObject * + my_set_callback(PyObject *dummy, PyObject *args) + { + PyObject *result = NULL; + PyObject *temp; + + if (PyArg_ParseTuple(args, "O:set_callback", &temp)) { + if (!PyCallable_Check(temp)) { + PyErr_SetString(PyExc_TypeError, "parameter must be callable"); + return NULL; + } + Py_XINCREF(temp); /* Add a reference to new callback */ + Py_XDECREF(my_callback); /* Dispose of previous callback */ + my_callback = temp; /* Remember new callback */ + /* Boilerplate to return "None" */ + Py_INCREF(Py_None); + result = Py_None; + } + return result; + } + +This function must be registered with the interpreter using the +:const:`METH_VARARGS` flag; this is described in section :ref:`methodtable`. The +:cfunc:`PyArg_ParseTuple` function and its arguments are documented in section +:ref:`parsetuple`. + +The macros :cfunc:`Py_XINCREF` and :cfunc:`Py_XDECREF` increment/decrement the +reference count of an object and are safe in the presence of *NULL* pointers +(but note that *temp* will not be *NULL* in this context). More info on them +in section :ref:`refcounts`. + +.. index:: single: PyEval_CallObject() + +Later, when it is time to call the function, you call the C function +:cfunc:`PyEval_CallObject`. This function has two arguments, both pointers to +arbitrary Python objects: the Python function, and the argument list. The +argument list must always be a tuple object, whose length is the number of +arguments. To call the Python function with no arguments, pass an empty tuple; +to call it with one argument, pass a singleton tuple. :cfunc:`Py_BuildValue` +returns a tuple when its format string consists of zero or more format codes +between parentheses. For example:: + + int arg; + PyObject *arglist; + PyObject *result; + ... + arg = 123; + ... + /* Time to call the callback */ + arglist = Py_BuildValue("(i)", arg); + result = PyEval_CallObject(my_callback, arglist); + Py_DECREF(arglist); + +:cfunc:`PyEval_CallObject` returns a Python object pointer: this is the return +value of the Python function. :cfunc:`PyEval_CallObject` is +"reference-count-neutral" with respect to its arguments. In the example a new +tuple was created to serve as the argument list, which is :cfunc:`Py_DECREF`\ +-ed immediately after the call. + +The return value of :cfunc:`PyEval_CallObject` is "new": either it is a brand +new object, or it is an existing object whose reference count has been +incremented. So, unless you want to save it in a global variable, you should +somehow :cfunc:`Py_DECREF` the result, even (especially!) if you are not +interested in its value. + +Before you do this, however, it is important to check that the return value +isn't *NULL*. If it is, the Python function terminated by raising an exception. +If the C code that called :cfunc:`PyEval_CallObject` is called from Python, it +should now return an error indication to its Python caller, so the interpreter +can print a stack trace, or the calling Python code can handle the exception. +If this is not possible or desirable, the exception should be cleared by calling +:cfunc:`PyErr_Clear`. For example:: + + if (result == NULL) + return NULL; /* Pass error back */ + ...use result... + Py_DECREF(result); + +Depending on the desired interface to the Python callback function, you may also +have to provide an argument list to :cfunc:`PyEval_CallObject`. In some cases +the argument list is also provided by the Python program, through the same +interface that specified the callback function. It can then be saved and used +in the same manner as the function object. In other cases, you may have to +construct a new tuple to pass as the argument list. The simplest way to do this +is to call :cfunc:`Py_BuildValue`. For example, if you want to pass an integral +event code, you might use the following code:: + + PyObject *arglist; + ... + arglist = Py_BuildValue("(l)", eventcode); + result = PyEval_CallObject(my_callback, arglist); + Py_DECREF(arglist); + if (result == NULL) + return NULL; /* Pass error back */ + /* Here maybe use the result */ + Py_DECREF(result); + +Note the placement of ``Py_DECREF(arglist)`` immediately after the call, before +the error check! Also note that strictly spoken this code is not complete: +:cfunc:`Py_BuildValue` may run out of memory, and this should be checked. + + +.. _parsetuple: + +Extracting Parameters in Extension Functions +============================================ + +.. index:: single: PyArg_ParseTuple() + +The :cfunc:`PyArg_ParseTuple` function is declared as follows:: + + int PyArg_ParseTuple(PyObject *arg, char *format, ...); + +The *arg* argument must be a tuple object containing an argument list passed +from Python to a C function. The *format* argument must be a format string, +whose syntax is explained in :ref:`arg-parsing` in the Python/C API Reference +Manual. The remaining arguments must be addresses of variables whose type is +determined by the format string. + +Note that while :cfunc:`PyArg_ParseTuple` checks that the Python arguments have +the required types, it cannot check the validity of the addresses of C variables +passed to the call: if you make mistakes there, your code will probably crash or +at least overwrite random bits in memory. So be careful! + +Note that any Python object references which are provided to the caller are +*borrowed* references; do not decrement their reference count! + +Some example calls:: + + int ok; + int i, j; + long k, l; + const char *s; + int size; + + ok = PyArg_ParseTuple(args, ""); /* No arguments */ + /* Python call: f() */ + +:: + + ok = PyArg_ParseTuple(args, "s", &s); /* A string */ + /* Possible Python call: f('whoops!') */ + +:: + + ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */ + /* Possible Python call: f(1, 2, 'three') */ + +:: + + ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size); + /* A pair of ints and a string, whose size is also returned */ + /* Possible Python call: f((1, 2), 'three') */ + +:: + + { + const char *file; + const char *mode = "r"; + int bufsize = 0; + ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize); + /* A string, and optionally another string and an integer */ + /* Possible Python calls: + f('spam') + f('spam', 'w') + f('spam', 'wb', 100000) */ + } + +:: + + { + int left, top, right, bottom, h, v; + ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)", + &left, &top, &right, &bottom, &h, &v); + /* A rectangle and a point */ + /* Possible Python call: + f(((0, 0), (400, 300)), (10, 10)) */ + } + +:: + + { + Py_complex c; + ok = PyArg_ParseTuple(args, "D:myfunction", &c); + /* a complex, also providing a function name for errors */ + /* Possible Python call: myfunction(1+2j) */ + } + + +.. _parsetupleandkeywords: + +Keyword Parameters for Extension Functions +========================================== + +.. index:: single: PyArg_ParseTupleAndKeywords() + +The :cfunc:`PyArg_ParseTupleAndKeywords` function is declared as follows:: + + int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, + char *format, char *kwlist[], ...); + +The *arg* and *format* parameters are identical to those of the +:cfunc:`PyArg_ParseTuple` function. The *kwdict* parameter is the dictionary of +keywords received as the third parameter from the Python runtime. The *kwlist* +parameter is a *NULL*-terminated list of strings which identify the parameters; +the names are matched with the type information from *format* from left to +right. On success, :cfunc:`PyArg_ParseTupleAndKeywords` returns true, otherwise +it returns false and raises an appropriate exception. + +.. note:: + + Nested tuples cannot be parsed when using keyword arguments! Keyword parameters + passed in which are not present in the *kwlist* will cause :exc:`TypeError` to + be raised. + +.. index:: single: Philbrick, Geoff + +Here is an example module which uses keywords, based on an example by Geoff +Philbrick (philbrick@hks.com): + +.. % + +:: + + #include "Python.h" + + static PyObject * + keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds) + { + int voltage; + char *state = "a stiff"; + char *action = "voom"; + char *type = "Norwegian Blue"; + + static char *kwlist[] = {"voltage", "state", "action", "type", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist, + &voltage, &state, &action, &type)) + return NULL; + + printf("-- This parrot wouldn't %s if you put %i Volts through it.\n", + action, voltage); + printf("-- Lovely plumage, the %s -- It's %s!\n", type, state); + + Py_INCREF(Py_None); + + return Py_None; + } + + static PyMethodDef keywdarg_methods[] = { + /* The cast of the function is necessary since PyCFunction values + * only take two PyObject* parameters, and keywdarg_parrot() takes + * three. + */ + {"parrot", (PyCFunction)keywdarg_parrot, METH_VARARGS | METH_KEYWORDS, + "Print a lovely skit to standard output."}, + {NULL, NULL, 0, NULL} /* sentinel */ + }; + +:: + + void + initkeywdarg(void) + { + /* Create the module and add the functions */ + Py_InitModule("keywdarg", keywdarg_methods); + } + + +.. _buildvalue: + +Building Arbitrary Values +========================= + +This function is the counterpart to :cfunc:`PyArg_ParseTuple`. It is declared +as follows:: + + PyObject *Py_BuildValue(char *format, ...); + +It recognizes a set of format units similar to the ones recognized by +:cfunc:`PyArg_ParseTuple`, but the arguments (which are input to the function, +not output) must not be pointers, just values. It returns a new Python object, +suitable for returning from a C function called from Python. + +One difference with :cfunc:`PyArg_ParseTuple`: while the latter requires its +first argument to be a tuple (since Python argument lists are always represented +as tuples internally), :cfunc:`Py_BuildValue` does not always build a tuple. It +builds a tuple only if its format string contains two or more format units. If +the format string is empty, it returns ``None``; if it contains exactly one +format unit, it returns whatever object is described by that format unit. To +force it to return a tuple of size 0 or one, parenthesize the format string. + +Examples (to the left the call, to the right the resulting Python value):: + + Py_BuildValue("") None + Py_BuildValue("i", 123) 123 + Py_BuildValue("iii", 123, 456, 789) (123, 456, 789) + Py_BuildValue("s", "hello") 'hello' + Py_BuildValue("y", "hello") b'hello' + Py_BuildValue("ss", "hello", "world") ('hello', 'world') + Py_BuildValue("s#", "hello", 4) 'hell' + Py_BuildValue("y#", "hello", 4) b'hell' + Py_BuildValue("()") () + Py_BuildValue("(i)", 123) (123,) + Py_BuildValue("(ii)", 123, 456) (123, 456) + Py_BuildValue("(i,i)", 123, 456) (123, 456) + Py_BuildValue("[i,i]", 123, 456) [123, 456] + Py_BuildValue("{s:i,s:i}", + "abc", 123, "def", 456) {'abc': 123, 'def': 456} + Py_BuildValue("((ii)(ii)) (ii)", + 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6)) + + +.. _refcounts: + +Reference Counts +================ + +In languages like C or C++, the programmer is responsible for dynamic allocation +and deallocation of memory on the heap. In C, this is done using the functions +:cfunc:`malloc` and :cfunc:`free`. In C++, the operators :keyword:`new` and +:keyword:`delete` are used with essentially the same meaning and we'll restrict +the following discussion to the C case. + +Every block of memory allocated with :cfunc:`malloc` should eventually be +returned to the pool of available memory by exactly one call to :cfunc:`free`. +It is important to call :cfunc:`free` at the right time. If a block's address +is forgotten but :cfunc:`free` is not called for it, the memory it occupies +cannot be reused until the program terminates. This is called a :dfn:`memory +leak`. On the other hand, if a program calls :cfunc:`free` for a block and then +continues to use the block, it creates a conflict with re-use of the block +through another :cfunc:`malloc` call. This is called :dfn:`using freed memory`. +It has the same bad consequences as referencing uninitialized data --- core +dumps, wrong results, mysterious crashes. + +Common causes of memory leaks are unusual paths through the code. For instance, +a function may allocate a block of memory, do some calculation, and then free +the block again. Now a change in the requirements for the function may add a +test to the calculation that detects an error condition and can return +prematurely from the function. It's easy to forget to free the allocated memory +block when taking this premature exit, especially when it is added later to the +code. Such leaks, once introduced, often go undetected for a long time: the +error exit is taken only in a small fraction of all calls, and most modern +machines have plenty of virtual memory, so the leak only becomes apparent in a +long-running process that uses the leaking function frequently. Therefore, it's +important to prevent leaks from happening by having a coding convention or +strategy that minimizes this kind of errors. + +Since Python makes heavy use of :cfunc:`malloc` and :cfunc:`free`, it needs a +strategy to avoid memory leaks as well as the use of freed memory. The chosen +method is called :dfn:`reference counting`. The principle is simple: every +object contains a counter, which is incremented when a reference to the object +is stored somewhere, and which is decremented when a reference to it is deleted. +When the counter reaches zero, the last reference to the object has been deleted +and the object is freed. + +An alternative strategy is called :dfn:`automatic garbage collection`. +(Sometimes, reference counting is also referred to as a garbage collection +strategy, hence my use of "automatic" to distinguish the two.) The big +advantage of automatic garbage collection is that the user doesn't need to call +:cfunc:`free` explicitly. (Another claimed advantage is an improvement in speed +or memory usage --- this is no hard fact however.) The disadvantage is that for +C, there is no truly portable automatic garbage collector, while reference +counting can be implemented portably (as long as the functions :cfunc:`malloc` +and :cfunc:`free` are available --- which the C Standard guarantees). Maybe some +day a sufficiently portable automatic garbage collector will be available for C. +Until then, we'll have to live with reference counts. + +While Python uses the traditional reference counting implementation, it also +offers a cycle detector that works to detect reference cycles. This allows +applications to not worry about creating direct or indirect circular references; +these are the weakness of garbage collection implemented using only reference +counting. Reference cycles consist of objects which contain (possibly indirect) +references to themselves, so that each object in the cycle has a reference count +which is non-zero. Typical reference counting implementations are not able to +reclaim the memory belonging to any objects in a reference cycle, or referenced +from the objects in the cycle, even though there are no further references to +the cycle itself. + +The cycle detector is able to detect garbage cycles and can reclaim them so long +as there are no finalizers implemented in Python (:meth:`__del__` methods). +When there are such finalizers, the detector exposes the cycles through the +:mod:`gc` module (specifically, the +``garbage`` variable in that module). The :mod:`gc` module also exposes a way +to run the detector (the :func:`collect` function), as well as configuration +interfaces and the ability to disable the detector at runtime. The cycle +detector is considered an optional component; though it is included by default, +it can be disabled at build time using the :option:`--without-cycle-gc` option +to the :program:`configure` script on Unix platforms (including Mac OS X) or by +removing the definition of ``WITH_CYCLE_GC`` in the :file:`pyconfig.h` header on +other platforms. If the cycle detector is disabled in this way, the :mod:`gc` +module will not be available. + + +.. _refcountsinpython: + +Reference Counting in Python +---------------------------- + +There are two macros, ``Py_INCREF(x)`` and ``Py_DECREF(x)``, which handle the +incrementing and decrementing of the reference count. :cfunc:`Py_DECREF` also +frees the object when the count reaches zero. For flexibility, it doesn't call +:cfunc:`free` directly --- rather, it makes a call through a function pointer in +the object's :dfn:`type object`. For this purpose (and others), every object +also contains a pointer to its type object. + +The big question now remains: when to use ``Py_INCREF(x)`` and ``Py_DECREF(x)``? +Let's first introduce some terms. Nobody "owns" an object; however, you can +:dfn:`own a reference` to an object. An object's reference count is now defined +as the number of owned references to it. The owner of a reference is +responsible for calling :cfunc:`Py_DECREF` when the reference is no longer +needed. Ownership of a reference can be transferred. There are three ways to +dispose of an owned reference: pass it on, store it, or call :cfunc:`Py_DECREF`. +Forgetting to dispose of an owned reference creates a memory leak. + +It is also possible to :dfn:`borrow` [#]_ a reference to an object. The +borrower of a reference should not call :cfunc:`Py_DECREF`. The borrower must +not hold on to the object longer than the owner from which it was borrowed. +Using a borrowed reference after the owner has disposed of it risks using freed +memory and should be avoided completely. [#]_ + +The advantage of borrowing over owning a reference is that you don't need to +take care of disposing of the reference on all possible paths through the code +--- in other words, with a borrowed reference you don't run the risk of leaking +when a premature exit is taken. The disadvantage of borrowing over leaking is +that there are some subtle situations where in seemingly correct code a borrowed +reference can be used after the owner from which it was borrowed has in fact +disposed of it. + +A borrowed reference can be changed into an owned reference by calling +:cfunc:`Py_INCREF`. This does not affect the status of the owner from which the +reference was borrowed --- it creates a new owned reference, and gives full +owner responsibilities (the new owner must dispose of the reference properly, as +well as the previous owner). + + +.. _ownershiprules: + +Ownership Rules +--------------- + +Whenever an object reference is passed into or out of a function, it is part of +the function's interface specification whether ownership is transferred with the +reference or not. + +Most functions that return a reference to an object pass on ownership with the +reference. In particular, all functions whose function it is to create a new +object, such as :cfunc:`PyInt_FromLong` and :cfunc:`Py_BuildValue`, pass +ownership to the receiver. Even if the object is not actually new, you still +receive ownership of a new reference to that object. For instance, +:cfunc:`PyInt_FromLong` maintains a cache of popular values and can return a +reference to a cached item. + +Many functions that extract objects from other objects also transfer ownership +with the reference, for instance :cfunc:`PyObject_GetAttrString`. The picture +is less clear, here, however, since a few common routines are exceptions: +:cfunc:`PyTuple_GetItem`, :cfunc:`PyList_GetItem`, :cfunc:`PyDict_GetItem`, and +:cfunc:`PyDict_GetItemString` all return references that you borrow from the +tuple, list or dictionary. + +The function :cfunc:`PyImport_AddModule` also returns a borrowed reference, even +though it may actually create the object it returns: this is possible because an +owned reference to the object is stored in ``sys.modules``. + +When you pass an object reference into another function, in general, the +function borrows the reference from you --- if it needs to store it, it will use +:cfunc:`Py_INCREF` to become an independent owner. There are exactly two +important exceptions to this rule: :cfunc:`PyTuple_SetItem` and +:cfunc:`PyList_SetItem`. These functions take over ownership of the item passed +to them --- even if they fail! (Note that :cfunc:`PyDict_SetItem` and friends +don't take over ownership --- they are "normal.") + +When a C function is called from Python, it borrows references to its arguments +from the caller. The caller owns a reference to the object, so the borrowed +reference's lifetime is guaranteed until the function returns. Only when such a +borrowed reference must be stored or passed on, it must be turned into an owned +reference by calling :cfunc:`Py_INCREF`. + +The object reference returned from a C function that is called from Python must +be an owned reference --- ownership is transferred from the function to its +caller. + + +.. _thinice: + +Thin Ice +-------- + +There are a few situations where seemingly harmless use of a borrowed reference +can lead to problems. These all have to do with implicit invocations of the +interpreter, which can cause the owner of a reference to dispose of it. + +The first and most important case to know about is using :cfunc:`Py_DECREF` on +an unrelated object while borrowing a reference to a list item. For instance:: + + void + bug(PyObject *list) + { + PyObject *item = PyList_GetItem(list, 0); + + PyList_SetItem(list, 1, PyInt_FromLong(0L)); + PyObject_Print(item, stdout, 0); /* BUG! */ + } + +This function first borrows a reference to ``list[0]``, then replaces +``list[1]`` with the value ``0``, and finally prints the borrowed reference. +Looks harmless, right? But it's not! + +Let's follow the control flow into :cfunc:`PyList_SetItem`. The list owns +references to all its items, so when item 1 is replaced, it has to dispose of +the original item 1. Now let's suppose the original item 1 was an instance of a +user-defined class, and let's further suppose that the class defined a +:meth:`__del__` method. If this class instance has a reference count of 1, +disposing of it will call its :meth:`__del__` method. + +Since it is written in Python, the :meth:`__del__` method can execute arbitrary +Python code. Could it perhaps do something to invalidate the reference to +``item`` in :cfunc:`bug`? You bet! Assuming that the list passed into +:cfunc:`bug` is accessible to the :meth:`__del__` method, it could execute a +statement to the effect of ``del list[0]``, and assuming this was the last +reference to that object, it would free the memory associated with it, thereby +invalidating ``item``. + +The solution, once you know the source of the problem, is easy: temporarily +increment the reference count. The correct version of the function reads:: + + void + no_bug(PyObject *list) + { + PyObject *item = PyList_GetItem(list, 0); + + Py_INCREF(item); + PyList_SetItem(list, 1, PyInt_FromLong(0L)); + PyObject_Print(item, stdout, 0); + Py_DECREF(item); + } + +This is a true story. An older version of Python contained variants of this bug +and someone spent a considerable amount of time in a C debugger to figure out +why his :meth:`__del__` methods would fail... + +The second case of problems with a borrowed reference is a variant involving +threads. Normally, multiple threads in the Python interpreter can't get in each +other's way, because there is a global lock protecting Python's entire object +space. However, it is possible to temporarily release this lock using the macro +:cmacro:`Py_BEGIN_ALLOW_THREADS`, and to re-acquire it using +:cmacro:`Py_END_ALLOW_THREADS`. This is common around blocking I/O calls, to +let other threads use the processor while waiting for the I/O to complete. +Obviously, the following function has the same problem as the previous one:: + + void + bug(PyObject *list) + { + PyObject *item = PyList_GetItem(list, 0); + Py_BEGIN_ALLOW_THREADS + ...some blocking I/O call... + Py_END_ALLOW_THREADS + PyObject_Print(item, stdout, 0); /* BUG! */ + } + + +.. _nullpointers: + +NULL Pointers +------------- + +In general, functions that take object references as arguments do not expect you +to pass them *NULL* pointers, and will dump core (or cause later core dumps) if +you do so. Functions that return object references generally return *NULL* only +to indicate that an exception occurred. The reason for not testing for *NULL* +arguments is that functions often pass the objects they receive on to other +function --- if each function were to test for *NULL*, there would be a lot of +redundant tests and the code would run more slowly. + +It is better to test for *NULL* only at the "source:" when a pointer that may be +*NULL* is received, for example, from :cfunc:`malloc` or from a function that +may raise an exception. + +The macros :cfunc:`Py_INCREF` and :cfunc:`Py_DECREF` do not check for *NULL* +pointers --- however, their variants :cfunc:`Py_XINCREF` and :cfunc:`Py_XDECREF` +do. + +The macros for checking for a particular object type (``Pytype_Check()``) don't +check for *NULL* pointers --- again, there is much code that calls several of +these in a row to test an object against various different expected types, and +this would generate redundant tests. There are no variants with *NULL* +checking. + +The C function calling mechanism guarantees that the argument list passed to C +functions (``args`` in the examples) is never *NULL* --- in fact it guarantees +that it is always a tuple. [#]_ + +It is a severe error to ever let a *NULL* pointer "escape" to the Python user. + +.. % Frank Stajano: +.. % A pedagogically buggy example, along the lines of the previous listing, +.. % would be helpful here -- showing in more concrete terms what sort of +.. % actions could cause the problem. I can't very well imagine it from the +.. % description. + + +.. _cplusplus: + +Writing Extensions in C++ +========================= + +It is possible to write extension modules in C++. Some restrictions apply. If +the main program (the Python interpreter) is compiled and linked by the C +compiler, global or static objects with constructors cannot be used. This is +not a problem if the main program is linked by the C++ compiler. Functions that +will be called by the Python interpreter (in particular, module initialization +functions) have to be declared using ``extern "C"``. It is unnecessary to +enclose the Python header files in ``extern "C" {...}`` --- they use this form +already if the symbol ``__cplusplus`` is defined (all recent C++ compilers +define this symbol). + + +.. _using-cobjects: + +Providing a C API for an Extension Module +========================================= + +.. sectionauthor:: Konrad Hinsen + + +Many extension modules just provide new functions and types to be used from +Python, but sometimes the code in an extension module can be useful for other +extension modules. For example, an extension module could implement a type +"collection" which works like lists without order. Just like the standard Python +list type has a C API which permits extension modules to create and manipulate +lists, this new collection type should have a set of C functions for direct +manipulation from other extension modules. + +At first sight this seems easy: just write the functions (without declaring them +:keyword:`static`, of course), provide an appropriate header file, and document +the C API. And in fact this would work if all extension modules were always +linked statically with the Python interpreter. When modules are used as shared +libraries, however, the symbols defined in one module may not be visible to +another module. The details of visibility depend on the operating system; some +systems use one global namespace for the Python interpreter and all extension +modules (Windows, for example), whereas others require an explicit list of +imported symbols at module link time (AIX is one example), or offer a choice of +different strategies (most Unices). And even if symbols are globally visible, +the module whose functions one wishes to call might not have been loaded yet! + +Portability therefore requires not to make any assumptions about symbol +visibility. This means that all symbols in extension modules should be declared +:keyword:`static`, except for the module's initialization function, in order to +avoid name clashes with other extension modules (as discussed in section +:ref:`methodtable`). And it means that symbols that *should* be accessible from +other extension modules must be exported in a different way. + +Python provides a special mechanism to pass C-level information (pointers) from +one extension module to another one: CObjects. A CObject is a Python data type +which stores a pointer (:ctype:`void \*`). CObjects can only be created and +accessed via their C API, but they can be passed around like any other Python +object. In particular, they can be assigned to a name in an extension module's +namespace. Other extension modules can then import this module, retrieve the +value of this name, and then retrieve the pointer from the CObject. + +There are many ways in which CObjects can be used to export the C API of an +extension module. Each name could get its own CObject, or all C API pointers +could be stored in an array whose address is published in a CObject. And the +various tasks of storing and retrieving the pointers can be distributed in +different ways between the module providing the code and the client modules. + +The following example demonstrates an approach that puts most of the burden on +the writer of the exporting module, which is appropriate for commonly used +library modules. It stores all C API pointers (just one in the example!) in an +array of :ctype:`void` pointers which becomes the value of a CObject. The header +file corresponding to the module provides a macro that takes care of importing +the module and retrieving its C API pointers; client modules only have to call +this macro before accessing the C API. + +The exporting module is a modification of the :mod:`spam` module from section +:ref:`extending-simpleexample`. The function :func:`spam.system` does not call +the C library function :cfunc:`system` directly, but a function +:cfunc:`PySpam_System`, which would of course do something more complicated in +reality (such as adding "spam" to every command). This function +:cfunc:`PySpam_System` is also exported to other extension modules. + +The function :cfunc:`PySpam_System` is a plain C function, declared +:keyword:`static` like everything else:: + + static int + PySpam_System(const char *command) + { + return system(command); + } + +The function :cfunc:`spam_system` is modified in a trivial way:: + + static PyObject * + spam_system(PyObject *self, PyObject *args) + { + const char *command; + int sts; + + if (!PyArg_ParseTuple(args, "s", &command)) + return NULL; + sts = PySpam_System(command); + return Py_BuildValue("i", sts); + } + +In the beginning of the module, right after the line :: + + #include "Python.h" + +two more lines must be added:: + + #define SPAM_MODULE + #include "spammodule.h" + +The ``#define`` is used to tell the header file that it is being included in the +exporting module, not a client module. Finally, the module's initialization +function must take care of initializing the C API pointer array:: + + PyMODINIT_FUNC + initspam(void) + { + PyObject *m; + static void *PySpam_API[PySpam_API_pointers]; + PyObject *c_api_object; + + m = Py_InitModule("spam", SpamMethods); + if (m == NULL) + return; + + /* Initialize the C API pointer array */ + PySpam_API[PySpam_System_NUM] = (void *)PySpam_System; + + /* Create a CObject containing the API pointer array's address */ + c_api_object = PyCObject_FromVoidPtr((void *)PySpam_API, NULL); + + if (c_api_object != NULL) + PyModule_AddObject(m, "_C_API", c_api_object); + } + +Note that ``PySpam_API`` is declared :keyword:`static`; otherwise the pointer +array would disappear when :func:`initspam` terminates! + +The bulk of the work is in the header file :file:`spammodule.h`, which looks +like this:: + + #ifndef Py_SPAMMODULE_H + #define Py_SPAMMODULE_H + #ifdef __cplusplus + extern "C" { + #endif + + /* Header file for spammodule */ + + /* C API functions */ + #define PySpam_System_NUM 0 + #define PySpam_System_RETURN int + #define PySpam_System_PROTO (const char *command) + + /* Total number of C API pointers */ + #define PySpam_API_pointers 1 + + + #ifdef SPAM_MODULE + /* This section is used when compiling spammodule.c */ + + static PySpam_System_RETURN PySpam_System PySpam_System_PROTO; + + #else + /* This section is used in modules that use spammodule's API */ + + static void **PySpam_API; + + #define PySpam_System \ + (*(PySpam_System_RETURN (*)PySpam_System_PROTO) PySpam_API[PySpam_System_NUM]) + + /* Return -1 and set exception on error, 0 on success. */ + static int + import_spam(void) + { + PyObject *module = PyImport_ImportModule("spam"); + + if (module != NULL) { + PyObject *c_api_object = PyObject_GetAttrString(module, "_C_API"); + if (c_api_object == NULL) + return -1; + if (PyCObject_Check(c_api_object)) + PySpam_API = (void **)PyCObject_AsVoidPtr(c_api_object); + Py_DECREF(c_api_object); + } + return 0; + } + + #endif + + #ifdef __cplusplus + } + #endif + + #endif /* !defined(Py_SPAMMODULE_H) */ + +All that a client module must do in order to have access to the function +:cfunc:`PySpam_System` is to call the function (or rather macro) +:cfunc:`import_spam` in its initialization function:: + + PyMODINIT_FUNC + initclient(void) + { + PyObject *m; + + m = Py_InitModule("client", ClientMethods); + if (m == NULL) + return; + if (import_spam() < 0) + return; + /* additional initialization can happen here */ + } + +The main disadvantage of this approach is that the file :file:`spammodule.h` is +rather complicated. However, the basic structure is the same for each function +that is exported, so it has to be learned only once. + +Finally it should be mentioned that CObjects offer additional functionality, +which is especially useful for memory allocation and deallocation of the pointer +stored in a CObject. The details are described in the Python/C API Reference +Manual in the section :ref:`cobjects` and in the implementation of CObjects (files +:file:`Include/cobject.h` and :file:`Objects/cobject.c` in the Python source +code distribution). + +.. rubric:: Footnotes + +.. [#] An interface for this function already exists in the standard module :mod:`os` + --- it was chosen as a simple and straightforward example. + +.. [#] The metaphor of "borrowing" a reference is not completely correct: the owner + still has a copy of the reference. + +.. [#] Checking that the reference count is at least 1 **does not work** --- the + reference count itself could be in freed memory and may thus be reused for + another object! + +.. [#] These guarantees don't hold when you use the "old" style calling convention --- + this is still found in much existing code. + diff --git a/Doc/extending/index.rst b/Doc/extending/index.rst new file mode 100644 index 0000000..6e8cf79 --- /dev/null +++ b/Doc/extending/index.rst @@ -0,0 +1,34 @@ +.. _extending-index: + +################################################## + Extending and Embedding the Python Interpreter +################################################## + +:Release: |version| +:Date: |today| + +This document describes how to write modules in C or C++ to extend the Python +interpreter with new modules. Those modules can define new functions but also +new object types and their methods. The document also describes how to embed +the Python interpreter in another application, for use as an extension language. +Finally, it shows how to compile and link extension modules so that they can be +loaded dynamically (at run time) into the interpreter, if the underlying +operating system supports this feature. + +This document assumes basic knowledge about Python. For an informal +introduction to the language, see :ref:`tutorial-index`. :ref:`reference-index` +gives a more formal definition of the language. :ref:`library-index` documents +the existing object types, functions and modules (both built-in and written in +Python) that give the language its wide application range. + +For a detailed description of the whole Python/C API, see the separate +:ref:`c-api-index`. + +.. toctree:: + :maxdepth: 2 + + extending.rst + newtypes.rst + building.rst + windows.rst + embedding.rst diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst new file mode 100644 index 0000000..72aaf1b --- /dev/null +++ b/Doc/extending/newtypes.rst @@ -0,0 +1,1580 @@ +.. highlightlang:: c + + +.. _defining-new-types: + +****************** +Defining New Types +****************** + +.. sectionauthor:: Michael Hudson +.. sectionauthor:: Dave Kuhlman +.. sectionauthor:: Jim Fulton + + +As mentioned in the last chapter, Python allows the writer of an extension +module to define new types that can be manipulated from Python code, much like +strings and lists in core Python. + +This is not hard; the code for all extension types follows a pattern, but there +are some details that you need to understand before you can get started. + +.. note:: + + The way new types are defined changed dramatically (and for the better) in + Python 2.2. This document documents how to define new types for Python 2.2 and + later. If you need to support older versions of Python, you will need to refer + to `older versions of this documentation + `_. + + +.. _dnt-basics: + +The Basics +========== + +The Python runtime sees all Python objects as variables of type +:ctype:`PyObject\*`. A :ctype:`PyObject` is not a very magnificent object - it +just contains the refcount and a pointer to the object's "type object". This is +where the action is; the type object determines which (C) functions get called +when, for instance, an attribute gets looked up on an object or it is multiplied +by another object. These C functions are called "type methods" to distinguish +them from things like ``[].append`` (which we call "object methods"). + +So, if you want to define a new object type, you need to create a new type +object. + +This sort of thing can only be explained by example, so here's a minimal, but +complete, module that defines a new type: + +.. literalinclude:: ../includes/noddy.c + + +Now that's quite a bit to take in at once, but hopefully bits will seem familiar +from the last chapter. + +The first bit that will be new is:: + + typedef struct { + PyObject_HEAD + } noddy_NoddyObject; + +This is what a Noddy object will contain---in this case, nothing more than every +Python object contains, namely a refcount and a pointer to a type object. These +are the fields the ``PyObject_HEAD`` macro brings in. The reason for the macro +is to standardize the layout and to enable special debugging fields in debug +builds. Note that there is no semicolon after the ``PyObject_HEAD`` macro; one +is included in the macro definition. Be wary of adding one by accident; it's +easy to do from habit, and your compiler might not complain, but someone else's +probably will! (On Windows, MSVC is known to call this an error and refuse to +compile the code.) + +For contrast, let's take a look at the corresponding definition for standard +Python integers:: + + typedef struct { + PyObject_HEAD + long ob_ival; + } PyIntObject; + +Moving on, we come to the crunch --- the type object. :: + + static PyTypeObject noddy_NoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "noddy.Noddy", /*tp_name*/ + sizeof(noddy_NoddyObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + "Noddy objects", /* tp_doc */ + }; + +Now if you go and look up the definition of :ctype:`PyTypeObject` in +:file:`object.h` you'll see that it has many more fields that the definition +above. The remaining fields will be filled with zeros by the C compiler, and +it's common practice to not specify them explicitly unless you need them. + +This is so important that we're going to pick the top of it apart still +further:: + + PyObject_HEAD_INIT(NULL) + +This line is a bit of a wart; what we'd like to write is:: + + PyObject_HEAD_INIT(&PyType_Type) + +as the type of a type object is "type", but this isn't strictly conforming C and +some compilers complain. Fortunately, this member will be filled in for us by +:cfunc:`PyType_Ready`. :: + + 0, /* ob_size */ + +The :attr:`ob_size` field of the header is not used; its presence in the type +structure is a historical artifact that is maintained for binary compatibility +with extension modules compiled for older versions of Python. Always set this +field to zero. :: + + "noddy.Noddy", /* tp_name */ + +The name of our type. This will appear in the default textual representation of +our objects and in some error messages, for example:: + + >>> "" + noddy.new_noddy() + Traceback (most recent call last): + File "", line 1, in ? + TypeError: cannot add type "noddy.Noddy" to string + +Note that the name is a dotted name that includes both the module name and the +name of the type within the module. The module in this case is :mod:`noddy` and +the type is :class:`Noddy`, so we set the type name to :class:`noddy.Noddy`. :: + + sizeof(noddy_NoddyObject), /* tp_basicsize */ + +This is so that Python knows how much memory to allocate when you call +:cfunc:`PyObject_New`. + +.. note:: + + If you want your type to be subclassable from Python, and your type has the same + :attr:`tp_basicsize` as its base type, you may have problems with multiple + inheritance. A Python subclass of your type will have to list your type first + in its :attr:`__bases__`, or else it will not be able to call your type's + :meth:`__new__` method without getting an error. You can avoid this problem by + ensuring that your type has a larger value for :attr:`tp_basicsize` than its + base type does. Most of the time, this will be true anyway, because either your + base type will be :class:`object`, or else you will be adding data members to + your base type, and therefore increasing its size. + +:: + + 0, /* tp_itemsize */ + +This has to do with variable length objects like lists and strings. Ignore this +for now. + +Skipping a number of type methods that we don't provide, we set the class flags +to :const:`Py_TPFLAGS_DEFAULT`. :: + + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + +All types should include this constant in their flags. It enables all of the +members defined by the current version of Python. + +We provide a doc string for the type in :attr:`tp_doc`. :: + + "Noddy objects", /* tp_doc */ + +Now we get into the type methods, the things that make your objects different +from the others. We aren't going to implement any of these in this version of +the module. We'll expand this example later to have more interesting behavior. + +For now, all we want to be able to do is to create new :class:`Noddy` objects. +To enable object creation, we have to provide a :attr:`tp_new` implementation. +In this case, we can just use the default implementation provided by the API +function :cfunc:`PyType_GenericNew`. We'd like to just assign this to the +:attr:`tp_new` slot, but we can't, for portability sake, On some platforms or +compilers, we can't statically initialize a structure member with a function +defined in another C module, so, instead, we'll assign the :attr:`tp_new` slot +in the module initialization function just before calling +:cfunc:`PyType_Ready`:: + + noddy_NoddyType.tp_new = PyType_GenericNew; + if (PyType_Ready(&noddy_NoddyType) < 0) + return; + +All the other type methods are *NULL*, so we'll go over them later --- that's +for a later section! + +Everything else in the file should be familiar, except for some code in +:cfunc:`initnoddy`:: + + if (PyType_Ready(&noddy_NoddyType) < 0) + return; + +This initializes the :class:`Noddy` type, filing in a number of members, +including :attr:`ob_type` that we initially set to *NULL*. :: + + PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType); + +This adds the type to the module dictionary. This allows us to create +:class:`Noddy` instances by calling the :class:`Noddy` class:: + + >>> import noddy + >>> mynoddy = noddy.Noddy() + +That's it! All that remains is to build it; put the above code in a file called +:file:`noddy.c` and :: + + from distutils.core import setup, Extension + setup(name="noddy", version="1.0", + ext_modules=[Extension("noddy", ["noddy.c"])]) + +in a file called :file:`setup.py`; then typing :: + + $ python setup.py build + +at a shell should produce a file :file:`noddy.so` in a subdirectory; move to +that directory and fire up Python --- you should be able to ``import noddy`` and +play around with Noddy objects. + +.. % $ <-- bow to font-lock ;-( + +That wasn't so hard, was it? + +Of course, the current Noddy type is pretty uninteresting. It has no data and +doesn't do anything. It can't even be subclassed. + + +Adding data and methods to the Basic example +-------------------------------------------- + +Let's expend the basic example to add some data and methods. Let's also make +the type usable as a base class. We'll create a new module, :mod:`noddy2` that +adds these capabilities: + +.. literalinclude:: ../includes/noddy2.c + + +This version of the module has a number of changes. + +We've added an extra include:: + + #include "structmember.h" + +This include provides declarations that we use to handle attributes, as +described a bit later. + +The name of the :class:`Noddy` object structure has been shortened to +:class:`Noddy`. The type object name has been shortened to :class:`NoddyType`. + +The :class:`Noddy` type now has three data attributes, *first*, *last*, and +*number*. The *first* and *last* variables are Python strings containing first +and last names. The *number* attribute is an integer. + +The object structure is updated accordingly:: + + typedef struct { + PyObject_HEAD + PyObject *first; + PyObject *last; + int number; + } Noddy; + +Because we now have data to manage, we have to be more careful about object +allocation and deallocation. At a minimum, we need a deallocation method:: + + static void + Noddy_dealloc(Noddy* self) + { + Py_XDECREF(self->first); + Py_XDECREF(self->last); + self->ob_type->tp_free((PyObject*)self); + } + +which is assigned to the :attr:`tp_dealloc` member:: + + (destructor)Noddy_dealloc, /*tp_dealloc*/ + +This method decrements the reference counts of the two Python attributes. We use +:cfunc:`Py_XDECREF` here because the :attr:`first` and :attr:`last` members +could be *NULL*. It then calls the :attr:`tp_free` member of the object's type +to free the object's memory. Note that the object's type might not be +:class:`NoddyType`, because the object may be an instance of a subclass. + +We want to make sure that the first and last names are initialized to empty +strings, so we provide a new method:: + + static PyObject * + Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) + { + Noddy *self; + + self = (Noddy *)type->tp_alloc(type, 0); + if (self != NULL) { + self->first = PyString_FromString(""); + if (self->first == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->last = PyString_FromString(""); + if (self->last == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->number = 0; + } + + return (PyObject *)self; + } + +and install it in the :attr:`tp_new` member:: + + Noddy_new, /* tp_new */ + +The new member is responsible for creating (as opposed to initializing) objects +of the type. It is exposed in Python as the :meth:`__new__` method. See the +paper titled "Unifying types and classes in Python" for a detailed discussion of +the :meth:`__new__` method. One reason to implement a new method is to assure +the initial values of instance variables. In this case, we use the new method +to make sure that the initial values of the members :attr:`first` and +:attr:`last` are not *NULL*. If we didn't care whether the initial values were +*NULL*, we could have used :cfunc:`PyType_GenericNew` as our new method, as we +did before. :cfunc:`PyType_GenericNew` initializes all of the instance variable +members to *NULL*. + +The new method is a static method that is passed the type being instantiated and +any arguments passed when the type was called, and that returns the new object +created. New methods always accept positional and keyword arguments, but they +often ignore the arguments, leaving the argument handling to initializer +methods. Note that if the type supports subclassing, the type passed may not be +the type being defined. The new method calls the tp_alloc slot to allocate +memory. We don't fill the :attr:`tp_alloc` slot ourselves. Rather +:cfunc:`PyType_Ready` fills it for us by inheriting it from our base class, +which is :class:`object` by default. Most types use the default allocation. + +.. note:: + + If you are creating a co-operative :attr:`tp_new` (one that calls a base type's + :attr:`tp_new` or :meth:`__new__`), you must *not* try to determine what method + to call using method resolution order at runtime. Always statically determine + what type you are going to call, and call its :attr:`tp_new` directly, or via + ``type->tp_base->tp_new``. If you do not do this, Python subclasses of your + type that also inherit from other Python-defined classes may not work correctly. + (Specifically, you may not be able to create instances of such subclasses + without getting a :exc:`TypeError`.) + +We provide an initialization function:: + + static int + Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) + { + PyObject *first=NULL, *last=NULL, *tmp; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &first, &last, + &self->number)) + return -1; + + if (first) { + tmp = self->first; + Py_INCREF(first); + self->first = first; + Py_XDECREF(tmp); + } + + if (last) { + tmp = self->last; + Py_INCREF(last); + self->last = last; + Py_XDECREF(tmp); + } + + return 0; + } + +by filling the :attr:`tp_init` slot. :: + + (initproc)Noddy_init, /* tp_init */ + +The :attr:`tp_init` slot is exposed in Python as the :meth:`__init__` method. It +is used to initialize an object after it's created. Unlike the new method, we +can't guarantee that the initializer is called. The initializer isn't called +when unpickling objects and it can be overridden. Our initializer accepts +arguments to provide initial values for our instance. Initializers always accept +positional and keyword arguments. + +Initializers can be called multiple times. Anyone can call the :meth:`__init__` +method on our objects. For this reason, we have to be extra careful when +assigning the new values. We might be tempted, for example to assign the +:attr:`first` member like this:: + + if (first) { + Py_XDECREF(self->first); + Py_INCREF(first); + self->first = first; + } + +But this would be risky. Our type doesn't restrict the type of the +:attr:`first` member, so it could be any kind of object. It could have a +destructor that causes code to be executed that tries to access the +:attr:`first` member. To be paranoid and protect ourselves against this +possibility, we almost always reassign members before decrementing their +reference counts. When don't we have to do this? + +* when we absolutely know that the reference count is greater than 1 + +* when we know that deallocation of the object [#]_ will not cause any calls + back into our type's code + +* when decrementing a reference count in a :attr:`tp_dealloc` handler when + garbage-collections is not supported [#]_ + +We want to want to expose our instance variables as attributes. There are a +number of ways to do that. The simplest way is to define member definitions:: + + static PyMemberDef Noddy_members[] = { + {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, + "last name"}, + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ + }; + +and put the definitions in the :attr:`tp_members` slot:: + + Noddy_members, /* tp_members */ + +Each member definition has a member name, type, offset, access flags and +documentation string. See the "Generic Attribute Management" section below for +details. + +A disadvantage of this approach is that it doesn't provide a way to restrict the +types of objects that can be assigned to the Python attributes. We expect the +first and last names to be strings, but any Python objects can be assigned. +Further, the attributes can be deleted, setting the C pointers to *NULL*. Even +though we can make sure the members are initialized to non-*NULL* values, the +members can be set to *NULL* if the attributes are deleted. + +We define a single method, :meth:`name`, that outputs the objects name as the +concatenation of the first and last names. :: + + static PyObject * + Noddy_name(Noddy* self) + { + static PyObject *format = NULL; + PyObject *args, *result; + + if (format == NULL) { + format = PyString_FromString("%s %s"); + if (format == NULL) + return NULL; + } + + if (self->first == NULL) { + PyErr_SetString(PyExc_AttributeError, "first"); + return NULL; + } + + if (self->last == NULL) { + PyErr_SetString(PyExc_AttributeError, "last"); + return NULL; + } + + args = Py_BuildValue("OO", self->first, self->last); + if (args == NULL) + return NULL; + + result = PyString_Format(format, args); + Py_DECREF(args); + + return result; + } + +The method is implemented as a C function that takes a :class:`Noddy` (or +:class:`Noddy` subclass) instance as the first argument. Methods always take an +instance as the first argument. Methods often take positional and keyword +arguments as well, but in this cased we don't take any and don't need to accept +a positional argument tuple or keyword argument dictionary. This method is +equivalent to the Python method:: + + def name(self): + return "%s %s" % (self.first, self.last) + +Note that we have to check for the possibility that our :attr:`first` and +:attr:`last` members are *NULL*. This is because they can be deleted, in which +case they are set to *NULL*. It would be better to prevent deletion of these +attributes and to restrict the attribute values to be strings. We'll see how to +do that in the next section. + +Now that we've defined the method, we need to create an array of method +definitions:: + + static PyMethodDef Noddy_methods[] = { + {"name", (PyCFunction)Noddy_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ + }; + +and assign them to the :attr:`tp_methods` slot:: + + Noddy_methods, /* tp_methods */ + +Note that we used the :const:`METH_NOARGS` flag to indicate that the method is +passed no arguments. + +Finally, we'll make our type usable as a base class. We've written our methods +carefully so far so that they don't make any assumptions about the type of the +object being created or used, so all we need to do is to add the +:const:`Py_TPFLAGS_BASETYPE` to our class flag definition:: + + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + +We rename :cfunc:`initnoddy` to :cfunc:`initnoddy2` and update the module name +passed to :cfunc:`Py_InitModule3`. + +Finally, we update our :file:`setup.py` file to build the new module:: + + from distutils.core import setup, Extension + setup(name="noddy", version="1.0", + ext_modules=[ + Extension("noddy", ["noddy.c"]), + Extension("noddy2", ["noddy2.c"]), + ]) + + +Providing finer control over data attributes +-------------------------------------------- + +In this section, we'll provide finer control over how the :attr:`first` and +:attr:`last` attributes are set in the :class:`Noddy` example. In the previous +version of our module, the instance variables :attr:`first` and :attr:`last` +could be set to non-string values or even deleted. We want to make sure that +these attributes always contain strings. + +.. literalinclude:: ../includes/noddy3.c + + +To provide greater control, over the :attr:`first` and :attr:`last` attributes, +we'll use custom getter and setter functions. Here are the functions for +getting and setting the :attr:`first` attribute:: + + Noddy_getfirst(Noddy *self, void *closure) + { + Py_INCREF(self->first); + return self->first; + } + + static int + Noddy_setfirst(Noddy *self, PyObject *value, void *closure) + { + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute"); + return -1; + } + + if (! PyString_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "The first attribute value must be a string"); + return -1; + } + + Py_DECREF(self->first); + Py_INCREF(value); + self->first = value; + + return 0; + } + +The getter function is passed a :class:`Noddy` object and a "closure", which is +void pointer. In this case, the closure is ignored. (The closure supports an +advanced usage in which definition data is passed to the getter and setter. This +could, for example, be used to allow a single set of getter and setter functions +that decide the attribute to get or set based on data in the closure.) + +The setter function is passed the :class:`Noddy` object, the new value, and the +closure. The new value may be *NULL*, in which case the attribute is being +deleted. In our setter, we raise an error if the attribute is deleted or if the +attribute value is not a string. + +We create an array of :ctype:`PyGetSetDef` structures:: + + static PyGetSetDef Noddy_getseters[] = { + {"first", + (getter)Noddy_getfirst, (setter)Noddy_setfirst, + "first name", + NULL}, + {"last", + (getter)Noddy_getlast, (setter)Noddy_setlast, + "last name", + NULL}, + {NULL} /* Sentinel */ + }; + +and register it in the :attr:`tp_getset` slot:: + + Noddy_getseters, /* tp_getset */ + +to register out attribute getters and setters. + +The last item in a :ctype:`PyGetSetDef` structure is the closure mentioned +above. In this case, we aren't using the closure, so we just pass *NULL*. + +We also remove the member definitions for these attributes:: + + static PyMemberDef Noddy_members[] = { + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ + }; + +We also need to update the :attr:`tp_init` handler to only allow strings [#]_ to +be passed:: + + static int + Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) + { + PyObject *first=NULL, *last=NULL, *tmp; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist, + &first, &last, + &self->number)) + return -1; + + if (first) { + tmp = self->first; + Py_INCREF(first); + self->first = first; + Py_DECREF(tmp); + } + + if (last) { + tmp = self->last; + Py_INCREF(last); + self->last = last; + Py_DECREF(tmp); + } + + return 0; + } + +With these changes, we can assure that the :attr:`first` and :attr:`last` +members are never *NULL* so we can remove checks for *NULL* values in almost all +cases. This means that most of the :cfunc:`Py_XDECREF` calls can be converted to +:cfunc:`Py_DECREF` calls. The only place we can't change these calls is in the +deallocator, where there is the possibility that the initialization of these +members failed in the constructor. + +We also rename the module initialization function and module name in the +initialization function, as we did before, and we add an extra definition to the +:file:`setup.py` file. + + +Supporting cyclic garbage collection +------------------------------------ + +Python has a cyclic-garbage collector that can identify unneeded objects even +when their reference counts are not zero. This can happen when objects are +involved in cycles. For example, consider:: + + >>> l = [] + >>> l.append(l) + >>> del l + +In this example, we create a list that contains itself. When we delete it, it +still has a reference from itself. Its reference count doesn't drop to zero. +Fortunately, Python's cyclic-garbage collector will eventually figure out that +the list is garbage and free it. + +In the second version of the :class:`Noddy` example, we allowed any kind of +object to be stored in the :attr:`first` or :attr:`last` attributes. [#]_ This +means that :class:`Noddy` objects can participate in cycles:: + + >>> import noddy2 + >>> n = noddy2.Noddy() + >>> l = [n] + >>> n.first = l + +This is pretty silly, but it gives us an excuse to add support for the +cyclic-garbage collector to the :class:`Noddy` example. To support cyclic +garbage collection, types need to fill two slots and set a class flag that +enables these slots: + +.. literalinclude:: ../includes/noddy4.c + + +The traversal method provides access to subobjects that could participate in +cycles:: + + static int + Noddy_traverse(Noddy *self, visitproc visit, void *arg) + { + int vret; + + if (self->first) { + vret = visit(self->first, arg); + if (vret != 0) + return vret; + } + if (self->last) { + vret = visit(self->last, arg); + if (vret != 0) + return vret; + } + + return 0; + } + +For each subobject that can participate in cycles, we need to call the +:cfunc:`visit` function, which is passed to the traversal method. The +:cfunc:`visit` function takes as arguments the subobject and the extra argument +*arg* passed to the traversal method. It returns an integer value that must be +returned if it is non-zero. + +Python 2.4 and higher provide a :cfunc:`Py_VISIT` macro that automates calling +visit functions. With :cfunc:`Py_VISIT`, :cfunc:`Noddy_traverse` can be +simplified:: + + static int + Noddy_traverse(Noddy *self, visitproc visit, void *arg) + { + Py_VISIT(self->first); + Py_VISIT(self->last); + return 0; + } + +.. note:: + + Note that the :attr:`tp_traverse` implementation must name its arguments exactly + *visit* and *arg* in order to use :cfunc:`Py_VISIT`. This is to encourage + uniformity across these boring implementations. + +We also need to provide a method for clearing any subobjects that can +participate in cycles. We implement the method and reimplement the deallocator +to use it:: + + static int + Noddy_clear(Noddy *self) + { + PyObject *tmp; + + tmp = self->first; + self->first = NULL; + Py_XDECREF(tmp); + + tmp = self->last; + self->last = NULL; + Py_XDECREF(tmp); + + return 0; + } + + static void + Noddy_dealloc(Noddy* self) + { + Noddy_clear(self); + self->ob_type->tp_free((PyObject*)self); + } + +Notice the use of a temporary variable in :cfunc:`Noddy_clear`. We use the +temporary variable so that we can set each member to *NULL* before decrementing +its reference count. We do this because, as was discussed earlier, if the +reference count drops to zero, we might cause code to run that calls back into +the object. In addition, because we now support garbage collection, we also +have to worry about code being run that triggers garbage collection. If garbage +collection is run, our :attr:`tp_traverse` handler could get called. We can't +take a chance of having :cfunc:`Noddy_traverse` called when a member's reference +count has dropped to zero and its value hasn't been set to *NULL*. + +Python 2.4 and higher provide a :cfunc:`Py_CLEAR` that automates the careful +decrementing of reference counts. With :cfunc:`Py_CLEAR`, the +:cfunc:`Noddy_clear` function can be simplified:: + + static int + Noddy_clear(Noddy *self) + { + Py_CLEAR(self->first); + Py_CLEAR(self->last); + return 0; + } + +Finally, we add the :const:`Py_TPFLAGS_HAVE_GC` flag to the class flags:: + + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + +That's pretty much it. If we had written custom :attr:`tp_alloc` or +:attr:`tp_free` slots, we'd need to modify them for cyclic-garbage collection. +Most extensions will use the versions automatically provided. + + +Subclassing other types +----------------------- + +It is possible to create new extension types that are derived from existing +types. It is easiest to inherit from the built in types, since an extension can +easily use the :class:`PyTypeObject` it needs. It can be difficult to share +these :class:`PyTypeObject` structures between extension modules. + +In this example we will create a :class:`Shoddy` type that inherits from the +builtin :class:`list` type. The new type will be completely compatible with +regular lists, but will have an additional :meth:`increment` method that +increases an internal counter. :: + + >>> import shoddy + >>> s = shoddy.Shoddy(range(3)) + >>> s.extend(s) + >>> print len(s) + 6 + >>> print s.increment() + 1 + >>> print s.increment() + 2 + +.. literalinclude:: ../includes/shoddy.c + + +As you can see, the source code closely resembles the :class:`Noddy` examples in +previous sections. We will break down the main differences between them. :: + + typedef struct { + PyListObject list; + int state; + } Shoddy; + +The primary difference for derived type objects is that the base type's object +structure must be the first value. The base type will already include the +:cfunc:`PyObject_HEAD` at the beginning of its structure. + +When a Python object is a :class:`Shoddy` instance, its *PyObject\** pointer can +be safely cast to both *PyListObject\** and *Shoddy\**. :: + + static int + Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) + { + if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0) + return -1; + self->state = 0; + return 0; + } + +In the :attr:`__init__` method for our type, we can see how to call through to +the :attr:`__init__` method of the base type. + +This pattern is important when writing a type with custom :attr:`new` and +:attr:`dealloc` methods. The :attr:`new` method should not actually create the +memory for the object with :attr:`tp_alloc`, that will be handled by the base +class when calling its :attr:`tp_new`. + +When filling out the :cfunc:`PyTypeObject` for the :class:`Shoddy` type, you see +a slot for :cfunc:`tp_base`. Due to cross platform compiler issues, you can't +fill that field directly with the :cfunc:`PyList_Type`; it can be done later in +the module's :cfunc:`init` function. :: + + PyMODINIT_FUNC + initshoddy(void) + { + PyObject *m; + + ShoddyType.tp_base = &PyList_Type; + if (PyType_Ready(&ShoddyType) < 0) + return; + + m = Py_InitModule3("shoddy", NULL, "Shoddy module"); + if (m == NULL) + return; + + Py_INCREF(&ShoddyType); + PyModule_AddObject(m, "Shoddy", (PyObject *) &ShoddyType); + } + +Before calling :cfunc:`PyType_Ready`, the type structure must have the +:attr:`tp_base` slot filled in. When we are deriving a new type, it is not +necessary to fill out the :attr:`tp_alloc` slot with :cfunc:`PyType_GenericNew` +-- the allocate function from the base type will be inherited. + +After that, calling :cfunc:`PyType_Ready` and adding the type object to the +module is the same as with the basic :class:`Noddy` examples. + + +.. _dnt-type-methods: + +Type Methods +============ + +This section aims to give a quick fly-by on the various type methods you can +implement and what they do. + +Here is the definition of :ctype:`PyTypeObject`, with some fields only used in +debug builds omitted: + +.. literalinclude:: ../includes/typestruct.h + + +Now that's a *lot* of methods. Don't worry too much though - if you have a type +you want to define, the chances are very good that you will only implement a +handful of these. + +As you probably expect by now, we're going to go over this and give more +information about the various handlers. We won't go in the order they are +defined in the structure, because there is a lot of historical baggage that +impacts the ordering of the fields; be sure your type initialization keeps the +fields in the right order! It's often easiest to find an example that includes +all the fields you need (even if they're initialized to ``0``) and then change +the values to suit your new type. :: + + char *tp_name; /* For printing */ + +The name of the type - as mentioned in the last section, this will appear in +various places, almost entirely for diagnostic purposes. Try to choose something +that will be helpful in such a situation! :: + + int tp_basicsize, tp_itemsize; /* For allocation */ + +These fields tell the runtime how much memory to allocate when new objects of +this type are created. Python has some built-in support for variable length +structures (think: strings, lists) which is where the :attr:`tp_itemsize` field +comes in. This will be dealt with later. :: + + char *tp_doc; + +Here you can put a string (or its address) that you want returned when the +Python script references ``obj.__doc__`` to retrieve the doc string. + +Now we come to the basic type methods---the ones most extension types will +implement. + + +Finalization and De-allocation +------------------------------ + +.. index:: + single: object; deallocation + single: deallocation, object + single: object; finalization + single: finalization, of objects + +:: + + destructor tp_dealloc; + +This function is called when the reference count of the instance of your type is +reduced to zero and the Python interpreter wants to reclaim it. If your type +has memory to free or other clean-up to perform, put it here. The object itself +needs to be freed here as well. Here is an example of this function:: + + static void + newdatatype_dealloc(newdatatypeobject * obj) + { + free(obj->obj_UnderlyingDatatypePtr); + obj->ob_type->tp_free(obj); + } + +.. index:: + single: PyErr_Fetch() + single: PyErr_Restore() + +One important requirement of the deallocator function is that it leaves any +pending exceptions alone. This is important since deallocators are frequently +called as the interpreter unwinds the Python stack; when the stack is unwound +due to an exception (rather than normal returns), nothing is done to protect the +deallocators from seeing that an exception has already been set. Any actions +which a deallocator performs which may cause additional Python code to be +executed may detect that an exception has been set. This can lead to misleading +errors from the interpreter. The proper way to protect against this is to save +a pending exception before performing the unsafe action, and restoring it when +done. This can be done using the :cfunc:`PyErr_Fetch` and +:cfunc:`PyErr_Restore` functions:: + + static void + my_dealloc(PyObject *obj) + { + MyObject *self = (MyObject *) obj; + PyObject *cbresult; + + if (self->my_callback != NULL) { + PyObject *err_type, *err_value, *err_traceback; + int have_error = PyErr_Occurred() ? 1 : 0; + + if (have_error) + PyErr_Fetch(&err_type, &err_value, &err_traceback); + + cbresult = PyObject_CallObject(self->my_callback, NULL); + if (cbresult == NULL) + PyErr_WriteUnraisable(self->my_callback); + else + Py_DECREF(cbresult); + + if (have_error) + PyErr_Restore(err_type, err_value, err_traceback); + + Py_DECREF(self->my_callback); + } + obj->ob_type->tp_free((PyObject*)self); + } + + +Object Presentation +------------------- + +.. index:: + builtin: repr + builtin: str + +In Python, there are two ways to generate a textual representation of an object: +the :func:`repr` function, and the :func:`str` function. (The :func:`print` +function just calls :func:`str`.) These handlers are both optional. + +:: + + reprfunc tp_repr; + reprfunc tp_str; + +The :attr:`tp_repr` handler should return a string object containing a +representation of the instance for which it is called. Here is a simple +example:: + + static PyObject * + newdatatype_repr(newdatatypeobject * obj) + { + return PyString_FromFormat("Repr-ified_newdatatype{{size:\%d}}", + obj->obj_UnderlyingDatatypePtr->size); + } + +If no :attr:`tp_repr` handler is specified, the interpreter will supply a +representation that uses the type's :attr:`tp_name` and a uniquely-identifying +value for the object. + +The :attr:`tp_str` handler is to :func:`str` what the :attr:`tp_repr` handler +described above is to :func:`repr`; that is, it is called when Python code calls +:func:`str` on an instance of your object. Its implementation is very similar +to the :attr:`tp_repr` function, but the resulting string is intended for human +consumption. If :attr:`tp_str` is not specified, the :attr:`tp_repr` handler is +used instead. + +Here is a simple example:: + + static PyObject * + newdatatype_str(newdatatypeobject * obj) + { + return PyString_FromFormat("Stringified_newdatatype{{size:\%d}}", + obj->obj_UnderlyingDatatypePtr->size); + } + +The print function will be called whenever Python needs to "print" an instance +of the type. For example, if 'node' is an instance of type TreeNode, then the +print function is called when Python code calls:: + + print node + +There is a flags argument and one flag, :const:`Py_PRINT_RAW`, and it suggests +that you print without string quotes and possibly without interpreting escape +sequences. + +The print function receives a file object as an argument. You will likely want +to write to that file object. + +Here is a sample print function:: + + static int + newdatatype_print(newdatatypeobject *obj, FILE *fp, int flags) + { + if (flags & Py_PRINT_RAW) { + fprintf(fp, "<{newdatatype object--size: %d}>", + obj->obj_UnderlyingDatatypePtr->size); + } + else { + fprintf(fp, "\"<{newdatatype object--size: %d}>\"", + obj->obj_UnderlyingDatatypePtr->size); + } + return 0; + } + + +Attribute Management +-------------------- + +For every object which can support attributes, the corresponding type must +provide the functions that control how the attributes are resolved. There needs +to be a function which can retrieve attributes (if any are defined), and another +to set attributes (if setting attributes is allowed). Removing an attribute is +a special case, for which the new value passed to the handler is *NULL*. + +Python supports two pairs of attribute handlers; a type that supports attributes +only needs to implement the functions for one pair. The difference is that one +pair takes the name of the attribute as a :ctype:`char\*`, while the other +accepts a :ctype:`PyObject\*`. Each type can use whichever pair makes more +sense for the implementation's convenience. :: + + getattrfunc tp_getattr; /* char * version */ + setattrfunc tp_setattr; + /* ... */ + getattrofunc tp_getattrofunc; /* PyObject * version */ + setattrofunc tp_setattrofunc; + +If accessing attributes of an object is always a simple operation (this will be +explained shortly), there are generic implementations which can be used to +provide the :ctype:`PyObject\*` version of the attribute management functions. +The actual need for type-specific attribute handlers almost completely +disappeared starting with Python 2.2, though there are many examples which have +not been updated to use some of the new generic mechanism that is available. + + +Generic Attribute Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. versionadded:: 2.2 + +Most extension types only use *simple* attributes. So, what makes the +attributes simple? There are only a couple of conditions that must be met: + +#. The name of the attributes must be known when :cfunc:`PyType_Ready` is + called. + +#. No special processing is needed to record that an attribute was looked up or + set, nor do actions need to be taken based on the value. + +Note that this list does not place any restrictions on the values of the +attributes, when the values are computed, or how relevant data is stored. + +When :cfunc:`PyType_Ready` is called, it uses three tables referenced by the +type object to create *descriptors* which are placed in the dictionary of the +type object. Each descriptor controls access to one attribute of the instance +object. Each of the tables is optional; if all three are *NULL*, instances of +the type will only have attributes that are inherited from their base type, and +should leave the :attr:`tp_getattro` and :attr:`tp_setattro` fields *NULL* as +well, allowing the base type to handle attributes. + +The tables are declared as three fields of the type object:: + + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + +If :attr:`tp_methods` is not *NULL*, it must refer to an array of +:ctype:`PyMethodDef` structures. Each entry in the table is an instance of this +structure:: + + typedef struct PyMethodDef { + char *ml_name; /* method name */ + PyCFunction ml_meth; /* implementation function */ + int ml_flags; /* flags */ + char *ml_doc; /* docstring */ + } PyMethodDef; + +One entry should be defined for each method provided by the type; no entries are +needed for methods inherited from a base type. One additional entry is needed +at the end; it is a sentinel that marks the end of the array. The +:attr:`ml_name` field of the sentinel must be *NULL*. + +XXX Need to refer to some unified discussion of the structure fields, shared +with the next section. + +The second table is used to define attributes which map directly to data stored +in the instance. A variety of primitive C types are supported, and access may +be read-only or read-write. The structures in the table are defined as:: + + typedef struct PyMemberDef { + char *name; + int type; + int offset; + int flags; + char *doc; + } PyMemberDef; + +For each entry in the table, a descriptor will be constructed and added to the +type which will be able to extract a value from the instance structure. The +:attr:`type` field should contain one of the type codes defined in the +:file:`structmember.h` header; the value will be used to determine how to +convert Python values to and from C values. The :attr:`flags` field is used to +store flags which control how the attribute can be accessed. + +XXX Need to move some of this to a shared section! + +The following flag constants are defined in :file:`structmember.h`; they may be +combined using bitwise-OR. + ++---------------------------+----------------------------------------------+ +| Constant | Meaning | ++===========================+==============================================+ +| :const:`READONLY` | Never writable. | ++---------------------------+----------------------------------------------+ +| :const:`RO` | Shorthand for :const:`READONLY`. | ++---------------------------+----------------------------------------------+ +| :const:`READ_RESTRICTED` | Not readable in restricted mode. | ++---------------------------+----------------------------------------------+ +| :const:`WRITE_RESTRICTED` | Not writable in restricted mode. | ++---------------------------+----------------------------------------------+ +| :const:`RESTRICTED` | Not readable or writable in restricted mode. | ++---------------------------+----------------------------------------------+ + +.. index:: + single: READONLY + single: RO + single: READ_RESTRICTED + single: WRITE_RESTRICTED + single: RESTRICTED + +An interesting advantage of using the :attr:`tp_members` table to build +descriptors that are used at runtime is that any attribute defined this way can +have an associated doc string simply by providing the text in the table. An +application can use the introspection API to retrieve the descriptor from the +class object, and get the doc string using its :attr:`__doc__` attribute. + +As with the :attr:`tp_methods` table, a sentinel entry with a :attr:`name` value +of *NULL* is required. + +.. % XXX Descriptors need to be explained in more detail somewhere, but +.. % not here. +.. % +.. % Descriptor objects have two handler functions which correspond to +.. % the \member{tp_getattro} and \member{tp_setattro} handlers. The +.. % \method{__get__()} handler is a function which is passed the +.. % descriptor, instance, and type objects, and returns the value of the +.. % attribute, or it returns \NULL{} and sets an exception. The +.. % \method{__set__()} handler is passed the descriptor, instance, type, +.. % and new value; + + +Type-specific Attribute Management +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For simplicity, only the :ctype:`char\*` version will be demonstrated here; the +type of the name parameter is the only difference between the :ctype:`char\*` +and :ctype:`PyObject\*` flavors of the interface. This example effectively does +the same thing as the generic example above, but does not use the generic +support added in Python 2.2. The value in showing this is two-fold: it +demonstrates how basic attribute management can be done in a way that is +portable to older versions of Python, and explains how the handler functions are +called, so that if you do need to extend their functionality, you'll understand +what needs to be done. + +The :attr:`tp_getattr` handler is called when the object requires an attribute +look-up. It is called in the same situations where the :meth:`__getattr__` +method of a class would be called. + +A likely way to handle this is (1) to implement a set of functions (such as +:cfunc:`newdatatype_getSize` and :cfunc:`newdatatype_setSize` in the example +below), (2) provide a method table listing these functions, and (3) provide a +getattr function that returns the result of a lookup in that table. The method +table uses the same structure as the :attr:`tp_methods` field of the type +object. + +Here is an example:: + + static PyMethodDef newdatatype_methods[] = { + {"getSize", (PyCFunction)newdatatype_getSize, METH_VARARGS, + "Return the current size."}, + {"setSize", (PyCFunction)newdatatype_setSize, METH_VARARGS, + "Set the size."}, + {NULL, NULL, 0, NULL} /* sentinel */ + }; + + static PyObject * + newdatatype_getattr(newdatatypeobject *obj, char *name) + { + return Py_FindMethod(newdatatype_methods, (PyObject *)obj, name); + } + +The :attr:`tp_setattr` handler is called when the :meth:`__setattr__` or +:meth:`__delattr__` method of a class instance would be called. When an +attribute should be deleted, the third parameter will be *NULL*. Here is an +example that simply raises an exception; if this were really all you wanted, the +:attr:`tp_setattr` handler should be set to *NULL*. :: + + static int + newdatatype_setattr(newdatatypeobject *obj, char *name, PyObject *v) + { + (void)PyErr_Format(PyExc_RuntimeError, "Read-only attribute: \%s", name); + return -1; + } + + +Object Comparison +----------------- + +:: + + cmpfunc tp_compare; + +The :attr:`tp_compare` handler is called when comparisons are needed and the +object does not implement the specific rich comparison method which matches the +requested comparison. (It is always used if defined and the +:cfunc:`PyObject_Compare` or :cfunc:`PyObject_Cmp` functions are used, or if +:func:`cmp` is used from Python.) It is analogous to the :meth:`__cmp__` method. +This function should return ``-1`` if *obj1* is less than *obj2*, ``0`` if they +are equal, and ``1`` if *obj1* is greater than *obj2*. (It was previously +allowed to return arbitrary negative or positive integers for less than and +greater than, respectively; as of Python 2.2, this is no longer allowed. In the +future, other return values may be assigned a different meaning.) + +A :attr:`tp_compare` handler may raise an exception. In this case it should +return a negative value. The caller has to test for the exception using +:cfunc:`PyErr_Occurred`. + +Here is a sample implementation:: + + static int + newdatatype_compare(newdatatypeobject * obj1, newdatatypeobject * obj2) + { + long result; + + if (obj1->obj_UnderlyingDatatypePtr->size < + obj2->obj_UnderlyingDatatypePtr->size) { + result = -1; + } + else if (obj1->obj_UnderlyingDatatypePtr->size > + obj2->obj_UnderlyingDatatypePtr->size) { + result = 1; + } + else { + result = 0; + } + return result; + } + + +Abstract Protocol Support +------------------------- + +Python supports a variety of *abstract* 'protocols;' the specific interfaces +provided to use these interfaces are documented in :ref:`abstract`. + + +A number of these abstract interfaces were defined early in the development of +the Python implementation. In particular, the number, mapping, and sequence +protocols have been part of Python since the beginning. Other protocols have +been added over time. For protocols which depend on several handler routines +from the type implementation, the older protocols have been defined as optional +blocks of handlers referenced by the type object. For newer protocols there are +additional slots in the main type object, with a flag bit being set to indicate +that the slots are present and should be checked by the interpreter. (The flag +bit does not indicate that the slot values are non-*NULL*. The flag may be set +to indicate the presence of a slot, but a slot may still be unfilled.) :: + + PyNumberMethods tp_as_number; + PySequenceMethods tp_as_sequence; + PyMappingMethods tp_as_mapping; + +If you wish your object to be able to act like a number, a sequence, or a +mapping object, then you place the address of a structure that implements the C +type :ctype:`PyNumberMethods`, :ctype:`PySequenceMethods`, or +:ctype:`PyMappingMethods`, respectively. It is up to you to fill in this +structure with appropriate values. You can find examples of the use of each of +these in the :file:`Objects` directory of the Python source distribution. :: + + hashfunc tp_hash; + +This function, if you choose to provide it, should return a hash number for an +instance of your data type. Here is a moderately pointless example:: + + static long + newdatatype_hash(newdatatypeobject *obj) + { + long result; + result = obj->obj_UnderlyingDatatypePtr->size; + result = result * 3; + return result; + } + +:: + + ternaryfunc tp_call; + +This function is called when an instance of your data type is "called", for +example, if ``obj1`` is an instance of your data type and the Python script +contains ``obj1('hello')``, the :attr:`tp_call` handler is invoked. + +This function takes three arguments: + +#. *arg1* is the instance of the data type which is the subject of the call. If + the call is ``obj1('hello')``, then *arg1* is ``obj1``. + +#. *arg2* is a tuple containing the arguments to the call. You can use + :cfunc:`PyArg_ParseTuple` to extract the arguments. + +#. *arg3* is a dictionary of keyword arguments that were passed. If this is + non-*NULL* and you support keyword arguments, use + :cfunc:`PyArg_ParseTupleAndKeywords` to extract the arguments. If you do not + want to support keyword arguments and this is non-*NULL*, raise a + :exc:`TypeError` with a message saying that keyword arguments are not supported. + +Here is a desultory example of the implementation of the call function. :: + + /* Implement the call function. + * obj1 is the instance receiving the call. + * obj2 is a tuple containing the arguments to the call, in this + * case 3 strings. + */ + static PyObject * + newdatatype_call(newdatatypeobject *obj, PyObject *args, PyObject *other) + { + PyObject *result; + char *arg1; + char *arg2; + char *arg3; + + if (!PyArg_ParseTuple(args, "sss:call", &arg1, &arg2, &arg3)) { + return NULL; + } + result = PyString_FromFormat( + "Returning -- value: [\%d] arg1: [\%s] arg2: [\%s] arg3: [\%s]\n", + obj->obj_UnderlyingDatatypePtr->size, + arg1, arg2, arg3); + printf("\%s", PyString_AS_STRING(result)); + return result; + } + +XXX some fields need to be added here... :: + + /* Added in release 2.2 */ + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + +These functions provide support for the iterator protocol. Any object which +wishes to support iteration over its contents (which may be generated during +iteration) must implement the ``tp_iter`` handler. Objects which are returned +by a ``tp_iter`` handler must implement both the ``tp_iter`` and ``tp_iternext`` +handlers. Both handlers take exactly one parameter, the instance for which they +are being called, and return a new reference. In the case of an error, they +should set an exception and return *NULL*. + +For an object which represents an iterable collection, the ``tp_iter`` handler +must return an iterator object. The iterator object is responsible for +maintaining the state of the iteration. For collections which can support +multiple iterators which do not interfere with each other (as lists and tuples +do), a new iterator should be created and returned. Objects which can only be +iterated over once (usually due to side effects of iteration) should implement +this handler by returning a new reference to themselves, and should also +implement the ``tp_iternext`` handler. File objects are an example of such an +iterator. + +Iterator objects should implement both handlers. The ``tp_iter`` handler should +return a new reference to the iterator (this is the same as the ``tp_iter`` +handler for objects which can only be iterated over destructively). The +``tp_iternext`` handler should return a new reference to the next object in the +iteration if there is one. If the iteration has reached the end, it may return +*NULL* without setting an exception or it may set :exc:`StopIteration`; avoiding +the exception can yield slightly better performance. If an actual error occurs, +it should set an exception and return *NULL*. + + +.. _weakref-support: + +Weak Reference Support +---------------------- + +One of the goals of Python's weak-reference implementation is to allow any type +to participate in the weak reference mechanism without incurring the overhead on +those objects which do not benefit by weak referencing (such as numbers). + +For an object to be weakly referencable, the extension must include a +:ctype:`PyObject\*` field in the instance structure for the use of the weak +reference mechanism; it must be initialized to *NULL* by the object's +constructor. It must also set the :attr:`tp_weaklistoffset` field of the +corresponding type object to the offset of the field. For example, the instance +type is defined with the following structure:: + + typedef struct { + PyObject_HEAD + PyClassObject *in_class; /* The class object */ + PyObject *in_dict; /* A dictionary */ + PyObject *in_weakreflist; /* List of weak references */ + } PyInstanceObject; + +The statically-declared type object for instances is defined this way:: + + PyTypeObject PyInstance_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, + "module.instance", + + /* Lots of stuff omitted for brevity... */ + + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */ + }; + +The type constructor is responsible for initializing the weak reference list to +*NULL*:: + + static PyObject * + instance_new() { + /* Other initialization stuff omitted for brevity */ + + self->in_weakreflist = NULL; + + return (PyObject *) self; + } + +The only further addition is that the destructor needs to call the weak +reference manager to clear any weak references. This should be done before any +other parts of the destruction have occurred, but is only required if the weak +reference list is non-*NULL*:: + + static void + instance_dealloc(PyInstanceObject *inst) + { + /* Allocate temporaries if needed, but do not begin + destruction just yet. + */ + + if (inst->in_weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) inst); + + /* Proceed with object destruction normally. */ + } + + +More Suggestions +---------------- + +Remember that you can omit most of these functions, in which case you provide +``0`` as a value. There are type definitions for each of the functions you must +provide. They are in :file:`object.h` in the Python include directory that +comes with the source distribution of Python. + +In order to learn how to implement any specific method for your new data type, +do the following: Download and unpack the Python source distribution. Go the +:file:`Objects` directory, then search the C source files for ``tp_`` plus the +function you want (for example, ``tp_compare``). You will find examples of the +function you want to implement. + +When you need to verify that an object is an instance of the type you are +implementing, use the :cfunc:`PyObject_TypeCheck` function. A sample of its use +might be something like the following:: + + if (! PyObject_TypeCheck(some_object, &MyType)) { + PyErr_SetString(PyExc_TypeError, "arg #1 not a mything"); + return NULL; + } + +.. rubric:: Footnotes + +.. [#] This is true when we know that the object is a basic type, like a string or a + float. + +.. [#] We relied on this in the :attr:`tp_dealloc` handler in this example, because our + type doesn't support garbage collection. Even if a type supports garbage + collection, there are calls that can be made to "untrack" the object from + garbage collection, however, these calls are advanced and not covered here. + +.. [#] We now know that the first and last members are strings, so perhaps we could be + less careful about decrementing their reference counts, however, we accept + instances of string subclasses. Even though deallocating normal strings won't + call back into our objects, we can't guarantee that deallocating an instance of + a string subclass won't. call back into out objects. + +.. [#] Even in the third version, we aren't guaranteed to avoid cycles. Instances of + string subclasses are allowed and string subclasses could allow cycles even if + normal strings don't. + diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst new file mode 100644 index 0000000..7a66afe --- /dev/null +++ b/Doc/extending/windows.rst @@ -0,0 +1,280 @@ +.. highlightlang:: c + + +.. _building-on-windows: + +**************************************** +Building C and C++ Extensions on Windows +**************************************** + +.. % + +This chapter briefly explains how to create a Windows extension module for +Python using Microsoft Visual C++, and follows with more detailed background +information on how it works. The explanatory material is useful for both the +Windows programmer learning to build Python extensions and the Unix programmer +interested in producing software which can be successfully built on both Unix +and Windows. + +Module authors are encouraged to use the distutils approach for building +extension modules, instead of the one described in this section. You will still +need the C compiler that was used to build Python; typically Microsoft Visual +C++. + +.. note:: + + This chapter mentions a number of filenames that include an encoded Python + version number. These filenames are represented with the version number shown + as ``XY``; in practive, ``'X'`` will be the major version number and ``'Y'`` + will be the minor version number of the Python release you're working with. For + example, if you are using Python 2.2.1, ``XY`` will actually be ``22``. + + +.. _win-cookbook: + +A Cookbook Approach +=================== + +There are two approaches to building extension modules on Windows, just as there +are on Unix: use the :mod:`distutils` package to control the build process, or +do things manually. The distutils approach works well for most extensions; +documentation on using :mod:`distutils` to build and package extension modules +is available in :ref:`distutils-index`. This section describes the manual +approach to building Python extensions written in C or C++. + +To build extensions using these instructions, you need to have a copy of the +Python sources of the same version as your installed Python. You will need +Microsoft Visual C++ "Developer Studio"; project files are supplied for VC++ +version 7.1, but you can use older versions of VC++. Notice that you should use +the same version of VC++that was used to build Python itself. The example files +described here are distributed with the Python sources in the +:file:`PC\\example_nt\\` directory. + +#. **Copy the example files** --- The :file:`example_nt` directory is a + subdirectory of the :file:`PC` directory, in order to keep all the PC-specific + files under the same directory in the source distribution. However, the + :file:`example_nt` directory can't actually be used from this location. You + first need to copy or move it up one level, so that :file:`example_nt` is a + sibling of the :file:`PC` and :file:`Include` directories. Do all your work + from within this new location. + +#. **Open the project** --- From VC++, use the :menuselection:`File --> Open + Solution` dialog (not :menuselection:`File --> Open`!). Navigate to and select + the file :file:`example.sln`, in the *copy* of the :file:`example_nt` directory + you made above. Click Open. + +#. **Build the example DLL** --- In order to check that everything is set up + right, try building: + +#. Select a configuration. This step is optional. Choose + :menuselection:`Build --> Configuration Manager --> Active Solution Configuration` + and select either :guilabel:`Release` or :guilabel:`Debug`. If you skip this + step, VC++ will use the Debug configuration by default. + +#. Build the DLL. Choose :menuselection:`Build --> Build Solution`. This + creates all intermediate and result files in a subdirectory called either + :file:`Debug` or :file:`Release`, depending on which configuration you selected + in the preceding step. + +#. **Testing the debug-mode DLL** --- Once the Debug build has succeeded, bring + up a DOS box, and change to the :file:`example_nt\\Debug` directory. You should + now be able to repeat the following session (``C>`` is the DOS prompt, ``>>>`` + is the Python prompt; note that build information and various debug output from + Python may not match this screen dump exactly):: + + C>..\..\PCbuild\python_d + Adding parser accelerators ... + Done. + Python 2.2 (#28, Dec 19 2001, 23:26:37) [MSC 32 bit (Intel)] on win32 + Type "copyright", "credits" or "license" for more information. + >>> import example + [4897 refs] + >>> example.foo() + Hello, world + [4903 refs] + >>> + + Congratulations! You've successfully built your first Python extension module. + +#. **Creating your own project** --- Choose a name and create a directory for + it. Copy your C sources into it. Note that the module source file name does + not necessarily have to match the module name, but the name of the + initialization function should match the module name --- you can only import a + module :mod:`spam` if its initialization function is called :cfunc:`initspam`, + and it should call :cfunc:`Py_InitModule` with the string ``"spam"`` as its + first argument (use the minimal :file:`example.c` in this directory as a guide). + By convention, it lives in a file called :file:`spam.c` or :file:`spammodule.c`. + The output file should be called :file:`spam.dll` or :file:`spam.pyd` (the + latter is supported to avoid confusion with a system library :file:`spam.dll` to + which your module could be a Python interface) in Release mode, or + :file:`spam_d.dll` or :file:`spam_d.pyd` in Debug mode. + + Now your options are: + +#. Copy :file:`example.sln` and :file:`example.vcproj`, rename them to + :file:`spam.\*`, and edit them by hand, or + +#. Create a brand new project; instructions are below. + + In either case, copy :file:`example_nt\\example.def` to :file:`spam\\spam.def`, + and edit the new :file:`spam.def` so its second line contains the string + '``initspam``'. If you created a new project yourself, add the file + :file:`spam.def` to the project now. (This is an annoying little file with only + two lines. An alternative approach is to forget about the :file:`.def` file, + and add the option :option:`/export:initspam` somewhere to the Link settings, by + manually editing the setting in Project Properties dialog). + +#. **Creating a brand new project** --- Use the :menuselection:`File --> New + --> Project` dialog to create a new Project Workspace. Select :guilabel:`Visual + C++ Projects/Win32/ Win32 Project`, enter the name (``spam``), and make sure the + Location is set to parent of the :file:`spam` directory you have created (which + should be a direct subdirectory of the Python build tree, a sibling of + :file:`Include` and :file:`PC`). Select Win32 as the platform (in my version, + this is the only choice). Make sure the Create new workspace radio button is + selected. Click OK. + + You should now create the file :file:`spam.def` as instructed in the previous + section. Add the source files to the project, using :menuselection:`Project --> + Add Existing Item`. Set the pattern to ``*.*`` and select both :file:`spam.c` + and :file:`spam.def` and click OK. (Inserting them one by one is fine too.) + + Now open the :menuselection:`Project --> spam properties` dialog. You only need + to change a few settings. Make sure :guilabel:`All Configurations` is selected + from the :guilabel:`Settings for:` dropdown list. Select the C/C++ tab. Choose + the General category in the popup menu at the top. Type the following text in + the entry box labeled :guilabel:`Additional Include Directories`:: + + ..\Include,..\PC + + Then, choose the General category in the Linker tab, and enter :: + + ..\PCbuild + + in the text box labelled :guilabel:`Additional library Directories`. + + Now you need to add some mode-specific settings: + + Select :guilabel:`Release` in the :guilabel:`Configuration` dropdown list. + Choose the :guilabel:`Link` tab, choose the :guilabel:`Input` category, and + append ``pythonXY.lib`` to the list in the :guilabel:`Additional Dependencies` + box. + + Select :guilabel:`Debug` in the :guilabel:`Configuration` dropdown list, and + append ``pythonXY_d.lib`` to the list in the :guilabel:`Additional Dependencies` + box. Then click the C/C++ tab, select :guilabel:`Code Generation`, and select + :guilabel:`Multi-threaded Debug DLL` from the :guilabel:`Runtime library` + dropdown list. + + Select :guilabel:`Release` again from the :guilabel:`Configuration` dropdown + list. Select :guilabel:`Multi-threaded DLL` from the :guilabel:`Runtime + library` dropdown list. + +If your module creates a new type, you may have trouble with this line:: + + PyObject_HEAD_INIT(&PyType_Type) + +Change it to:: + + PyObject_HEAD_INIT(NULL) + +and add the following to the module initialization function:: + + MyObject_Type.ob_type = &PyType_Type; + +Refer to section 3 of the `Python FAQ `_ for +details on why you must do this. + + +.. _dynamic-linking: + +Differences Between Unix and Windows +==================================== + +.. sectionauthor:: Chris Phoenix + + +Unix and Windows use completely different paradigms for run-time loading of +code. Before you try to build a module that can be dynamically loaded, be aware +of how your system works. + +In Unix, a shared object (:file:`.so`) file contains code to be used by the +program, and also the names of functions and data that it expects to find in the +program. When the file is joined to the program, all references to those +functions and data in the file's code are changed to point to the actual +locations in the program where the functions and data are placed in memory. +This is basically a link operation. + +In Windows, a dynamic-link library (:file:`.dll`) file has no dangling +references. Instead, an access to functions or data goes through a lookup +table. So the DLL code does not have to be fixed up at runtime to refer to the +program's memory; instead, the code already uses the DLL's lookup table, and the +lookup table is modified at runtime to point to the functions and data. + +In Unix, there is only one type of library file (:file:`.a`) which contains code +from several object files (:file:`.o`). During the link step to create a shared +object file (:file:`.so`), the linker may find that it doesn't know where an +identifier is defined. The linker will look for it in the object files in the +libraries; if it finds it, it will include all the code from that object file. + +In Windows, there are two types of library, a static library and an import +library (both called :file:`.lib`). A static library is like a Unix :file:`.a` +file; it contains code to be included as necessary. An import library is +basically used only to reassure the linker that a certain identifier is legal, +and will be present in the program when the DLL is loaded. So the linker uses +the information from the import library to build the lookup table for using +identifiers that are not included in the DLL. When an application or a DLL is +linked, an import library may be generated, which will need to be used for all +future DLLs that depend on the symbols in the application or DLL. + +Suppose you are building two dynamic-load modules, B and C, which should share +another block of code A. On Unix, you would *not* pass :file:`A.a` to the +linker for :file:`B.so` and :file:`C.so`; that would cause it to be included +twice, so that B and C would each have their own copy. In Windows, building +:file:`A.dll` will also build :file:`A.lib`. You *do* pass :file:`A.lib` to the +linker for B and C. :file:`A.lib` does not contain code; it just contains +information which will be used at runtime to access A's code. + +In Windows, using an import library is sort of like using ``import spam``; it +gives you access to spam's names, but does not create a separate copy. On Unix, +linking with a library is more like ``from spam import *``; it does create a +separate copy. + + +.. _win-dlls: + +Using DLLs in Practice +====================== + +.. sectionauthor:: Chris Phoenix + + +Windows Python is built in Microsoft Visual C++; using other compilers may or +may not work (though Borland seems to). The rest of this section is MSVC++ +specific. + +When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. +To build two DLLs, spam and ni (which uses C functions found in spam), you could +use these commands:: + + cl /LD /I/python/include spam.c ../libs/pythonXY.lib + cl /LD /I/python/include ni.c spam.lib ../libs/pythonXY.lib + +The first command created three files: :file:`spam.obj`, :file:`spam.dll` and +:file:`spam.lib`. :file:`Spam.dll` does not contain any Python functions (such +as :cfunc:`PyArg_ParseTuple`), but it does know how to find the Python code +thanks to :file:`pythonXY.lib`. + +The second command created :file:`ni.dll` (and :file:`.obj` and :file:`.lib`), +which knows how to find the necessary functions from spam, and also from the +Python executable. + +Not every identifier is exported to the lookup table. If you want any other +modules (including Python) to be able to see your identifiers, you have to say +``_declspec(dllexport)``, as in ``void _declspec(dllexport) initspam(void)`` or +``PyObject _declspec(dllexport) *NiGetSpamData(void)``. + +Developer Studio will throw in a lot of import libraries that you do not really +need, adding about 100K to your executable. To get rid of them, use the Project +Settings dialog, Link tab, to specify *ignore default libraries*. Add the +correct :file:`msvcrtxx.lib` to the list of libraries. + diff --git a/Doc/howto/advocacy.rst b/Doc/howto/advocacy.rst new file mode 100644 index 0000000..1f1754a --- /dev/null +++ b/Doc/howto/advocacy.rst @@ -0,0 +1,356 @@ +************************* + Python Advocacy HOWTO +************************* + +:Author: A.M. Kuchling +:Release: 0.03 + + +.. topic:: Abstract + + It's usually difficult to get your management to accept open source software, + and Python is no exception to this rule. This document discusses reasons to use + Python, strategies for winning acceptance, facts and arguments you can use, and + cases where you *shouldn't* try to use Python. + + +Reasons to Use Python +===================== + +There are several reasons to incorporate a scripting language into your +development process, and this section will discuss them, and why Python has some +properties that make it a particularly good choice. + + +Programmability +--------------- + +Programs are often organized in a modular fashion. Lower-level operations are +grouped together, and called by higher-level functions, which may in turn be +used as basic operations by still further upper levels. + +For example, the lowest level might define a very low-level set of functions for +accessing a hash table. The next level might use hash tables to store the +headers of a mail message, mapping a header name like ``Date`` to a value such +as ``Tue, 13 May 1997 20:00:54 -0400``. A yet higher level may operate on +message objects, without knowing or caring that message headers are stored in a +hash table, and so forth. + +Often, the lowest levels do very simple things; they implement a data structure +such as a binary tree or hash table, or they perform some simple computation, +such as converting a date string to a number. The higher levels then contain +logic connecting these primitive operations. Using the approach, the primitives +can be seen as basic building blocks which are then glued together to produce +the complete product. + +Why is this design approach relevant to Python? Because Python is well suited +to functioning as such a glue language. A common approach is to write a Python +module that implements the lower level operations; for the sake of speed, the +implementation might be in C, Java, or even Fortran. Once the primitives are +available to Python programs, the logic underlying higher level operations is +written in the form of Python code. The high-level logic is then more +understandable, and easier to modify. + +John Ousterhout wrote a paper that explains this idea at greater length, +entitled "Scripting: Higher Level Programming for the 21st Century". I +recommend that you read this paper; see the references for the URL. Ousterhout +is the inventor of the Tcl language, and therefore argues that Tcl should be +used for this purpose; he only briefly refers to other languages such as Python, +Perl, and Lisp/Scheme, but in reality, Ousterhout's argument applies to +scripting languages in general, since you could equally write extensions for any +of the languages mentioned above. + + +Prototyping +----------- + +In *The Mythical Man-Month*, Fredrick Brooks suggests the following rule when +planning software projects: "Plan to throw one away; you will anyway." Brooks +is saying that the first attempt at a software design often turns out to be +wrong; unless the problem is very simple or you're an extremely good designer, +you'll find that new requirements and features become apparent once development +has actually started. If these new requirements can't be cleanly incorporated +into the program's structure, you're presented with two unpleasant choices: +hammer the new features into the program somehow, or scrap everything and write +a new version of the program, taking the new features into account from the +beginning. + +Python provides you with a good environment for quickly developing an initial +prototype. That lets you get the overall program structure and logic right, and +you can fine-tune small details in the fast development cycle that Python +provides. Once you're satisfied with the GUI interface or program output, you +can translate the Python code into C++, Fortran, Java, or some other compiled +language. + +Prototyping means you have to be careful not to use too many Python features +that are hard to implement in your other language. Using ``eval()``, or regular +expressions, or the :mod:`pickle` module, means that you're going to need C or +Java libraries for formula evaluation, regular expressions, and serialization, +for example. But it's not hard to avoid such tricky code, and in the end the +translation usually isn't very difficult. The resulting code can be rapidly +debugged, because any serious logical errors will have been removed from the +prototype, leaving only more minor slip-ups in the translation to track down. + +This strategy builds on the earlier discussion of programmability. Using Python +as glue to connect lower-level components has obvious relevance for constructing +prototype systems. In this way Python can help you with development, even if +end users never come in contact with Python code at all. If the performance of +the Python version is adequate and corporate politics allow it, you may not need +to do a translation into C or Java, but it can still be faster to develop a +prototype and then translate it, instead of attempting to produce the final +version immediately. + +One example of this development strategy is Microsoft Merchant Server. Version +1.0 was written in pure Python, by a company that subsequently was purchased by +Microsoft. Version 2.0 began to translate the code into C++, shipping with some +C++code and some Python code. Version 3.0 didn't contain any Python at all; all +the code had been translated into C++. Even though the product doesn't contain +a Python interpreter, the Python language has still served a useful purpose by +speeding up development. + +This is a very common use for Python. Past conference papers have also +described this approach for developing high-level numerical algorithms; see +David M. Beazley and Peter S. Lomdahl's paper "Feeding a Large-scale Physics +Application to Python" in the references for a good example. If an algorithm's +basic operations are things like "Take the inverse of this 4000x4000 matrix", +and are implemented in some lower-level language, then Python has almost no +additional performance cost; the extra time required for Python to evaluate an +expression like ``m.invert()`` is dwarfed by the cost of the actual computation. +It's particularly good for applications where seemingly endless tweaking is +required to get things right. GUI interfaces and Web sites are prime examples. + +The Python code is also shorter and faster to write (once you're familiar with +Python), so it's easier to throw it away if you decide your approach was wrong; +if you'd spent two weeks working on it instead of just two hours, you might +waste time trying to patch up what you've got out of a natural reluctance to +admit that those two weeks were wasted. Truthfully, those two weeks haven't +been wasted, since you've learnt something about the problem and the technology +you're using to solve it, but it's human nature to view this as a failure of +some sort. + + +Simplicity and Ease of Understanding +------------------------------------ + +Python is definitely *not* a toy language that's only usable for small tasks. +The language features are general and powerful enough to enable it to be used +for many different purposes. It's useful at the small end, for 10- or 20-line +scripts, but it also scales up to larger systems that contain thousands of lines +of code. + +However, this expressiveness doesn't come at the cost of an obscure or tricky +syntax. While Python has some dark corners that can lead to obscure code, there +are relatively few such corners, and proper design can isolate their use to only +a few classes or modules. It's certainly possible to write confusing code by +using too many features with too little concern for clarity, but most Python +code can look a lot like a slightly-formalized version of human-understandable +pseudocode. + +In *The New Hacker's Dictionary*, Eric S. Raymond gives the following definition +for "compact": + +.. epigraph:: + + Compact *adj.* Of a design, describes the valuable property that it can all be + apprehended at once in one's head. This generally means the thing created from + the design can be used with greater facility and fewer errors than an equivalent + tool that is not compact. Compactness does not imply triviality or lack of + power; for example, C is compact and FORTRAN is not, but C is more powerful than + FORTRAN. Designs become non-compact through accreting features and cruft that + don't merge cleanly into the overall design scheme (thus, some fans of Classic C + maintain that ANSI C is no longer compact). + + (From http://www.catb.org/ esr/jargon/html/C/compact.html) + +In this sense of the word, Python is quite compact, because the language has +just a few ideas, which are used in lots of places. Take namespaces, for +example. Import a module with ``import math``, and you create a new namespace +called ``math``. Classes are also namespaces that share many of the properties +of modules, and have a few of their own; for example, you can create instances +of a class. Instances? They're yet another namespace. Namespaces are currently +implemented as Python dictionaries, so they have the same methods as the +standard dictionary data type: .keys() returns all the keys, and so forth. + +This simplicity arises from Python's development history. The language syntax +derives from different sources; ABC, a relatively obscure teaching language, is +one primary influence, and Modula-3 is another. (For more information about ABC +and Modula-3, consult their respective Web sites at http://www.cwi.nl/ +steven/abc/ and http://www.m3.org.) Other features have come from C, Icon, +Algol-68, and even Perl. Python hasn't really innovated very much, but instead +has tried to keep the language small and easy to learn, building on ideas that +have been tried in other languages and found useful. + +Simplicity is a virtue that should not be underestimated. It lets you learn the +language more quickly, and then rapidly write code, code that often works the +first time you run it. + + +Java Integration +---------------- + +If you're working with Java, Jython (http://www.jython.org/) is definitely worth +your attention. Jython is a re-implementation of Python in Java that compiles +Python code into Java bytecodes. The resulting environment has very tight, +almost seamless, integration with Java. It's trivial to access Java classes +from Python, and you can write Python classes that subclass Java classes. +Jython can be used for prototyping Java applications in much the same way +CPython is used, and it can also be used for test suites for Java code, or +embedded in a Java application to add scripting capabilities. + + +Arguments and Rebuttals +======================= + +Let's say that you've decided upon Python as the best choice for your +application. How can you convince your management, or your fellow developers, +to use Python? This section lists some common arguments against using Python, +and provides some possible rebuttals. + +**Python is freely available software that doesn't cost anything. How good can +it be?** + +Very good, indeed. These days Linux and Apache, two other pieces of open source +software, are becoming more respected as alternatives to commercial software, +but Python hasn't had all the publicity. + +Python has been around for several years, with many users and developers. +Accordingly, the interpreter has been used by many people, and has gotten most +of the bugs shaken out of it. While bugs are still discovered at intervals, +they're usually either quite obscure (they'd have to be, for no one to have run +into them before) or they involve interfaces to external libraries. The +internals of the language itself are quite stable. + +Having the source code should be viewed as making the software available for +peer review; people can examine the code, suggest (and implement) improvements, +and track down bugs. To find out more about the idea of open source code, along +with arguments and case studies supporting it, go to http://www.opensource.org. + +**Who's going to support it?** + +Python has a sizable community of developers, and the number is still growing. +The Internet community surrounding the language is an active one, and is worth +being considered another one of Python's advantages. Most questions posted to +the comp.lang.python newsgroup are quickly answered by someone. + +Should you need to dig into the source code, you'll find it's clear and +well-organized, so it's not very difficult to write extensions and track down +bugs yourself. If you'd prefer to pay for support, there are companies and +individuals who offer commercial support for Python. + +**Who uses Python for serious work?** + +Lots of people; one interesting thing about Python is the surprising diversity +of applications that it's been used for. People are using Python to: + +* Run Web sites + +* Write GUI interfaces + +* Control number-crunching code on supercomputers + +* Make a commercial application scriptable by embedding the Python interpreter + inside it + +* Process large XML data sets + +* Build test suites for C or Java code + +Whatever your application domain is, there's probably someone who's used Python +for something similar. Yet, despite being useable for such high-end +applications, Python's still simple enough to use for little jobs. + +See http://wiki.python.org/moin/OrganizationsUsingPython for a list of some of +the organizations that use Python. + +**What are the restrictions on Python's use?** + +They're practically nonexistent. Consult the :file:`Misc/COPYRIGHT` file in the +source distribution, or http://www.python.org/doc/Copyright.html for the full +language, but it boils down to three conditions. + +* You have to leave the copyright notice on the software; if you don't include + the source code in a product, you have to put the copyright notice in the + supporting documentation. + +* Don't claim that the institutions that have developed Python endorse your + product in any way. + +* If something goes wrong, you can't sue for damages. Practically all software + licences contain this condition. + +Notice that you don't have to provide source code for anything that contains +Python or is built with it. Also, the Python interpreter and accompanying +documentation can be modified and redistributed in any way you like, and you +don't have to pay anyone any licensing fees at all. + +**Why should we use an obscure language like Python instead of well-known +language X?** + +I hope this HOWTO, and the documents listed in the final section, will help +convince you that Python isn't obscure, and has a healthily growing user base. +One word of advice: always present Python's positive advantages, instead of +concentrating on language X's failings. People want to know why a solution is +good, rather than why all the other solutions are bad. So instead of attacking +a competing solution on various grounds, simply show how Python's virtues can +help. + + +Useful Resources +================ + +http://www.pythonology.com/success + The Python Success Stories are a collection of stories from successful users of + Python, with the emphasis on business and corporate users. + +.. % \term{\url{http://www.fsbassociates.com/books/pythonchpt1.htm}} +.. % The first chapter of \emph{Internet Programming with Python} also +.. % examines some of the reasons for using Python. The book is well worth +.. % buying, but the publishers have made the first chapter available on +.. % the Web. + +http://home.pacbell.net/ouster/scripting.html + John Ousterhout's white paper on scripting is a good argument for the utility of + scripting languages, though naturally enough, he emphasizes Tcl, the language he + developed. Most of the arguments would apply to any scripting language. + +http://www.python.org/workshops/1997-10/proceedings/beazley.html + The authors, David M. Beazley and Peter S. Lomdahl, describe their use of + Python at Los Alamos National Laboratory. It's another good example of how + Python can help get real work done. This quotation from the paper has been + echoed by many people: + + .. epigraph:: + + Originally developed as a large monolithic application for massively parallel + processing systems, we have used Python to transform our application into a + flexible, highly modular, and extremely powerful system for performing + simulation, data analysis, and visualization. In addition, we describe how + Python has solved a number of important problems related to the development, + debugging, deployment, and maintenance of scientific software. + +http://pythonjournal.cognizor.com/pyj1/Everitt-Feit_interview98-V1.html + This interview with Andy Feit, discussing Infoseek's use of Python, can be used + to show that choosing Python didn't introduce any difficulties into a company's + development process, and provided some substantial benefits. + +.. % \term{\url{http://www.python.org/psa/Commercial.html}} +.. % Robin Friedrich wrote this document on how to support Python's use in +.. % commercial projects. + +http://www.python.org/workshops/1997-10/proceedings/stein.ps + For the 6th Python conference, Greg Stein presented a paper that traced Python's + adoption and usage at a startup called eShop, and later at Microsoft. + +http://www.opensource.org + Management may be doubtful of the reliability and usefulness of software that + wasn't written commercially. This site presents arguments that show how open + source software can have considerable advantages over closed-source software. + +http://sunsite.unc.edu/LDP/HOWTO/mini/Advocacy.html + The Linux Advocacy mini-HOWTO was the inspiration for this document, and is also + well worth reading for general suggestions on winning acceptance for a new + technology, such as Linux or Python. In general, you won't make much progress + by simply attacking existing systems and complaining about their inadequacies; + this often ends up looking like unfocused whining. It's much better to point + out some of the many areas where Python is an improvement over other systems. + diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst new file mode 100644 index 0000000..e16d07a --- /dev/null +++ b/Doc/howto/curses.rst @@ -0,0 +1,434 @@ +********************************** + Curses Programming with Python +********************************** + +:Author: A.M. Kuchling, Eric S. Raymond +:Release: 2.02 + + +.. topic:: Abstract + + This document describes how to write text-mode programs with Python 2.x, using + the :mod:`curses` extension module to control the display. + + +What is curses? +=============== + +The curses library supplies a terminal-independent screen-painting and +keyboard-handling facility for text-based terminals; such terminals include +VT100s, the Linux console, and the simulated terminal provided by X11 programs +such as xterm and rxvt. Display terminals support various control codes to +perform common operations such as moving the cursor, scrolling the screen, and +erasing areas. Different terminals use widely differing codes, and often have +their own minor quirks. + +In a world of X displays, one might ask "why bother"? It's true that +character-cell display terminals are an obsolete technology, but there are +niches in which being able to do fancy things with them are still valuable. One +is on small-footprint or embedded Unixes that don't carry an X server. Another +is for tools like OS installers and kernel configurators that may have to run +before X is available. + +The curses library hides all the details of different terminals, and provides +the programmer with an abstraction of a display, containing multiple +non-overlapping windows. The contents of a window can be changed in various +ways-- adding text, erasing it, changing its appearance--and the curses library +will automagically figure out what control codes need to be sent to the terminal +to produce the right output. + +The curses library was originally written for BSD Unix; the later System V +versions of Unix from AT&T added many enhancements and new functions. BSD curses +is no longer maintained, having been replaced by ncurses, which is an +open-source implementation of the AT&T interface. If you're using an +open-source Unix such as Linux or FreeBSD, your system almost certainly uses +ncurses. Since most current commercial Unix versions are based on System V +code, all the functions described here will probably be available. The older +versions of curses carried by some proprietary Unixes may not support +everything, though. + +No one has made a Windows port of the curses module. On a Windows platform, try +the Console module written by Fredrik Lundh. The Console module provides +cursor-addressable text output, plus full support for mouse and keyboard input, +and is available from http://effbot.org/efflib/console. + + +The Python curses module +------------------------ + +Thy Python module is a fairly simple wrapper over the C functions provided by +curses; if you're already familiar with curses programming in C, it's really +easy to transfer that knowledge to Python. The biggest difference is that the +Python interface makes things simpler, by merging different C functions such as +:func:`addstr`, :func:`mvaddstr`, :func:`mvwaddstr`, into a single +:meth:`addstr` method. You'll see this covered in more detail later. + +This HOWTO is simply an introduction to writing text-mode programs with curses +and Python. It doesn't attempt to be a complete guide to the curses API; for +that, see the Python library guide's section on ncurses, and the C manual pages +for ncurses. It will, however, give you the basic ideas. + + +Starting and ending a curses application +======================================== + +Before doing anything, curses must be initialized. This is done by calling the +:func:`initscr` function, which will determine the terminal type, send any +required setup codes to the terminal, and create various internal data +structures. If successful, :func:`initscr` returns a window object representing +the entire screen; this is usually called ``stdscr``, after the name of the +corresponding C variable. :: + + import curses + stdscr = curses.initscr() + +Usually curses applications turn off automatic echoing of keys to the screen, in +order to be able to read keys and only display them under certain circumstances. +This requires calling the :func:`noecho` function. :: + + curses.noecho() + +Applications will also commonly need to react to keys instantly, without +requiring the Enter key to be pressed; this is called cbreak mode, as opposed to +the usual buffered input mode. :: + + curses.cbreak() + +Terminals usually return special keys, such as the cursor keys or navigation +keys such as Page Up and Home, as a multibyte escape sequence. While you could +write your application to expect such sequences and process them accordingly, +curses can do it for you, returning a special value such as +:const:`curses.KEY_LEFT`. To get curses to do the job, you'll have to enable +keypad mode. :: + + stdscr.keypad(1) + +Terminating a curses application is much easier than starting one. You'll need +to call :: + + curses.nocbreak(); stdscr.keypad(0); curses.echo() + +to reverse the curses-friendly terminal settings. Then call the :func:`endwin` +function to restore the terminal to its original operating mode. :: + + curses.endwin() + +A common problem when debugging a curses application is to get your terminal +messed up when the application dies without restoring the terminal to its +previous state. In Python this commonly happens when your code is buggy and +raises an uncaught exception. Keys are no longer be echoed to the screen when +you type them, for example, which makes using the shell difficult. + +In Python you can avoid these complications and make debugging much easier by +importing the module :mod:`curses.wrapper`. It supplies a :func:`wrapper` +function that takes a callable. It does the initializations described above, +and also initializes colors if color support is present. It then runs your +provided callable and finally deinitializes appropriately. The callable is +called inside a try-catch clause which catches exceptions, performs curses +deinitialization, and then passes the exception upwards. Thus, your terminal +won't be left in a funny state on exception. + + +Windows and Pads +================ + +Windows are the basic abstraction in curses. A window object represents a +rectangular area of the screen, and supports various methods to display text, +erase it, allow the user to input strings, and so forth. + +The ``stdscr`` object returned by the :func:`initscr` function is a window +object that covers the entire screen. Many programs may need only this single +window, but you might wish to divide the screen into smaller windows, in order +to redraw or clear them separately. The :func:`newwin` function creates a new +window of a given size, returning the new window object. :: + + begin_x = 20 ; begin_y = 7 + height = 5 ; width = 40 + win = curses.newwin(height, width, begin_y, begin_x) + +A word about the coordinate system used in curses: coordinates are always passed +in the order *y,x*, and the top-left corner of a window is coordinate (0,0). +This breaks a common convention for handling coordinates, where the *x* +coordinate usually comes first. This is an unfortunate difference from most +other computer applications, but it's been part of curses since it was first +written, and it's too late to change things now. + +When you call a method to display or erase text, the effect doesn't immediately +show up on the display. This is because curses was originally written with slow +300-baud terminal connections in mind; with these terminals, minimizing the time +required to redraw the screen is very important. This lets curses accumulate +changes to the screen, and display them in the most efficient manner. For +example, if your program displays some characters in a window, and then clears +the window, there's no need to send the original characters because they'd never +be visible. + +Accordingly, curses requires that you explicitly tell it to redraw windows, +using the :func:`refresh` method of window objects. In practice, this doesn't +really complicate programming with curses much. Most programs go into a flurry +of activity, and then pause waiting for a keypress or some other action on the +part of the user. All you have to do is to be sure that the screen has been +redrawn before pausing to wait for user input, by simply calling +``stdscr.refresh()`` or the :func:`refresh` method of some other relevant +window. + +A pad is a special case of a window; it can be larger than the actual display +screen, and only a portion of it displayed at a time. Creating a pad simply +requires the pad's height and width, while refreshing a pad requires giving the +coordinates of the on-screen area where a subsection of the pad will be +displayed. :: + + pad = curses.newpad(100, 100) + # These loops fill the pad with letters; this is + # explained in the next section + for y in range(0, 100): + for x in range(0, 100): + try: pad.addch(y,x, ord('a') + (x*x+y*y) % 26 ) + except curses.error: pass + + # Displays a section of the pad in the middle of the screen + pad.refresh( 0,0, 5,5, 20,75) + +The :func:`refresh` call displays a section of the pad in the rectangle +extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper +left corner of the displayed section is coordinate (0,0) on the pad. Beyond +that difference, pads are exactly like ordinary windows and support the same +methods. + +If you have multiple windows and pads on screen there is a more efficient way to +go, which will prevent annoying screen flicker at refresh time. Use the +:meth:`noutrefresh` method of each window to update the data structure +representing the desired state of the screen; then change the physical screen to +match the desired state in one go with the function :func:`doupdate`. The +normal :meth:`refresh` method calls :func:`doupdate` as its last act. + + +Displaying Text +=============== + +From a C programmer's point of view, curses may sometimes look like a twisty +maze of functions, all subtly different. For example, :func:`addstr` displays a +string at the current cursor location in the ``stdscr`` window, while +:func:`mvaddstr` moves to a given y,x coordinate first before displaying the +string. :func:`waddstr` is just like :func:`addstr`, but allows specifying a +window to use, instead of using ``stdscr`` by default. :func:`mvwaddstr` follows +similarly. + +Fortunately the Python interface hides all these details; ``stdscr`` is a window +object like any other, and methods like :func:`addstr` accept multiple argument +forms. Usually there are four different forms. + ++---------------------------------+-----------------------------------------------+ +| Form | Description | ++=================================+===============================================+ +| *str* or *ch* | Display the string *str* or character *ch* at | +| | the current position | ++---------------------------------+-----------------------------------------------+ +| *str* or *ch*, *attr* | Display the string *str* or character *ch*, | +| | using attribute *attr* at the current | +| | position | ++---------------------------------+-----------------------------------------------+ +| *y*, *x*, *str* or *ch* | Move to position *y,x* within the window, and | +| | display *str* or *ch* | ++---------------------------------+-----------------------------------------------+ +| *y*, *x*, *str* or *ch*, *attr* | Move to position *y,x* within the window, and | +| | display *str* or *ch*, using attribute *attr* | ++---------------------------------+-----------------------------------------------+ + +Attributes allow displaying text in highlighted forms, such as in boldface, +underline, reverse code, or in color. They'll be explained in more detail in +the next subsection. + +The :func:`addstr` function takes a Python string as the value to be displayed, +while the :func:`addch` functions take a character, which can be either a Python +string of length 1 or an integer. If it's a string, you're limited to +displaying characters between 0 and 255. SVr4 curses provides constants for +extension characters; these constants are integers greater than 255. For +example, :const:`ACS_PLMINUS` is a +/- symbol, and :const:`ACS_ULCORNER` is the +upper left corner of a box (handy for drawing borders). + +Windows remember where the cursor was left after the last operation, so if you +leave out the *y,x* coordinates, the string or character will be displayed +wherever the last operation left off. You can also move the cursor with the +``move(y,x)`` method. Because some terminals always display a flashing cursor, +you may want to ensure that the cursor is positioned in some location where it +won't be distracting; it can be confusing to have the cursor blinking at some +apparently random location. + +If your application doesn't need a blinking cursor at all, you can call +``curs_set(0)`` to make it invisible. Equivalently, and for compatibility with +older curses versions, there's a ``leaveok(bool)`` function. When *bool* is +true, the curses library will attempt to suppress the flashing cursor, and you +won't need to worry about leaving it in odd locations. + + +Attributes and Color +-------------------- + +Characters can be displayed in different ways. Status lines in a text-based +application are commonly shown in reverse video; a text viewer may need to +highlight certain words. curses supports this by allowing you to specify an +attribute for each cell on the screen. + +An attribute is a integer, each bit representing a different attribute. You can +try to display text with multiple attribute bits set, but curses doesn't +guarantee that all the possible combinations are available, or that they're all +visually distinct. That depends on the ability of the terminal being used, so +it's safest to stick to the most commonly available attributes, listed here. + ++----------------------+--------------------------------------+ +| Attribute | Description | ++======================+======================================+ +| :const:`A_BLINK` | Blinking text | ++----------------------+--------------------------------------+ +| :const:`A_BOLD` | Extra bright or bold text | ++----------------------+--------------------------------------+ +| :const:`A_DIM` | Half bright text | ++----------------------+--------------------------------------+ +| :const:`A_REVERSE` | Reverse-video text | ++----------------------+--------------------------------------+ +| :const:`A_STANDOUT` | The best highlighting mode available | ++----------------------+--------------------------------------+ +| :const:`A_UNDERLINE` | Underlined text | ++----------------------+--------------------------------------+ + +So, to display a reverse-video status line on the top line of the screen, you +could code:: + + stdscr.addstr(0, 0, "Current mode: Typing mode", + curses.A_REVERSE) + stdscr.refresh() + +The curses library also supports color on those terminals that provide it, The +most common such terminal is probably the Linux console, followed by color +xterms. + +To use color, you must call the :func:`start_color` function soon after calling +:func:`initscr`, to initialize the default color set (the +:func:`curses.wrapper.wrapper` function does this automatically). Once that's +done, the :func:`has_colors` function returns TRUE if the terminal in use can +actually display color. (Note: curses uses the American spelling 'color', +instead of the Canadian/British spelling 'colour'. If you're used to the +British spelling, you'll have to resign yourself to misspelling it for the sake +of these functions.) + +The curses library maintains a finite number of color pairs, containing a +foreground (or text) color and a background color. You can get the attribute +value corresponding to a color pair with the :func:`color_pair` function; this +can be bitwise-OR'ed with other attributes such as :const:`A_REVERSE`, but +again, such combinations are not guaranteed to work on all terminals. + +An example, which displays a line of text using color pair 1:: + + stdscr.addstr( "Pretty text", curses.color_pair(1) ) + stdscr.refresh() + +As I said before, a color pair consists of a foreground and background color. +:func:`start_color` initializes 8 basic colors when it activates color mode. +They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and +7:white. The curses module defines named constants for each of these colors: +:const:`curses.COLOR_BLACK`, :const:`curses.COLOR_RED`, and so forth. + +The ``init_pair(n, f, b)`` function changes the definition of color pair *n*, to +foreground color f and background color b. Color pair 0 is hard-wired to white +on black, and cannot be changed. + +Let's put all this together. To change color 1 to red text on a white +background, you would call:: + + curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE) + +When you change a color pair, any text already displayed using that color pair +will change to the new colors. You can also display new text in this color +with:: + + stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1) ) + +Very fancy terminals can change the definitions of the actual colors to a given +RGB value. This lets you change color 1, which is usually red, to purple or +blue or any other color you like. Unfortunately, the Linux console doesn't +support this, so I'm unable to try it out, and can't provide any examples. You +can check if your terminal can do this by calling :func:`can_change_color`, +which returns TRUE if the capability is there. If you're lucky enough to have +such a talented terminal, consult your system's man pages for more information. + + +User Input +========== + +The curses library itself offers only very simple input mechanisms. Python's +support adds a text-input widget that makes up some of the lack. + +The most common way to get input to a window is to use its :meth:`getch` method. +:meth:`getch` pauses and waits for the user to hit a key, displaying it if +:func:`echo` has been called earlier. You can optionally specify a coordinate +to which the cursor should be moved before pausing. + +It's possible to change this behavior with the method :meth:`nodelay`. After +``nodelay(1)``, :meth:`getch` for the window becomes non-blocking and returns +``curses.ERR`` (a value of -1) when no input is ready. There's also a +:func:`halfdelay` function, which can be used to (in effect) set a timer on each +:meth:`getch`; if no input becomes available within the number of milliseconds +specified as the argument to :func:`halfdelay`, curses raises an exception. + +The :meth:`getch` method returns an integer; if it's between 0 and 255, it +represents the ASCII code of the key pressed. Values greater than 255 are +special keys such as Page Up, Home, or the cursor keys. You can compare the +value returned to constants such as :const:`curses.KEY_PPAGE`, +:const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`. Usually the main loop of +your program will look something like this:: + + while 1: + c = stdscr.getch() + if c == ord('p'): PrintDocument() + elif c == ord('q'): break # Exit the while() + elif c == curses.KEY_HOME: x = y = 0 + +The :mod:`curses.ascii` module supplies ASCII class membership functions that +take either integer or 1-character-string arguments; these may be useful in +writing more readable tests for your command interpreters. It also supplies +conversion functions that take either integer or 1-character-string arguments +and return the same type. For example, :func:`curses.ascii.ctrl` returns the +control character corresponding to its argument. + +There's also a method to retrieve an entire string, :const:`getstr()`. It isn't +used very often, because its functionality is quite limited; the only editing +keys available are the backspace key and the Enter key, which terminates the +string. It can optionally be limited to a fixed number of characters. :: + + curses.echo() # Enable echoing of characters + + # Get a 15-character string, with the cursor on the top line + s = stdscr.getstr(0,0, 15) + +The Python :mod:`curses.textpad` module supplies something better. With it, you +can turn a window into a text box that supports an Emacs-like set of +keybindings. Various methods of :class:`Textbox` class support editing with +input validation and gathering the edit results either with or without trailing +spaces. See the library documentation on :mod:`curses.textpad` for the +details. + + +For More Information +==================== + +This HOWTO didn't cover some advanced topics, such as screen-scraping or +capturing mouse events from an xterm instance. But the Python library page for +the curses modules is now pretty complete. You should browse it next. + +If you're in doubt about the detailed behavior of any of the ncurses entry +points, consult the manual pages for your curses implementation, whether it's +ncurses or a proprietary Unix vendor's. The manual pages will document any +quirks, and provide complete lists of all the functions, attributes, and +:const:`ACS_\*` characters available to you. + +Because the curses API is so large, some functions aren't supported in the +Python interface, not because they're difficult to implement, but because no one +has needed them yet. Feel free to add them and then submit a patch. Also, we +don't yet have support for the menus or panels libraries associated with +ncurses; feel free to add that. + +If you write an interesting little program, feel free to contribute it as +another demo. We can always use more of them! + +The ncurses FAQ: http://dickey.his.com/ncurses/ncurses.faq.html + diff --git a/Doc/howto/doanddont.rst b/Doc/howto/doanddont.rst new file mode 100644 index 0000000..a322c53 --- /dev/null +++ b/Doc/howto/doanddont.rst @@ -0,0 +1,308 @@ +************************************ + Idioms and Anti-Idioms in Python +************************************ + +:Author: Moshe Zadka + +This document is placed in the public doman. + + +.. topic:: Abstract + + This document can be considered a companion to the tutorial. It shows how to use + Python, and even more importantly, how *not* to use Python. + + +Language Constructs You Should Not Use +====================================== + +While Python has relatively few gotchas compared to other languages, it still +has some constructs which are only useful in corner cases, or are plain +dangerous. + + +from module import \* +--------------------- + + +Inside Function Definitions +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``from module import *`` is *invalid* inside function definitions. While many +versions of Python do not check for the invalidity, it does not make it more +valid, no more then having a smart lawyer makes a man innocent. Do not use it +like that ever. Even in versions where it was accepted, it made the function +execution slower, because the compiler could not be certain which names are +local and which are global. In Python 2.1 this construct causes warnings, and +sometimes even errors. + + +At Module Level +^^^^^^^^^^^^^^^ + +While it is valid to use ``from module import *`` at module level it is usually +a bad idea. For one, this loses an important property Python otherwise has --- +you can know where each toplevel name is defined by a simple "search" function +in your favourite editor. You also open yourself to trouble in the future, if +some module grows additional functions or classes. + +One of the most awful question asked on the newsgroup is why this code:: + + f = open("www") + f.read() + +does not work. Of course, it works just fine (assuming you have a file called +"www".) But it does not work if somewhere in the module, the statement ``from os +import *`` is present. The :mod:`os` module has a function called :func:`open` +which returns an integer. While it is very useful, shadowing builtins is one of +its least useful properties. + +Remember, you can never know for sure what names a module exports, so either +take what you need --- ``from module import name1, name2``, or keep them in the +module and access on a per-need basis --- ``import module;print module.name``. + + +When It Is Just Fine +^^^^^^^^^^^^^^^^^^^^ + +There are situations in which ``from module import *`` is just fine: + +* The interactive prompt. For example, ``from math import *`` makes Python an + amazing scientific calculator. + +* When extending a module in C with a module in Python. + +* When the module advertises itself as ``from import *`` safe. + + +Unadorned :keyword:`exec` and friends +------------------------------------- + +The word "unadorned" refers to the use without an explicit dictionary, in which +case those constructs evaluate code in the *current* environment. This is +dangerous for the same reasons ``from import *`` is dangerous --- it might step +over variables you are counting on and mess up things for the rest of your code. +Simply do not do that. + +Bad examples:: + + >>> for name in sys.argv[1:]: + >>> exec "%s=1" % name + >>> def func(s, **kw): + >>> for var, val in kw.items(): + >>> exec "s.%s=val" % var # invalid! + >>> exec(open("handler.py").read()) + >>> handle() + +Good examples:: + + >>> d = {} + >>> for name in sys.argv[1:]: + >>> d[name] = 1 + >>> def func(s, **kw): + >>> for var, val in kw.items(): + >>> setattr(s, var, val) + >>> d={} + >>> exec(open("handle.py").read(), d, d) + >>> handle = d['handle'] + >>> handle() + + +from module import name1, name2 +------------------------------- + +This is a "don't" which is much weaker then the previous "don't"s but is still +something you should not do if you don't have good reasons to do that. The +reason it is usually bad idea is because you suddenly have an object which lives +in two seperate namespaces. When the binding in one namespace changes, the +binding in the other will not, so there will be a discrepancy between them. This +happens when, for example, one module is reloaded, or changes the definition of +a function at runtime. + +Bad example:: + + # foo.py + a = 1 + + # bar.py + from foo import a + if something(): + a = 2 # danger: foo.a != a + +Good example:: + + # foo.py + a = 1 + + # bar.py + import foo + if something(): + foo.a = 2 + + +except: +------- + +Python has the ``except:`` clause, which catches all exceptions. Since *every* +error in Python raises an exception, this makes many programming errors look +like runtime problems, and hinders the debugging process. + +The following code shows a great example:: + + try: + foo = opne("file") # misspelled "open" + except: + sys.exit("could not open file!") + +The second line triggers a :exc:`NameError` which is caught by the except +clause. The program will exit, and you will have no idea that this has nothing +to do with the readability of ``"file"``. + +The example above is better written :: + + try: + foo = opne("file") # will be changed to "open" as soon as we run it + except IOError: + sys.exit("could not open file") + +There are some situations in which the ``except:`` clause is useful: for +example, in a framework when running callbacks, it is good not to let any +callback disturb the framework. + + +Exceptions +========== + +Exceptions are a useful feature of Python. You should learn to raise them +whenever something unexpected occurs, and catch them only where you can do +something about them. + +The following is a very popular anti-idiom :: + + def get_status(file): + if not os.path.exists(file): + print "file not found" + sys.exit(1) + return open(file).readline() + +Consider the case the file gets deleted between the time the call to +:func:`os.path.exists` is made and the time :func:`open` is called. That means +the last line will throw an :exc:`IOError`. The same would happen if *file* +exists but has no read permission. Since testing this on a normal machine on +existing and non-existing files make it seem bugless, that means in testing the +results will seem fine, and the code will get shipped. Then an unhandled +:exc:`IOError` escapes to the user, who has to watch the ugly traceback. + +Here is a better way to do it. :: + + def get_status(file): + try: + return open(file).readline() + except (IOError, OSError): + print "file not found" + sys.exit(1) + +In this version, \*either\* the file gets opened and the line is read (so it +works even on flaky NFS or SMB connections), or the message is printed and the +application aborted. + +Still, :func:`get_status` makes too many assumptions --- that it will only be +used in a short running script, and not, say, in a long running server. Sure, +the caller could do something like :: + + try: + status = get_status(log) + except SystemExit: + status = None + +So, try to make as few ``except`` clauses in your code --- those will usually be +a catch-all in the :func:`main`, or inside calls which should always succeed. + +So, the best version is probably :: + + def get_status(file): + return open(file).readline() + +The caller can deal with the exception if it wants (for example, if it tries +several files in a loop), or just let the exception filter upwards to *its* +caller. + +The last version is not very good either --- due to implementation details, the +file would not be closed when an exception is raised until the handler finishes, +and perhaps not at all in non-C implementations (e.g., Jython). :: + + def get_status(file): + fp = open(file) + try: + return fp.readline() + finally: + fp.close() + + +Using the Batteries +=================== + +Every so often, people seem to be writing stuff in the Python library again, +usually poorly. While the occasional module has a poor interface, it is usually +much better to use the rich standard library and data types that come with +Python then inventing your own. + +A useful module very few people know about is :mod:`os.path`. It always has the +correct path arithmetic for your operating system, and will usually be much +better then whatever you come up with yourself. + +Compare:: + + # ugh! + return dir+"/"+file + # better + return os.path.join(dir, file) + +More useful functions in :mod:`os.path`: :func:`basename`, :func:`dirname` and +:func:`splitext`. + +There are also many useful builtin functions people seem not to be aware of for +some reason: :func:`min` and :func:`max` can find the minimum/maximum of any +sequence with comparable semantics, for example, yet many people write their own +:func:`max`/:func:`min`. Another highly useful function is :func:`reduce`. A +classical use of :func:`reduce` is something like :: + + import sys, operator + nums = map(float, sys.argv[1:]) + print reduce(operator.add, nums)/len(nums) + +This cute little script prints the average of all numbers given on the command +line. The :func:`reduce` adds up all the numbers, and the rest is just some +pre- and postprocessing. + +On the same note, note that :func:`float`, :func:`int` and :func:`long` all +accept arguments of type string, and so are suited to parsing --- assuming you +are ready to deal with the :exc:`ValueError` they raise. + + +Using Backslash to Continue Statements +====================================== + +Since Python treats a newline as a statement terminator, and since statements +are often more then is comfortable to put in one line, many people do:: + + if foo.bar()['first'][0] == baz.quux(1, 2)[5:9] and \ + calculate_number(10, 20) != forbulate(500, 360): + pass + +You should realize that this is dangerous: a stray space after the ``XXX`` would +make this line wrong, and stray spaces are notoriously hard to see in editors. +In this case, at least it would be a syntax error, but if the code was:: + + value = foo.bar()['first'][0]*baz.quux(1, 2)[5:9] \ + + calculate_number(10, 20)*forbulate(500, 360) + +then it would just be subtly wrong. + +It is usually much better to use the implicit continuation inside parenthesis: + +This version is bulletproof:: + + value = (foo.bar()['first'][0]*baz.quux(1, 2)[5:9] + + calculate_number(10, 20)*forbulate(500, 360)) + diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst new file mode 100644 index 0000000..bc12793 --- /dev/null +++ b/Doc/howto/functional.rst @@ -0,0 +1,1400 @@ +******************************** + Functional Programming HOWTO +******************************** + +:Author: \A. M. Kuchling +:Release: 0.30 + +(This is a first draft. Please send comments/error reports/suggestions to +amk@amk.ca. This URL is probably not going to be the final location of the +document, so be careful about linking to it -- you may want to add a +disclaimer.) + +In this document, we'll take a tour of Python's features suitable for +implementing programs in a functional style. After an introduction to the +concepts of functional programming, we'll look at language features such as +iterators and generators and relevant library modules such as :mod:`itertools` +and :mod:`functools`. + + +Introduction +============ + +This section explains the basic concept of functional programming; if you're +just interested in learning about Python language features, skip to the next +section. + +Programming languages support decomposing problems in several different ways: + +* Most programming languages are **procedural**: programs are lists of + instructions that tell the computer what to do with the program's input. C, + Pascal, and even Unix shells are procedural languages. + +* In **declarative** languages, you write a specification that describes the + problem to be solved, and the language implementation figures out how to + perform the computation efficiently. SQL is the declarative language you're + most likely to be familiar with; a SQL query describes the data set you want + to retrieve, and the SQL engine decides whether to scan tables or use indexes, + which subclauses should be performed first, etc. + +* **Object-oriented** programs manipulate collections of objects. Objects have + internal state and support methods that query or modify this internal state in + some way. Smalltalk and Java are object-oriented languages. C++ and Python + are languages that support object-oriented programming, but don't force the + use of object-oriented features. + +* **Functional** programming decomposes a problem into a set of functions. + Ideally, functions only take inputs and produce outputs, and don't have any + internal state that affects the output produced for a given input. Well-known + functional languages include the ML family (Standard ML, OCaml, and other + variants) and Haskell. + +The designers of some computer languages have chosen one approach to programming +that's emphasized. This often makes it difficult to write programs that use a +different approach. Other languages are multi-paradigm languages that support +several different approaches. Lisp, C++, and Python are multi-paradigm; you can +write programs or libraries that are largely procedural, object-oriented, or +functional in all of these languages. In a large program, different sections +might be written using different approaches; the GUI might be object-oriented +while the processing logic is procedural or functional, for example. + +In a functional program, input flows through a set of functions. Each function +operates on its input and produces some output. Functional style frowns upon +functions with side effects that modify internal state or make other changes +that aren't visible in the function's return value. Functions that have no side +effects at all are called **purely functional**. Avoiding side effects means +not using data structures that get updated as a program runs; every function's +output must only depend on its input. + +Some languages are very strict about purity and don't even have assignment +statements such as ``a=3`` or ``c = a + b``, but it's difficult to avoid all +side effects. Printing to the screen or writing to a disk file are side +effects, for example. For example, in Python a ``print`` statement or a +``time.sleep(1)`` both return no useful value; they're only called for their +side effects of sending some text to the screen or pausing execution for a +second. + +Python programs written in functional style usually won't go to the extreme of +avoiding all I/O or all assignments; instead, they'll provide a +functional-appearing interface but will use non-functional features internally. +For example, the implementation of a function will still use assignments to +local variables, but won't modify global variables or have other side effects. + +Functional programming can be considered the opposite of object-oriented +programming. Objects are little capsules containing some internal state along +with a collection of method calls that let you modify this state, and programs +consist of making the right set of state changes. Functional programming wants +to avoid state changes as much as possible and works with data flowing between +functions. In Python you might combine the two approaches by writing functions +that take and return instances representing objects in your application (e-mail +messages, transactions, etc.). + +Functional design may seem like an odd constraint to work under. Why should you +avoid objects and side effects? There are theoretical and practical advantages +to the functional style: + +* Formal provability. +* Modularity. +* Composability. +* Ease of debugging and testing. + +Formal provability +------------------ + +A theoretical benefit is that it's easier to construct a mathematical proof that +a functional program is correct. + +For a long time researchers have been interested in finding ways to +mathematically prove programs correct. This is different from testing a program +on numerous inputs and concluding that its output is usually correct, or reading +a program's source code and concluding that the code looks right; the goal is +instead a rigorous proof that a program produces the right result for all +possible inputs. + +The technique used to prove programs correct is to write down **invariants**, +properties of the input data and of the program's variables that are always +true. For each line of code, you then show that if invariants X and Y are true +**before** the line is executed, the slightly different invariants X' and Y' are +true **after** the line is executed. This continues until you reach the end of +the program, at which point the invariants should match the desired conditions +on the program's output. + +Functional programming's avoidance of assignments arose because assignments are +difficult to handle with this technique; assignments can break invariants that +were true before the assignment without producing any new invariants that can be +propagated onward. + +Unfortunately, proving programs correct is largely impractical and not relevant +to Python software. Even trivial programs require proofs that are several pages +long; the proof of correctness for a moderately complicated program would be +enormous, and few or none of the programs you use daily (the Python interpreter, +your XML parser, your web browser) could be proven correct. Even if you wrote +down or generated a proof, there would then be the question of verifying the +proof; maybe there's an error in it, and you wrongly believe you've proved the +program correct. + +Modularity +---------- + +A more practical benefit of functional programming is that it forces you to +break apart your problem into small pieces. Programs are more modular as a +result. It's easier to specify and write a small function that does one thing +than a large function that performs a complicated transformation. Small +functions are also easier to read and to check for errors. + + +Ease of debugging and testing +----------------------------- + +Testing and debugging a functional-style program is easier. + +Debugging is simplified because functions are generally small and clearly +specified. When a program doesn't work, each function is an interface point +where you can check that the data are correct. You can look at the intermediate +inputs and outputs to quickly isolate the function that's responsible for a bug. + +Testing is easier because each function is a potential subject for a unit test. +Functions don't depend on system state that needs to be replicated before +running a test; instead you only have to synthesize the right input and then +check that the output matches expectations. + + + +Composability +------------- + +As you work on a functional-style program, you'll write a number of functions +with varying inputs and outputs. Some of these functions will be unavoidably +specialized to a particular application, but others will be useful in a wide +variety of programs. For example, a function that takes a directory path and +returns all the XML files in the directory, or a function that takes a filename +and returns its contents, can be applied to many different situations. + +Over time you'll form a personal library of utilities. Often you'll assemble +new programs by arranging existing functions in a new configuration and writing +a few functions specialized for the current task. + + + +Iterators +========= + +I'll start by looking at a Python language feature that's an important +foundation for writing functional-style programs: iterators. + +An iterator is an object representing a stream of data; this object returns the +data one element at a time. A Python iterator must support a method called +``next()`` that takes no arguments and always returns the next element of the +stream. If there are no more elements in the stream, ``next()`` must raise the +``StopIteration`` exception. Iterators don't have to be finite, though; it's +perfectly reasonable to write an iterator that produces an infinite stream of +data. + +The built-in :func:`iter` function takes an arbitrary object and tries to return +an iterator that will return the object's contents or elements, raising +:exc:`TypeError` if the object doesn't support iteration. Several of Python's +built-in data types support iteration, the most common being lists and +dictionaries. An object is called an **iterable** object if you can get an +iterator for it. + +You can experiment with the iteration interface manually:: + + >>> L = [1,2,3] + >>> it = iter(L) + >>> print it + + >>> it.next() + 1 + >>> it.next() + 2 + >>> it.next() + 3 + >>> it.next() + Traceback (most recent call last): + File "", line 1, in ? + StopIteration + >>> + +Python expects iterable objects in several different contexts, the most +important being the ``for`` statement. In the statement ``for X in Y``, Y must +be an iterator or some object for which ``iter()`` can create an iterator. +These two statements are equivalent:: + + for i in iter(obj): + print i + + for i in obj: + print i + +Iterators can be materialized as lists or tuples by using the :func:`list` or +:func:`tuple` constructor functions:: + + >>> L = [1,2,3] + >>> iterator = iter(L) + >>> t = tuple(iterator) + >>> t + (1, 2, 3) + +Sequence unpacking also supports iterators: if you know an iterator will return +N elements, you can unpack them into an N-tuple:: + + >>> L = [1,2,3] + >>> iterator = iter(L) + >>> a,b,c = iterator + >>> a,b,c + (1, 2, 3) + +Built-in functions such as :func:`max` and :func:`min` can take a single +iterator argument and will return the largest or smallest element. The ``"in"`` +and ``"not in"`` operators also support iterators: ``X in iterator`` is true if +X is found in the stream returned by the iterator. You'll run into obvious +problems if the iterator is infinite; ``max()``, ``min()``, and ``"not in"`` +will never return, and if the element X never appears in the stream, the +``"in"`` operator won't return either. + +Note that you can only go forward in an iterator; there's no way to get the +previous element, reset the iterator, or make a copy of it. Iterator objects +can optionally provide these additional capabilities, but the iterator protocol +only specifies the ``next()`` method. Functions may therefore consume all of +the iterator's output, and if you need to do something different with the same +stream, you'll have to create a new iterator. + + + +Data Types That Support Iterators +--------------------------------- + +We've already seen how lists and tuples support iterators. In fact, any Python +sequence type, such as strings, will automatically support creation of an +iterator. + +Calling :func:`iter` on a dictionary returns an iterator that will loop over the +dictionary's keys:: + + >>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, + ... 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12} + >>> for key in m: + ... print key, m[key] + Mar 3 + Feb 2 + Aug 8 + Sep 9 + May 5 + Jun 6 + Jul 7 + Jan 1 + Apr 4 + Nov 11 + Dec 12 + Oct 10 + +Note that the order is essentially random, because it's based on the hash +ordering of the objects in the dictionary. + +Applying ``iter()`` to a dictionary always loops over the keys, but dictionaries +have methods that return other iterators. If you want to iterate over keys, +values, or key/value pairs, you can explicitly call the ``iterkeys()``, +``itervalues()``, or ``iteritems()`` methods to get an appropriate iterator. + +The :func:`dict` constructor can accept an iterator that returns a finite stream +of ``(key, value)`` tuples:: + + >>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')] + >>> dict(iter(L)) + {'Italy': 'Rome', 'US': 'Washington DC', 'France': 'Paris'} + +Files also support iteration by calling the ``readline()`` method until there +are no more lines in the file. This means you can read each line of a file like +this:: + + for line in file: + # do something for each line + ... + +Sets can take their contents from an iterable and let you iterate over the set's +elements:: + + S = set((2, 3, 5, 7, 11, 13)) + for i in S: + print i + + + +Generator expressions and list comprehensions +============================================= + +Two common operations on an iterator's output are 1) performing some operation +for every element, 2) selecting a subset of elements that meet some condition. +For example, given a list of strings, you might want to strip off trailing +whitespace from each line or extract all the strings containing a given +substring. + +List comprehensions and generator expressions (short form: "listcomps" and +"genexps") are a concise notation for such operations, borrowed from the +functional programming language Haskell (http://www.haskell.org). You can strip +all the whitespace from a stream of strings with the following code:: + + line_list = [' line 1\n', 'line 2 \n', ...] + + # Generator expression -- returns iterator + stripped_iter = (line.strip() for line in line_list) + + # List comprehension -- returns list + stripped_list = [line.strip() for line in line_list] + +You can select only certain elements by adding an ``"if"`` condition:: + + stripped_list = [line.strip() for line in line_list + if line != ""] + +With a list comprehension, you get back a Python list; ``stripped_list`` is a +list containing the resulting lines, not an iterator. Generator expressions +return an iterator that computes the values as necessary, not needing to +materialize all the values at once. This means that list comprehensions aren't +useful if you're working with iterators that return an infinite stream or a very +large amount of data. Generator expressions are preferable in these situations. + +Generator expressions are surrounded by parentheses ("()") and list +comprehensions are surrounded by square brackets ("[]"). Generator expressions +have the form:: + + ( expression for expr in sequence1 + if condition1 + for expr2 in sequence2 + if condition2 + for expr3 in sequence3 ... + if condition3 + for exprN in sequenceN + if conditionN ) + +Again, for a list comprehension only the outside brackets are different (square +brackets instead of parentheses). + +The elements of the generated output will be the successive values of +``expression``. The ``if`` clauses are all optional; if present, ``expression`` +is only evaluated and added to the result when ``condition`` is true. + +Generator expressions always have to be written inside parentheses, but the +parentheses signalling a function call also count. If you want to create an +iterator that will be immediately passed to a function you can write:: + + obj_total = sum(obj.count for obj in list_all_objects()) + +The ``for...in`` clauses contain the sequences to be iterated over. The +sequences do not have to be the same length, because they are iterated over from +left to right, **not** in parallel. For each element in ``sequence1``, +``sequence2`` is looped over from the beginning. ``sequence3`` is then looped +over for each resulting pair of elements from ``sequence1`` and ``sequence2``. + +To put it another way, a list comprehension or generator expression is +equivalent to the following Python code:: + + for expr1 in sequence1: + if not (condition1): + continue # Skip this element + for expr2 in sequence2: + if not (condition2): + continue # Skip this element + ... + for exprN in sequenceN: + if not (conditionN): + continue # Skip this element + + # Output the value of + # the expression. + +This means that when there are multiple ``for...in`` clauses but no ``if`` +clauses, the length of the resulting output will be equal to the product of the +lengths of all the sequences. If you have two lists of length 3, the output +list is 9 elements long:: + + seq1 = 'abc' + seq2 = (1,2,3) + >>> [ (x,y) for x in seq1 for y in seq2] + [('a', 1), ('a', 2), ('a', 3), + ('b', 1), ('b', 2), ('b', 3), + ('c', 1), ('c', 2), ('c', 3)] + +To avoid introducing an ambiguity into Python's grammar, if ``expression`` is +creating a tuple, it must be surrounded with parentheses. The first list +comprehension below is a syntax error, while the second one is correct:: + + # Syntax error + [ x,y for x in seq1 for y in seq2] + # Correct + [ (x,y) for x in seq1 for y in seq2] + + +Generators +========== + +Generators are a special class of functions that simplify the task of writing +iterators. Regular functions compute a value and return it, but generators +return an iterator that returns a stream of values. + +You're doubtless familiar with how regular function calls work in Python or C. +When you call a function, it gets a private namespace where its local variables +are created. When the function reaches a ``return`` statement, the local +variables are destroyed and the value is returned to the caller. A later call +to the same function creates a new private namespace and a fresh set of local +variables. But, what if the local variables weren't thrown away on exiting a +function? What if you could later resume the function where it left off? This +is what generators provide; they can be thought of as resumable functions. + +Here's the simplest example of a generator function:: + + def generate_ints(N): + for i in range(N): + yield i + +Any function containing a ``yield`` keyword is a generator function; this is +detected by Python's bytecode compiler which compiles the function specially as +a result. + +When you call a generator function, it doesn't return a single value; instead it +returns a generator object that supports the iterator protocol. On executing +the ``yield`` expression, the generator outputs the value of ``i``, similar to a +``return`` statement. The big difference between ``yield`` and a ``return`` +statement is that on reaching a ``yield`` the generator's state of execution is +suspended and local variables are preserved. On the next call to the +generator's ``.next()`` method, the function will resume executing. + +Here's a sample usage of the ``generate_ints()`` generator:: + + >>> gen = generate_ints(3) + >>> gen + + >>> gen.next() + 0 + >>> gen.next() + 1 + >>> gen.next() + 2 + >>> gen.next() + Traceback (most recent call last): + File "stdin", line 1, in ? + File "stdin", line 2, in generate_ints + StopIteration + +You could equally write ``for i in generate_ints(5)``, or ``a,b,c = +generate_ints(3)``. + +Inside a generator function, the ``return`` statement can only be used without a +value, and signals the end of the procession of values; after executing a +``return`` the generator cannot return any further values. ``return`` with a +value, such as ``return 5``, is a syntax error inside a generator function. The +end of the generator's results can also be indicated by raising +``StopIteration`` manually, or by just letting the flow of execution fall off +the bottom of the function. + +You could achieve the effect of generators manually by writing your own class +and storing all the local variables of the generator as instance variables. For +example, returning a list of integers could be done by setting ``self.count`` to +0, and having the ``next()`` method increment ``self.count`` and return it. +However, for a moderately complicated generator, writing a corresponding class +can be much messier. + +The test suite included with Python's library, ``test_generators.py``, contains +a number of more interesting examples. Here's one generator that implements an +in-order traversal of a tree using generators recursively. + +:: + + # A recursive generator that generates Tree leaves in in-order. + def inorder(t): + if t: + for x in inorder(t.left): + yield x + + yield t.label + + for x in inorder(t.right): + yield x + +Two other examples in ``test_generators.py`` produce solutions for the N-Queens +problem (placing N queens on an NxN chess board so that no queen threatens +another) and the Knight's Tour (finding a route that takes a knight to every +square of an NxN chessboard without visiting any square twice). + + + +Passing values into a generator +------------------------------- + +In Python 2.4 and earlier, generators only produced output. Once a generator's +code was invoked to create an iterator, there was no way to pass any new +information into the function when its execution is resumed. You could hack +together this ability by making the generator look at a global variable or by +passing in some mutable object that callers then modify, but these approaches +are messy. + +In Python 2.5 there's a simple way to pass values into a generator. +:keyword:`yield` became an expression, returning a value that can be assigned to +a variable or otherwise operated on:: + + val = (yield i) + +I recommend that you **always** put parentheses around a ``yield`` expression +when you're doing something with the returned value, as in the above example. +The parentheses aren't always necessary, but it's easier to always add them +instead of having to remember when they're needed. + +(PEP 342 explains the exact rules, which are that a ``yield``-expression must +always be parenthesized except when it occurs at the top-level expression on the +right-hand side of an assignment. This means you can write ``val = yield i`` +but have to use parentheses when there's an operation, as in ``val = (yield i) ++ 12``.) + +Values are sent into a generator by calling its ``send(value)`` method. This +method resumes the generator's code and the ``yield`` expression returns the +specified value. If the regular ``next()`` method is called, the ``yield`` +returns ``None``. + +Here's a simple counter that increments by 1 and allows changing the value of +the internal counter. + +:: + + def counter (maximum): + i = 0 + while i < maximum: + val = (yield i) + # If value provided, change counter + if val is not None: + i = val + else: + i += 1 + +And here's an example of changing the counter: + + >>> it = counter(10) + >>> print it.next() + 0 + >>> print it.next() + 1 + >>> print it.send(8) + 8 + >>> print it.next() + 9 + >>> print it.next() + Traceback (most recent call last): + File ``t.py'', line 15, in ? + print it.next() + StopIteration + +Because ``yield`` will often be returning ``None``, you should always check for +this case. Don't just use its value in expressions unless you're sure that the +``send()`` method will be the only method used resume your generator function. + +In addition to ``send()``, there are two other new methods on generators: + +* ``throw(type, value=None, traceback=None)`` is used to raise an exception + inside the generator; the exception is raised by the ``yield`` expression + where the generator's execution is paused. + +* ``close()`` raises a :exc:`GeneratorExit` exception inside the generator to + terminate the iteration. On receiving this exception, the generator's code + must either raise :exc:`GeneratorExit` or :exc:`StopIteration`; catching the + exception and doing anything else is illegal and will trigger a + :exc:`RuntimeError`. ``close()`` will also be called by Python's garbage + collector when the generator is garbage-collected. + + If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I suggest + using a ``try: ... finally:`` suite instead of catching :exc:`GeneratorExit`. + +The cumulative effect of these changes is to turn generators from one-way +producers of information into both producers and consumers. + +Generators also become **coroutines**, a more generalized form of subroutines. +Subroutines are entered at one point and exited at another point (the top of the +function, and a ``return`` statement), but coroutines can be entered, exited, +and resumed at many different points (the ``yield`` statements). + + +Built-in functions +================== + +Let's look in more detail at built-in functions often used with iterators. + +Two Python's built-in functions, :func:`map` and :func:`filter`, are somewhat +obsolete; they duplicate the features of list comprehensions but return actual +lists instead of iterators. + +``map(f, iterA, iterB, ...)`` returns a list containing ``f(iterA[0], iterB[0]), +f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ...``. + +:: + + def upper(s): + return s.upper() + map(upper, ['sentence', 'fragment']) => + ['SENTENCE', 'FRAGMENT'] + + [upper(s) for s in ['sentence', 'fragment']] => + ['SENTENCE', 'FRAGMENT'] + +As shown above, you can achieve the same effect with a list comprehension. The +:func:`itertools.imap` function does the same thing but can handle infinite +iterators; it'll be discussed later, in the section on the :mod:`itertools` module. + +``filter(predicate, iter)`` returns a list that contains all the sequence +elements that meet a certain condition, and is similarly duplicated by list +comprehensions. A **predicate** is a function that returns the truth value of +some condition; for use with :func:`filter`, the predicate must take a single +value. + +:: + + def is_even(x): + return (x % 2) == 0 + + filter(is_even, range(10)) => + [0, 2, 4, 6, 8] + +This can also be written as a list comprehension:: + + >>> [x for x in range(10) if is_even(x)] + [0, 2, 4, 6, 8] + +:func:`filter` also has a counterpart in the :mod:`itertools` module, +:func:`itertools.ifilter`, that returns an iterator and can therefore handle +infinite sequences just as :func:`itertools.imap` can. + +``reduce(func, iter, [initial_value])`` doesn't have a counterpart in the +:mod:`itertools` module because it cumulatively performs an operation on all the +iterable's elements and therefore can't be applied to infinite iterables. +``func`` must be a function that takes two elements and returns a single value. +:func:`reduce` takes the first two elements A and B returned by the iterator and +calculates ``func(A, B)``. It then requests the third element, C, calculates +``func(func(A, B), C)``, combines this result with the fourth element returned, +and continues until the iterable is exhausted. If the iterable returns no +values at all, a :exc:`TypeError` exception is raised. If the initial value is +supplied, it's used as a starting point and ``func(initial_value, A)`` is the +first calculation. + +:: + + import operator + reduce(operator.concat, ['A', 'BB', 'C']) => + 'ABBC' + reduce(operator.concat, []) => + TypeError: reduce() of empty sequence with no initial value + reduce(operator.mul, [1,2,3], 1) => + 6 + reduce(operator.mul, [], 1) => + 1 + +If you use :func:`operator.add` with :func:`reduce`, you'll add up all the +elements of the iterable. This case is so common that there's a special +built-in called :func:`sum` to compute it:: + + reduce(operator.add, [1,2,3,4], 0) => + 10 + sum([1,2,3,4]) => + 10 + sum([]) => + 0 + +For many uses of :func:`reduce`, though, it can be clearer to just write the +obvious :keyword:`for` loop:: + + # Instead of: + product = reduce(operator.mul, [1,2,3], 1) + + # You can write: + product = 1 + for i in [1,2,3]: + product *= i + + +``enumerate(iter)`` counts off the elements in the iterable, returning 2-tuples +containing the count and each element. + +:: + + enumerate(['subject', 'verb', 'object']) => + (0, 'subject'), (1, 'verb'), (2, 'object') + +:func:`enumerate` is often used when looping through a list and recording the +indexes at which certain conditions are met:: + + f = open('data.txt', 'r') + for i, line in enumerate(f): + if line.strip() == '': + print 'Blank line at line #%i' % i + +``sorted(iterable, [cmp=None], [key=None], [reverse=False)`` collects all the +elements of the iterable into a list, sorts the list, and returns the sorted +result. The ``cmp``, ``key``, and ``reverse`` arguments are passed through to +the constructed list's ``.sort()`` method. + +:: + + import random + # Generate 8 random numbers between [0, 10000) + rand_list = random.sample(range(10000), 8) + rand_list => + [769, 7953, 9828, 6431, 8442, 9878, 6213, 2207] + sorted(rand_list) => + [769, 2207, 6213, 6431, 7953, 8442, 9828, 9878] + sorted(rand_list, reverse=True) => + [9878, 9828, 8442, 7953, 6431, 6213, 2207, 769] + +(For a more detailed discussion of sorting, see the Sorting mini-HOWTO in the +Python wiki at http://wiki.python.org/moin/HowTo/Sorting.) + +The ``any(iter)`` and ``all(iter)`` built-ins look at the truth values of an +iterable's contents. :func:`any` returns True if any element in the iterable is +a true value, and :func:`all` returns True if all of the elements are true +values:: + + any([0,1,0]) => + True + any([0,0,0]) => + False + any([1,1,1]) => + True + all([0,1,0]) => + False + all([0,0,0]) => + False + all([1,1,1]) => + True + + +Small functions and the lambda expression +========================================= + +When writing functional-style programs, you'll often need little functions that +act as predicates or that combine elements in some way. + +If there's a Python built-in or a module function that's suitable, you don't +need to define a new function at all:: + + stripped_lines = [line.strip() for line in lines] + existing_files = filter(os.path.exists, file_list) + +If the function you need doesn't exist, you need to write it. One way to write +small functions is to use the ``lambda`` statement. ``lambda`` takes a number +of parameters and an expression combining these parameters, and creates a small +function that returns the value of the expression:: + + lowercase = lambda x: x.lower() + + print_assign = lambda name, value: name + '=' + str(value) + + adder = lambda x, y: x+y + +An alternative is to just use the ``def`` statement and define a function in the +usual way:: + + def lowercase(x): + return x.lower() + + def print_assign(name, value): + return name + '=' + str(value) + + def adder(x,y): + return x + y + +Which alternative is preferable? That's a style question; my usual course is to +avoid using ``lambda``. + +One reason for my preference is that ``lambda`` is quite limited in the +functions it can define. The result has to be computable as a single +expression, which means you can't have multiway ``if... elif... else`` +comparisons or ``try... except`` statements. If you try to do too much in a +``lambda`` statement, you'll end up with an overly complicated expression that's +hard to read. Quick, what's the following code doing? + +:: + + total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1] + +You can figure it out, but it takes time to disentangle the expression to figure +out what's going on. Using a short nested ``def`` statements makes things a +little bit better:: + + def combine (a, b): + return 0, a[1] + b[1] + + total = reduce(combine, items)[1] + +But it would be best of all if I had simply used a ``for`` loop:: + + total = 0 + for a, b in items: + total += b + +Or the :func:`sum` built-in and a generator expression:: + + total = sum(b for a,b in items) + +Many uses of :func:`reduce` are clearer when written as ``for`` loops. + +Fredrik Lundh once suggested the following set of rules for refactoring uses of +``lambda``: + +1) Write a lambda function. +2) Write a comment explaining what the heck that lambda does. +3) Study the comment for a while, and think of a name that captures the essence + of the comment. +4) Convert the lambda to a def statement, using that name. +5) Remove the comment. + +I really like these rules, but you're free to disagree that this lambda-free +style is better. + + +The itertools module +==================== + +The :mod:`itertools` module contains a number of commonly-used iterators as well +as functions for combining several iterators. This section will introduce the +module's contents by showing small examples. + +The module's functions fall into a few broad classes: + +* Functions that create a new iterator based on an existing iterator. +* Functions for treating an iterator's elements as function arguments. +* Functions for selecting portions of an iterator's output. +* A function for grouping an iterator's output. + +Creating new iterators +---------------------- + +``itertools.count(n)`` returns an infinite stream of integers, increasing by 1 +each time. You can optionally supply the starting number, which defaults to 0:: + + itertools.count() => + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... + itertools.count(10) => + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... + +``itertools.cycle(iter)`` saves a copy of the contents of a provided iterable +and returns a new iterator that returns its elements from first to last. The +new iterator will repeat these elements infinitely. + +:: + + itertools.cycle([1,2,3,4,5]) => + 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... + +``itertools.repeat(elem, [n])`` returns the provided element ``n`` times, or +returns the element endlessly if ``n`` is not provided. + +:: + + itertools.repeat('abc') => + abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ... + itertools.repeat('abc', 5) => + abc, abc, abc, abc, abc + +``itertools.chain(iterA, iterB, ...)`` takes an arbitrary number of iterables as +input, and returns all the elements of the first iterator, then all the elements +of the second, and so on, until all of the iterables have been exhausted. + +:: + + itertools.chain(['a', 'b', 'c'], (1, 2, 3)) => + a, b, c, 1, 2, 3 + +``itertools.izip(iterA, iterB, ...)`` takes one element from each iterable and +returns them in a tuple:: + + itertools.izip(['a', 'b', 'c'], (1, 2, 3)) => + ('a', 1), ('b', 2), ('c', 3) + +It's similiar to the built-in :func:`zip` function, but doesn't construct an +in-memory list and exhaust all the input iterators before returning; instead +tuples are constructed and returned only if they're requested. (The technical +term for this behaviour is `lazy evaluation +`__.) + +This iterator is intended to be used with iterables that are all of the same +length. If the iterables are of different lengths, the resulting stream will be +the same length as the shortest iterable. + +:: + + itertools.izip(['a', 'b'], (1, 2, 3)) => + ('a', 1), ('b', 2) + +You should avoid doing this, though, because an element may be taken from the +longer iterators and discarded. This means you can't go on to use the iterators +further because you risk skipping a discarded element. + +``itertools.islice(iter, [start], stop, [step])`` returns a stream that's a +slice of the iterator. With a single ``stop`` argument, it will return the +first ``stop`` elements. If you supply a starting index, you'll get +``stop-start`` elements, and if you supply a value for ``step``, elements will +be skipped accordingly. Unlike Python's string and list slicing, you can't use +negative values for ``start``, ``stop``, or ``step``. + +:: + + itertools.islice(range(10), 8) => + 0, 1, 2, 3, 4, 5, 6, 7 + itertools.islice(range(10), 2, 8) => + 2, 3, 4, 5, 6, 7 + itertools.islice(range(10), 2, 8, 2) => + 2, 4, 6 + +``itertools.tee(iter, [n])`` replicates an iterator; it returns ``n`` +independent iterators that will all return the contents of the source iterator. +If you don't supply a value for ``n``, the default is 2. Replicating iterators +requires saving some of the contents of the source iterator, so this can consume +significant memory if the iterator is large and one of the new iterators is +consumed more than the others. + +:: + + itertools.tee( itertools.count() ) => + iterA, iterB + + where iterA -> + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... + + and iterB -> + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... + + +Calling functions on elements +----------------------------- + +Two functions are used for calling other functions on the contents of an +iterable. + +``itertools.imap(f, iterA, iterB, ...)`` returns a stream containing +``f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ...``:: + + itertools.imap(operator.add, [5, 6, 5], [1, 2, 3]) => + 6, 8, 8 + +The ``operator`` module contains a set of functions corresponding to Python's +operators. Some examples are ``operator.add(a, b)`` (adds two values), +``operator.ne(a, b)`` (same as ``a!=b``), and ``operator.attrgetter('id')`` +(returns a callable that fetches the ``"id"`` attribute). + +``itertools.starmap(func, iter)`` assumes that the iterable will return a stream +of tuples, and calls ``f()`` using these tuples as the arguments:: + + itertools.starmap(os.path.join, + [('/usr', 'bin', 'java'), ('/bin', 'python'), + ('/usr', 'bin', 'perl'),('/usr', 'bin', 'ruby')]) + => + /usr/bin/java, /bin/python, /usr/bin/perl, /usr/bin/ruby + + +Selecting elements +------------------ + +Another group of functions chooses a subset of an iterator's elements based on a +predicate. + +``itertools.ifilter(predicate, iter)`` returns all the elements for which the +predicate returns true:: + + def is_even(x): + return (x % 2) == 0 + + itertools.ifilter(is_even, itertools.count()) => + 0, 2, 4, 6, 8, 10, 12, 14, ... + +``itertools.ifilterfalse(predicate, iter)`` is the opposite, returning all +elements for which the predicate returns false:: + + itertools.ifilterfalse(is_even, itertools.count()) => + 1, 3, 5, 7, 9, 11, 13, 15, ... + +``itertools.takewhile(predicate, iter)`` returns elements for as long as the +predicate returns true. Once the predicate returns false, the iterator will +signal the end of its results. + +:: + + def less_than_10(x): + return (x < 10) + + itertools.takewhile(less_than_10, itertools.count()) => + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + + itertools.takewhile(is_even, itertools.count()) => + 0 + +``itertools.dropwhile(predicate, iter)`` discards elements while the predicate +returns true, and then returns the rest of the iterable's results. + +:: + + itertools.dropwhile(less_than_10, itertools.count()) => + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ... + + itertools.dropwhile(is_even, itertools.count()) => + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... + + +Grouping elements +----------------- + +The last function I'll discuss, ``itertools.groupby(iter, key_func=None)``, is +the most complicated. ``key_func(elem)`` is a function that can compute a key +value for each element returned by the iterable. If you don't supply a key +function, the key is simply each element itself. + +``groupby()`` collects all the consecutive elements from the underlying iterable +that have the same key value, and returns a stream of 2-tuples containing a key +value and an iterator for the elements with that key. + +:: + + city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'), + ('Anchorage', 'AK'), ('Nome', 'AK'), + ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'), + ... + ] + + def get_state ((city, state)): + return state + + itertools.groupby(city_list, get_state) => + ('AL', iterator-1), + ('AK', iterator-2), + ('AZ', iterator-3), ... + + where + iterator-1 => + ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL') + iterator-2 => + ('Anchorage', 'AK'), ('Nome', 'AK') + iterator-3 => + ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ') + +``groupby()`` assumes that the underlying iterable's contents will already be +sorted based on the key. Note that the returned iterators also use the +underlying iterable, so you have to consume the results of iterator-1 before +requesting iterator-2 and its corresponding key. + + +The functools module +==================== + +The :mod:`functools` module in Python 2.5 contains some higher-order functions. +A **higher-order function** takes one or more functions as input and returns a +new function. The most useful tool in this module is the +:func:`functools.partial` function. + +For programs written in a functional style, you'll sometimes want to construct +variants of existing functions that have some of the parameters filled in. +Consider a Python function ``f(a, b, c)``; you may wish to create a new function +``g(b, c)`` that's equivalent to ``f(1, b, c)``; you're filling in a value for +one of ``f()``'s parameters. This is called "partial function application". + +The constructor for ``partial`` takes the arguments ``(function, arg1, arg2, +... kwarg1=value1, kwarg2=value2)``. The resulting object is callable, so you +can just call it to invoke ``function`` with the filled-in arguments. + +Here's a small but realistic example:: + + import functools + + def log (message, subsystem): + "Write the contents of 'message' to the specified subsystem." + print '%s: %s' % (subsystem, message) + ... + + server_log = functools.partial(log, subsystem='server') + server_log('Unable to open socket') + + +The operator module +------------------- + +The :mod:`operator` module was mentioned earlier. It contains a set of +functions corresponding to Python's operators. These functions are often useful +in functional-style code because they save you from writing trivial functions +that perform a single operation. + +Some of the functions in this module are: + +* Math operations: ``add()``, ``sub()``, ``mul()``, ``div()``, ``floordiv()``, + ``abs()``, ... +* Logical operations: ``not_()``, ``truth()``. +* Bitwise operations: ``and_()``, ``or_()``, ``invert()``. +* Comparisons: ``eq()``, ``ne()``, ``lt()``, ``le()``, ``gt()``, and ``ge()``. +* Object identity: ``is_()``, ``is_not()``. + +Consult the operator module's documentation for a complete list. + + + +The functional module +--------------------- + +Collin Winter's `functional module `__ +provides a number of more advanced tools for functional programming. It also +reimplements several Python built-ins, trying to make them more intuitive to +those used to functional programming in other languages. + +This section contains an introduction to some of the most important functions in +``functional``; full documentation can be found at `the project's website +`__. + +``compose(outer, inner, unpack=False)`` + +The ``compose()`` function implements function composition. In other words, it +returns a wrapper around the ``outer`` and ``inner`` callables, such that the +return value from ``inner`` is fed directly to ``outer``. That is, + +:: + + >>> def add(a, b): + ... return a + b + ... + >>> def double(a): + ... return 2 * a + ... + >>> compose(double, add)(5, 6) + 22 + +is equivalent to + +:: + + >>> double(add(5, 6)) + 22 + +The ``unpack`` keyword is provided to work around the fact that Python functions +are not always `fully curried `__. By +default, it is expected that the ``inner`` function will return a single object +and that the ``outer`` function will take a single argument. Setting the +``unpack`` argument causes ``compose`` to expect a tuple from ``inner`` which +will be expanded before being passed to ``outer``. Put simply, + +:: + + compose(f, g)(5, 6) + +is equivalent to:: + + f(g(5, 6)) + +while + +:: + + compose(f, g, unpack=True)(5, 6) + +is equivalent to:: + + f(*g(5, 6)) + +Even though ``compose()`` only accepts two functions, it's trivial to build up a +version that will compose any number of functions. We'll use ``reduce()``, +``compose()`` and ``partial()`` (the last of which is provided by both +``functional`` and ``functools``). + +:: + + from functional import compose, partial + + multi_compose = partial(reduce, compose) + + +We can also use ``map()``, ``compose()`` and ``partial()`` to craft a version of +``"".join(...)`` that converts its arguments to string:: + + from functional import compose, partial + + join = compose("".join, partial(map, str)) + + +``flip(func)`` + +``flip()`` wraps the callable in ``func`` and causes it to receive its +non-keyword arguments in reverse order. + +:: + + >>> def triple(a, b, c): + ... return (a, b, c) + ... + >>> triple(5, 6, 7) + (5, 6, 7) + >>> + >>> flipped_triple = flip(triple) + >>> flipped_triple(5, 6, 7) + (7, 6, 5) + +``foldl(func, start, iterable)`` + +``foldl()`` takes a binary function, a starting value (usually some kind of +'zero'), and an iterable. The function is applied to the starting value and the +first element of the list, then the result of that and the second element of the +list, then the result of that and the third element of the list, and so on. + +This means that a call such as:: + + foldl(f, 0, [1, 2, 3]) + +is equivalent to:: + + f(f(f(0, 1), 2), 3) + + +``foldl()`` is roughly equivalent to the following recursive function:: + + def foldl(func, start, seq): + if len(seq) == 0: + return start + + return foldl(func, func(start, seq[0]), seq[1:]) + +Speaking of equivalence, the above ``foldl`` call can be expressed in terms of +the built-in ``reduce`` like so:: + + reduce(f, [1, 2, 3], 0) + + +We can use ``foldl()``, ``operator.concat()`` and ``partial()`` to write a +cleaner, more aesthetically-pleasing version of Python's ``"".join(...)`` +idiom:: + + from functional import foldl, partial + from operator import concat + + join = partial(foldl, concat, "") + + +Revision History and Acknowledgements +===================================== + +The author would like to thank the following people for offering suggestions, +corrections and assistance with various drafts of this article: Ian Bicking, +Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro +Lameiro, Jussi Salmela, Collin Winter, Blake Winton. + +Version 0.1: posted June 30 2006. + +Version 0.11: posted July 1 2006. Typo fixes. + +Version 0.2: posted July 10 2006. Merged genexp and listcomp sections into one. +Typo fixes. + +Version 0.21: Added more references suggested on the tutor mailing list. + +Version 0.30: Adds a section on the ``functional`` module written by Collin +Winter; adds short section on the operator module; a few other edits. + + +References +========== + +General +------- + +**Structure and Interpretation of Computer Programs**, by Harold Abelson and +Gerald Jay Sussman with Julie Sussman. Full text at +http://mitpress.mit.edu/sicp/. In this classic textbook of computer science, +chapters 2 and 3 discuss the use of sequences and streams to organize the data +flow inside a program. The book uses Scheme for its examples, but many of the +design approaches described in these chapters are applicable to functional-style +Python code. + +http://www.defmacro.org/ramblings/fp.html: A general introduction to functional +programming that uses Java examples and has a lengthy historical introduction. + +http://en.wikipedia.org/wiki/Functional_programming: General Wikipedia entry +describing functional programming. + +http://en.wikipedia.org/wiki/Coroutine: Entry for coroutines. + +http://en.wikipedia.org/wiki/Currying: Entry for the concept of currying. + +Python-specific +--------------- + +http://gnosis.cx/TPiP/: The first chapter of David Mertz's book +:title-reference:`Text Processing in Python` discusses functional programming +for text processing, in the section titled "Utilizing Higher-Order Functions in +Text Processing". + +Mertz also wrote a 3-part series of articles on functional programming +for IBM's DeveloperWorks site; see +`part 1 `__, +`part 2 `__, and +`part 3 `__, + + +Python documentation +-------------------- + +Documentation for the :mod:`itertools` module. + +Documentation for the :mod:`operator` module. + +:pep:`289`: "Generator Expressions" + +:pep:`342`: "Coroutines via Enhanced Generators" describes the new generator +features in Python 2.5. + +.. comment + + Topics to place + ----------------------------- + + XXX os.walk() + + XXX Need a large example. + + But will an example add much? I'll post a first draft and see + what the comments say. + +.. comment + + Original outline: + Introduction + Idea of FP + Programs built out of functions + Functions are strictly input-output, no internal state + Opposed to OO programming, where objects have state + + Why FP? + Formal provability + Assignment is difficult to reason about + Not very relevant to Python + Modularity + Small functions that do one thing + Debuggability: + Easy to test due to lack of state + Easy to verify output from intermediate steps + Composability + You assemble a toolbox of functions that can be mixed + + Tackling a problem + Need a significant example + + Iterators + Generators + The itertools module + List comprehensions + Small functions and the lambda statement + Built-in functions + map + filter + reduce + +.. comment + + Handy little function for printing part of an iterator -- used + while writing this document. + + import itertools + def print_iter(it): + slice = itertools.islice(it, 10) + for elem in slice[:-1]: + sys.stdout.write(str(elem)) + sys.stdout.write(', ') + print elem[-1] + + diff --git a/Doc/howto/index.rst b/Doc/howto/index.rst new file mode 100644 index 0000000..e668856 --- /dev/null +++ b/Doc/howto/index.rst @@ -0,0 +1,25 @@ +*************** + Python HOWTOs +*************** + +Python HOWTOs are documents that cover a single, specific topic, +and attempt to cover it fairly completely. Modelled on the Linux +Documentation Project's HOWTO collection, this collection is an +effort to foster documentation that's more detailed than the +Python Library Reference. + +Currently, the HOWTOs are: + +.. toctree:: + :maxdepth: 1 + + advocacy.rst + pythonmac.rst + curses.rst + doanddont.rst + functional.rst + regex.rst + sockets.rst + unicode.rst + urllib2.rst + diff --git a/Doc/howto/pythonmac.rst b/Doc/howto/pythonmac.rst new file mode 100644 index 0000000..7811f37 --- /dev/null +++ b/Doc/howto/pythonmac.rst @@ -0,0 +1,202 @@ + +.. _using-on-mac: + +*************************** +Using Python on a Macintosh +*************************** + +:Author: Bob Savage + + +Python on a Macintosh running Mac OS X is in principle very similar to Python on +any other Unix platform, but there are a number of additional features such as +the IDE and the Package Manager that are worth pointing out. + +The Mac-specific modules are documented in :ref:`mac-specific-services`. + +Python on Mac OS 9 or earlier can be quite different from Python on Unix or +Windows, but is beyond the scope of this manual, as that platform is no longer +supported, starting with Python 2.4. See http://www.cwi.nl/~jack/macpython for +installers for the latest 2.3 release for Mac OS 9 and related documentation. + + +.. _getting-osx: + +Getting and Installing MacPython +================================ + +Mac OS X 10.4 comes with Python 2.3 pre-installed by Apple. However, you are +encouraged to install the most recent version of Python from the Python website +(http://www.python.org). A "universal binary" build of Python 2.5, which runs +natively on the Mac's new Intel and legacy PPC CPU's, is available there. + +What you get after installing is a number of things: + +* A :file:`MacPython 2.5` folder in your :file:`Applications` folder. In here + you find IDLE, the development environment that is a standard part of official + Python distributions; PythonLauncher, which handles double-clicking Python + scripts from the Finder; and the "Build Applet" tool, which allows you to + package Python scripts as standalone applications on your system. + +* A framework :file:`/Library/Frameworks/Python.framework`, which includes the + Python executable and libraries. The installer adds this location to your shell + path. To uninstall MacPython, you can simply remove these three things. A + symlink to the Python executable is placed in /usr/local/bin/. + +The Apple-provided build of Python is installed in +:file:`/System/Library/Frameworks/Python.framework` and :file:`/usr/bin/python`, +respectively. You should never modify or delete these, as they are +Apple-controlled and are used by Apple- or third-party software. + +IDLE includes a help menu that allows you to access Python documentation. If you +are completely new to Python you should start reading the tutorial introduction +in that document. + +If you are familiar with Python on other Unix platforms you should read the +section on running Python scripts from the Unix shell. + + +How to run a Python script +-------------------------- + +Your best way to get started with Python on Mac OS X is through the IDLE +integrated development environment, see section :ref:`ide` and use the Help menu +when the IDE is running. + +If you want to run Python scripts from the Terminal window command line or from +the Finder you first need an editor to create your script. Mac OS X comes with a +number of standard Unix command line editors, :program:`vim` and +:program:`emacs` among them. If you want a more Mac-like editor, +:program:`BBEdit` or :program:`TextWrangler` from Bare Bones Software (see +http://www.barebones.com/products/bbedit/index.shtml) are good choices, as is +:program:`TextMate` (see http://macromates.com/). Other editors include +:program:`Gvim` (http://macvim.org) and :program:`Aquamacs` +(http://aquamacs.org). + +To run your script from the Terminal window you must make sure that +:file:`/usr/local/bin` is in your shell search path. + +To run your script from the Finder you have two options: + +* Drag it to :program:`PythonLauncher` + +* Select :program:`PythonLauncher` as the default application to open your + script (or any .py script) through the finder Info window and double-click it. + :program:`PythonLauncher` has various preferences to control how your script is + launched. Option-dragging allows you to change these for one invocation, or use + its Preferences menu to change things globally. + + +.. _osx-gui-scripts: + +Running scripts with a GUI +-------------------------- + +With older versions of Python, there is one Mac OS X quirk that you need to be +aware of: programs that talk to the Aqua window manager (in other words, +anything that has a GUI) need to be run in a special way. Use :program:`pythonw` +instead of :program:`python` to start such scripts. + +With Python 2.5, you can use either :program:`python` or :program:`pythonw`. + + +Configuration +------------- + +Python on OS X honors all standard Unix environment variables such as +:envvar:`PYTHONPATH`, but setting these variables for programs started from the +Finder is non-standard as the Finder does not read your :file:`.profile` or +:file:`.cshrc` at startup. You need to create a file :file:`~ +/.MacOSX/environment.plist`. See Apple's Technical Document QA1067 for details. + +For more information on installation Python packages in MacPython, see section +:ref:`mac-package-manager`. + + +.. _ide: + +The IDE +======= + +MacPython ships with the standard IDLE development environment. A good +introduction to using IDLE can be found at http://hkn.eecs.berkeley.edu/ +dyoo/python/idle_intro/index.html. + + +.. _mac-package-manager: + +Installing Additional Python Packages +===================================== + +There are several methods to install additional Python packages: + +* http://pythonmac.org/packages/ contains selected compiled packages for Python + 2.5, 2.4, and 2.3. + +* Packages can be installed via the standard Python distutils mode (``python + setup.py install``). + +* Many packages can also be installed via the :program:`setuptools` extension. + + +GUI Programming on the Mac +========================== + +There are several options for building GUI applications on the Mac with Python. + +*PyObjC* is a Python binding to Apple's Objective-C/Cocoa framework, which is +the foundation of most modern Mac development. Information on PyObjC is +available from http://pyobjc.sourceforge.net. + +The standard Python GUI toolkit is :mod:`Tkinter`, based on the cross-platform +Tk toolkit (http://www.tcl.tk). An Aqua-native version of Tk is bundled with OS +X by Apple, and the latest version can be downloaded and installed from +http://www.activestate.com; it can also be built from source. + +*wxPython* is another popular cross-platform GUI toolkit that runs natively on +Mac OS X. Packages and documentation are available from http://www.wxpython.org. + +*PyQt* is another popular cross-platform GUI toolkit that runs natively on Mac +OS X. More information can be found at +http://www.riverbankcomputing.co.uk/pyqt/. + + +Distributing Python Applications on the Mac +=========================================== + +The "Build Applet" tool that is placed in the MacPython 2.5 folder is fine for +packaging small Python scripts on your own machine to run as a standard Mac +application. This tool, however, is not robust enough to distribute Python +applications to other users. + +The standard tool for deploying standalone Python applications on the Mac is +:program:`py2app`. More information on installing and using py2app can be found +at http://undefined.org/python/#py2app. + + +Application Scripting +===================== + +Python can also be used to script other Mac applications via Apple's Open +Scripting Architecture (OSA); see http://appscript.sourceforge.net. Appscript is +a high-level, user-friendly Apple event bridge that allows you to control +scriptable Mac OS X applications using ordinary Python scripts. Appscript makes +Python a serious alternative to Apple's own *AppleScript* language for +automating your Mac. A related package, *PyOSA*, is an OSA language component +for the Python scripting language, allowing Python code to be executed by any +OSA-enabled application (Script Editor, Mail, iTunes, etc.). PyOSA makes Python +a full peer to AppleScript. + + +Other Resources +=============== + +The MacPython mailing list is an excellent support resource for Python users and +developers on the Mac: + +http://www.python.org/community/sigs/current/pythonmac-sig/ + +Another useful resource is the MacPython wiki: + +http://wiki.python.org/moin/MacPython + diff --git a/Doc/howto/regex.rst b/Doc/howto/regex.rst new file mode 100644 index 0000000..b200764 --- /dev/null +++ b/Doc/howto/regex.rst @@ -0,0 +1,1377 @@ +**************************** + Regular Expression HOWTO +**************************** + +:Author: A.M. Kuchling +:Release: 0.05 + +.. % TODO: +.. % Document lookbehind assertions +.. % Better way of displaying a RE, a string, and what it matches +.. % Mention optional argument to match.groups() +.. % Unicode (at least a reference) + + +.. topic:: Abstract + + This document is an introductory tutorial to using regular expressions in Python + with the :mod:`re` module. It provides a gentler introduction than the + corresponding section in the Library Reference. + + +Introduction +============ + +The :mod:`re` module was added in Python 1.5, and provides Perl-style regular +expression patterns. Earlier versions of Python came with the :mod:`regex` +module, which provided Emacs-style patterns. The :mod:`regex` module was +removed completely in Python 2.5. + +Regular expressions (called REs, or regexes, or regex patterns) are essentially +a tiny, highly specialized programming language embedded inside Python and made +available through the :mod:`re` module. Using this little language, you specify +the rules for the set of possible strings that you want to match; this set might +contain English sentences, or e-mail addresses, or TeX commands, or anything you +like. You can then ask questions such as "Does this string match the pattern?", +or "Is there a match for the pattern anywhere in this string?". You can also +use REs to modify a string or to split it apart in various ways. + +Regular expression patterns are compiled into a series of bytecodes which are +then executed by a matching engine written in C. For advanced use, it may be +necessary to pay careful attention to how the engine will execute a given RE, +and write the RE in a certain way in order to produce bytecode that runs faster. +Optimization isn't covered in this document, because it requires that you have a +good understanding of the matching engine's internals. + +The regular expression language is relatively small and restricted, so not all +possible string processing tasks can be done using regular expressions. There +are also tasks that *can* be done with regular expressions, but the expressions +turn out to be very complicated. In these cases, you may be better off writing +Python code to do the processing; while Python code will be slower than an +elaborate regular expression, it will also probably be more understandable. + + +Simple Patterns +=============== + +We'll start by learning about the simplest possible regular expressions. Since +regular expressions are used to operate on strings, we'll begin with the most +common task: matching characters. + +For a detailed explanation of the computer science underlying regular +expressions (deterministic and non-deterministic finite automata), you can refer +to almost any textbook on writing compilers. + + +Matching Characters +------------------- + +Most letters and characters will simply match themselves. For example, the +regular expression ``test`` will match the string ``test`` exactly. (You can +enable a case-insensitive mode that would let this RE match ``Test`` or ``TEST`` +as well; more about this later.) + +There are exceptions to this rule; some characters are special +:dfn:`metacharacters`, and don't match themselves. Instead, they signal that +some out-of-the-ordinary thing should be matched, or they affect other portions +of the RE by repeating them or changing their meaning. Much of this document is +devoted to discussing various metacharacters and what they do. + +Here's a complete list of the metacharacters; their meanings will be discussed +in the rest of this HOWTO. :: + + . ^ $ * + ? { [ ] \ | ( ) + +The first metacharacters we'll look at are ``[`` and ``]``. They're used for +specifying a character class, which is a set of characters that you wish to +match. Characters can be listed individually, or a range of characters can be +indicated by giving two characters and separating them by a ``'-'``. For +example, ``[abc]`` will match any of the characters ``a``, ``b``, or ``c``; this +is the same as ``[a-c]``, which uses a range to express the same set of +characters. If you wanted to match only lowercase letters, your RE would be +``[a-z]``. + +.. % $ + +Metacharacters are not active inside classes. For example, ``[akm$]`` will +match any of the characters ``'a'``, ``'k'``, ``'m'``, or ``'$'``; ``'$'`` is +usually a metacharacter, but inside a character class it's stripped of its +special nature. + +You can match the characters not listed within the class by :dfn:`complementing` +the set. This is indicated by including a ``'^'`` as the first character of the +class; ``'^'`` outside a character class will simply match the ``'^'`` +character. For example, ``[^5]`` will match any character except ``'5'``. + +Perhaps the most important metacharacter is the backslash, ``\``. As in Python +string literals, the backslash can be followed by various characters to signal +various special sequences. It's also used to escape all the metacharacters so +you can still match them in patterns; for example, if you need to match a ``[`` +or ``\``, you can precede them with a backslash to remove their special +meaning: ``\[`` or ``\\``. + +Some of the special sequences beginning with ``'\'`` represent predefined sets +of characters that are often useful, such as the set of digits, the set of +letters, or the set of anything that isn't whitespace. The following predefined +special sequences are available: + +``\d`` + Matches any decimal digit; this is equivalent to the class ``[0-9]``. + +``\D`` + Matches any non-digit character; this is equivalent to the class ``[^0-9]``. + +``\s`` + Matches any whitespace character; this is equivalent to the class ``[ + \t\n\r\f\v]``. + +``\S`` + Matches any non-whitespace character; this is equivalent to the class ``[^ + \t\n\r\f\v]``. + +``\w`` + Matches any alphanumeric character; this is equivalent to the class + ``[a-zA-Z0-9_]``. + +``\W`` + Matches any non-alphanumeric character; this is equivalent to the class + ``[^a-zA-Z0-9_]``. + +These sequences can be included inside a character class. For example, +``[\s,.]`` is a character class that will match any whitespace character, or +``','`` or ``'.'``. + +The final metacharacter in this section is ``.``. It matches anything except a +newline character, and there's an alternate mode (``re.DOTALL``) where it will +match even a newline. ``'.'`` is often used where you want to match "any +character". + + +Repeating Things +---------------- + +Being able to match varying sets of characters is the first thing regular +expressions can do that isn't already possible with the methods available on +strings. However, if that was the only additional capability of regexes, they +wouldn't be much of an advance. Another capability is that you can specify that +portions of the RE must be repeated a certain number of times. + +The first metacharacter for repeating things that we'll look at is ``*``. ``*`` +doesn't match the literal character ``*``; instead, it specifies that the +previous character can be matched zero or more times, instead of exactly once. + +For example, ``ca*t`` will match ``ct`` (0 ``a`` characters), ``cat`` (1 ``a``), +``caaat`` (3 ``a`` characters), and so forth. The RE engine has various +internal limitations stemming from the size of C's ``int`` type that will +prevent it from matching over 2 billion ``a`` characters; you probably don't +have enough memory to construct a string that large, so you shouldn't run into +that limit. + +Repetitions such as ``*`` are :dfn:`greedy`; when repeating a RE, the matching +engine will try to repeat it as many times as possible. If later portions of the +pattern don't match, the matching engine will then back up and try again with +few repetitions. + +A step-by-step example will make this more obvious. Let's consider the +expression ``a[bcd]*b``. This matches the letter ``'a'``, zero or more letters +from the class ``[bcd]``, and finally ends with a ``'b'``. Now imagine matching +this RE against the string ``abcbd``. + ++------+-----------+---------------------------------+ +| Step | Matched | Explanation | ++======+===========+=================================+ +| 1 | ``a`` | The ``a`` in the RE matches. | ++------+-----------+---------------------------------+ +| 2 | ``abcbd`` | The engine matches ``[bcd]*``, | +| | | going as far as it can, which | +| | | is to the end of the string. | ++------+-----------+---------------------------------+ +| 3 | *Failure* | The engine tries to match | +| | | ``b``, but the current position | +| | | is at the end of the string, so | +| | | it fails. | ++------+-----------+---------------------------------+ +| 4 | ``abcb`` | Back up, so that ``[bcd]*`` | +| | | matches one less character. | ++------+-----------+---------------------------------+ +| 5 | *Failure* | Try ``b`` again, but the | +| | | current position is at the last | +| | | character, which is a ``'d'``. | ++------+-----------+---------------------------------+ +| 6 | ``abc`` | Back up again, so that | +| | | ``[bcd]*`` is only matching | +| | | ``bc``. | ++------+-----------+---------------------------------+ +| 6 | ``abcb`` | Try ``b`` again. This time | +| | | but the character at the | +| | | current position is ``'b'``, so | +| | | it succeeds. | ++------+-----------+---------------------------------+ + +The end of the RE has now been reached, and it has matched ``abcb``. This +demonstrates how the matching engine goes as far as it can at first, and if no +match is found it will then progressively back up and retry the rest of the RE +again and again. It will back up until it has tried zero matches for +``[bcd]*``, and if that subsequently fails, the engine will conclude that the +string doesn't match the RE at all. + +Another repeating metacharacter is ``+``, which matches one or more times. Pay +careful attention to the difference between ``*`` and ``+``; ``*`` matches +*zero* or more times, so whatever's being repeated may not be present at all, +while ``+`` requires at least *one* occurrence. To use a similar example, +``ca+t`` will match ``cat`` (1 ``a``), ``caaat`` (3 ``a``'s), but won't match +``ct``. + +There are two more repeating qualifiers. The question mark character, ``?``, +matches either once or zero times; you can think of it as marking something as +being optional. For example, ``home-?brew`` matches either ``homebrew`` or +``home-brew``. + +The most complicated repeated qualifier is ``{m,n}``, where *m* and *n* are +decimal integers. This qualifier means there must be at least *m* repetitions, +and at most *n*. For example, ``a/{1,3}b`` will match ``a/b``, ``a//b``, and +``a///b``. It won't match ``ab``, which has no slashes, or ``a////b``, which +has four. + +You can omit either *m* or *n*; in that case, a reasonable value is assumed for +the missing value. Omitting *m* is interpreted as a lower limit of 0, while +omitting *n* results in an upper bound of infinity --- actually, the upper bound +is the 2-billion limit mentioned earlier, but that might as well be infinity. + +Readers of a reductionist bent may notice that the three other qualifiers can +all be expressed using this notation. ``{0,}`` is the same as ``*``, ``{1,}`` +is equivalent to ``+``, and ``{0,1}`` is the same as ``?``. It's better to use +``*``, ``+``, or ``?`` when you can, simply because they're shorter and easier +to read. + + +Using Regular Expressions +========================= + +Now that we've looked at some simple regular expressions, how do we actually use +them in Python? The :mod:`re` module provides an interface to the regular +expression engine, allowing you to compile REs into objects and then perform +matches with them. + + +Compiling Regular Expressions +----------------------------- + +Regular expressions are compiled into :class:`RegexObject` instances, which have +methods for various operations such as searching for pattern matches or +performing string substitutions. :: + + >>> import re + >>> p = re.compile('ab*') + >>> print p + + +:func:`re.compile` also accepts an optional *flags* argument, used to enable +various special features and syntax variations. We'll go over the available +settings later, but for now a single example will do:: + + >>> p = re.compile('ab*', re.IGNORECASE) + +The RE is passed to :func:`re.compile` as a string. REs are handled as strings +because regular expressions aren't part of the core Python language, and no +special syntax was created for expressing them. (There are applications that +don't need REs at all, so there's no need to bloat the language specification by +including them.) Instead, the :mod:`re` module is simply a C extension module +included with Python, just like the :mod:`socket` or :mod:`zlib` modules. + +Putting REs in strings keeps the Python language simpler, but has one +disadvantage which is the topic of the next section. + + +The Backslash Plague +-------------------- + +As stated earlier, regular expressions use the backslash character (``'\'``) to +indicate special forms or to allow special characters to be used without +invoking their special meaning. This conflicts with Python's usage of the same +character for the same purpose in string literals. + +Let's say you want to write a RE that matches the string ``\section``, which +might be found in a LaTeX file. To figure out what to write in the program +code, start with the desired string to be matched. Next, you must escape any +backslashes and other metacharacters by preceding them with a backslash, +resulting in the string ``\\section``. The resulting string that must be passed +to :func:`re.compile` must be ``\\section``. However, to express this as a +Python string literal, both backslashes must be escaped *again*. + ++-------------------+------------------------------------------+ +| Characters | Stage | ++===================+==========================================+ +| ``\section`` | Text string to be matched | ++-------------------+------------------------------------------+ +| ``\\section`` | Escaped backslash for :func:`re.compile` | ++-------------------+------------------------------------------+ +| ``"\\\\section"`` | Escaped backslashes for a string literal | ++-------------------+------------------------------------------+ + +In short, to match a literal backslash, one has to write ``'\\\\'`` as the RE +string, because the regular expression must be ``\\``, and each backslash must +be expressed as ``\\`` inside a regular Python string literal. In REs that +feature backslashes repeatedly, this leads to lots of repeated backslashes and +makes the resulting strings difficult to understand. + +The solution is to use Python's raw string notation for regular expressions; +backslashes are not handled in any special way in a string literal prefixed with +``'r'``, so ``r"\n"`` is a two-character string containing ``'\'`` and ``'n'``, +while ``"\n"`` is a one-character string containing a newline. Regular +expressions will often be written in Python code using this raw string notation. + ++-------------------+------------------+ +| Regular String | Raw string | ++===================+==================+ +| ``"ab*"`` | ``r"ab*"`` | ++-------------------+------------------+ +| ``"\\\\section"`` | ``r"\\section"`` | ++-------------------+------------------+ +| ``"\\w+\\s+\\1"`` | ``r"\w+\s+\1"`` | ++-------------------+------------------+ + + +Performing Matches +------------------ + +Once you have an object representing a compiled regular expression, what do you +do with it? :class:`RegexObject` instances have several methods and attributes. +Only the most significant ones will be covered here; consult `the Library +Reference `_ for a complete +listing. + ++------------------+-----------------------------------------------+ +| Method/Attribute | Purpose | ++==================+===============================================+ +| ``match()`` | Determine if the RE matches at the beginning | +| | of the string. | ++------------------+-----------------------------------------------+ +| ``search()`` | Scan through a string, looking for any | +| | location where this RE matches. | ++------------------+-----------------------------------------------+ +| ``findall()`` | Find all substrings where the RE matches, and | +| | returns them as a list. | ++------------------+-----------------------------------------------+ +| ``finditer()`` | Find all substrings where the RE matches, and | +| | returns them as an iterator. | ++------------------+-----------------------------------------------+ + +:meth:`match` and :meth:`search` return ``None`` if no match can be found. If +they're successful, a ``MatchObject`` instance is returned, containing +information about the match: where it starts and ends, the substring it matched, +and more. + +You can learn about this by interactively experimenting with the :mod:`re` +module. If you have Tkinter available, you may also want to look at +:file:`Tools/scripts/redemo.py`, a demonstration program included with the +Python distribution. It allows you to enter REs and strings, and displays +whether the RE matches or fails. :file:`redemo.py` can be quite useful when +trying to debug a complicated RE. Phil Schwartz's `Kodos +`_ is also an interactive tool for +developing and testing RE patterns. + +This HOWTO uses the standard Python interpreter for its examples. First, run the +Python interpreter, import the :mod:`re` module, and compile a RE:: + + Python 2.2.2 (#1, Feb 10 2003, 12:57:01) + >>> import re + >>> p = re.compile('[a-z]+') + >>> p + <_sre.SRE_Pattern object at 80c3c28> + +Now, you can try matching various strings against the RE ``[a-z]+``. An empty +string shouldn't match at all, since ``+`` means 'one or more repetitions'. +:meth:`match` should return ``None`` in this case, which will cause the +interpreter to print no output. You can explicitly print the result of +:meth:`match` to make this clear. :: + + >>> p.match("") + >>> print p.match("") + None + +Now, let's try it on a string that it should match, such as ``tempo``. In this +case, :meth:`match` will return a :class:`MatchObject`, so you should store the +result in a variable for later use. :: + + >>> m = p.match('tempo') + >>> print m + <_sre.SRE_Match object at 80c4f68> + +Now you can query the :class:`MatchObject` for information about the matching +string. :class:`MatchObject` instances also have several methods and +attributes; the most important ones are: + ++------------------+--------------------------------------------+ +| Method/Attribute | Purpose | ++==================+============================================+ +| ``group()`` | Return the string matched by the RE | ++------------------+--------------------------------------------+ +| ``start()`` | Return the starting position of the match | ++------------------+--------------------------------------------+ +| ``end()`` | Return the ending position of the match | ++------------------+--------------------------------------------+ +| ``span()`` | Return a tuple containing the (start, end) | +| | positions of the match | ++------------------+--------------------------------------------+ + +Trying these methods will soon clarify their meaning:: + + >>> m.group() + 'tempo' + >>> m.start(), m.end() + (0, 5) + >>> m.span() + (0, 5) + +:meth:`group` returns the substring that was matched by the RE. :meth:`start` +and :meth:`end` return the starting and ending index of the match. :meth:`span` +returns both start and end indexes in a single tuple. Since the :meth:`match` +method only checks if the RE matches at the start of a string, :meth:`start` +will always be zero. However, the :meth:`search` method of :class:`RegexObject` +instances scans through the string, so the match may not start at zero in that +case. :: + + >>> print p.match('::: message') + None + >>> m = p.search('::: message') ; print m + + >>> m.group() + 'message' + >>> m.span() + (4, 11) + +In actual programs, the most common style is to store the :class:`MatchObject` +in a variable, and then check if it was ``None``. This usually looks like:: + + p = re.compile( ... ) + m = p.match( 'string goes here' ) + if m: + print 'Match found: ', m.group() + else: + print 'No match' + +Two :class:`RegexObject` methods return all of the matches for a pattern. +:meth:`findall` returns a list of matching strings:: + + >>> p = re.compile('\d+') + >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') + ['12', '11', '10'] + +:meth:`findall` has to create the entire list before it can be returned as the +result. The :meth:`finditer` method returns a sequence of :class:`MatchObject` +instances as an iterator. [#]_ :: + + >>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...') + >>> iterator + + >>> for match in iterator: + ... print match.span() + ... + (0, 2) + (22, 24) + (29, 31) + + +Module-Level Functions +---------------------- + +You don't have to create a :class:`RegexObject` and call its methods; the +:mod:`re` module also provides top-level functions called :func:`match`, +:func:`search`, :func:`findall`, :func:`sub`, and so forth. These functions +take the same arguments as the corresponding :class:`RegexObject` method, with +the RE string added as the first argument, and still return either ``None`` or a +:class:`MatchObject` instance. :: + + >>> print re.match(r'From\s+', 'Fromage amk') + None + >>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998') + + +Under the hood, these functions simply produce a :class:`RegexObject` for you +and call the appropriate method on it. They also store the compiled object in a +cache, so future calls using the same RE are faster. + +Should you use these module-level functions, or should you get the +:class:`RegexObject` and call its methods yourself? That choice depends on how +frequently the RE will be used, and on your personal coding style. If the RE is +being used at only one point in the code, then the module functions are probably +more convenient. If a program contains a lot of regular expressions, or re-uses +the same ones in several locations, then it might be worthwhile to collect all +the definitions in one place, in a section of code that compiles all the REs +ahead of time. To take an example from the standard library, here's an extract +from :file:`xmllib.py`:: + + ref = re.compile( ... ) + entityref = re.compile( ... ) + charref = re.compile( ... ) + starttagopen = re.compile( ... ) + +I generally prefer to work with the compiled object, even for one-time uses, but +few people will be as much of a purist about this as I am. + + +Compilation Flags +----------------- + +Compilation flags let you modify some aspects of how regular expressions work. +Flags are available in the :mod:`re` module under two names, a long name such as +:const:`IGNORECASE` and a short, one-letter form such as :const:`I`. (If you're +familiar with Perl's pattern modifiers, the one-letter forms use the same +letters; the short form of :const:`re.VERBOSE` is :const:`re.X`, for example.) +Multiple flags can be specified by bitwise OR-ing them; ``re.I | re.M`` sets +both the :const:`I` and :const:`M` flags, for example. + +Here's a table of the available flags, followed by a more detailed explanation +of each one. + ++---------------------------------+--------------------------------------------+ +| Flag | Meaning | ++=================================+============================================+ +| :const:`DOTALL`, :const:`S` | Make ``.`` match any character, including | +| | newlines | ++---------------------------------+--------------------------------------------+ +| :const:`IGNORECASE`, :const:`I` | Do case-insensitive matches | ++---------------------------------+--------------------------------------------+ +| :const:`LOCALE`, :const:`L` | Do a locale-aware match | ++---------------------------------+--------------------------------------------+ +| :const:`MULTILINE`, :const:`M` | Multi-line matching, affecting ``^`` and | +| | ``$`` | ++---------------------------------+--------------------------------------------+ +| :const:`VERBOSE`, :const:`X` | Enable verbose REs, which can be organized | +| | more cleanly and understandably. | ++---------------------------------+--------------------------------------------+ + + +.. data:: I + IGNORECASE + :noindex: + + Perform case-insensitive matching; character class and literal strings will + match letters by ignoring case. For example, ``[A-Z]`` will match lowercase + letters, too, and ``Spam`` will match ``Spam``, ``spam``, or ``spAM``. This + lowercasing doesn't take the current locale into account; it will if you also + set the :const:`LOCALE` flag. + + +.. data:: L + LOCALE + :noindex: + + Make ``\w``, ``\W``, ``\b``, and ``\B``, dependent on the current locale. + + Locales are a feature of the C library intended to help in writing programs that + take account of language differences. For example, if you're processing French + text, you'd want to be able to write ``\w+`` to match words, but ``\w`` only + matches the character class ``[A-Za-z]``; it won't match ``'é'`` or ``'ç'``. If + your system is configured properly and a French locale is selected, certain C + functions will tell the program that ``'é'`` should also be considered a letter. + Setting the :const:`LOCALE` flag when compiling a regular expression will cause + the resulting compiled object to use these C functions for ``\w``; this is + slower, but also enables ``\w+`` to match French words as you'd expect. + + +.. data:: M + MULTILINE + :noindex: + + (``^`` and ``$`` haven't been explained yet; they'll be introduced in section + :ref:`more-metacharacters`.) + + Usually ``^`` matches only at the beginning of the string, and ``$`` matches + only at the end of the string and immediately before the newline (if any) at the + end of the string. When this flag is specified, ``^`` matches at the beginning + of the string and at the beginning of each line within the string, immediately + following each newline. Similarly, the ``$`` metacharacter matches either at + the end of the string and at the end of each line (immediately preceding each + newline). + + +.. data:: S + DOTALL + :noindex: + + Makes the ``'.'`` special character match any character at all, including a + newline; without this flag, ``'.'`` will match anything *except* a newline. + + +.. data:: X + VERBOSE + :noindex: + + This flag allows you to write regular expressions that are more readable by + granting you more flexibility in how you can format them. When this flag has + been specified, whitespace within the RE string is ignored, except when the + whitespace is in a character class or preceded by an unescaped backslash; this + lets you organize and indent the RE more clearly. This flag also lets you put + comments within a RE that will be ignored by the engine; comments are marked by + a ``'#'`` that's neither in a character class or preceded by an unescaped + backslash. + + For example, here's a RE that uses :const:`re.VERBOSE`; see how much easier it + is to read? :: + + charref = re.compile(r""" + &[#] # Start of a numeric entity reference + ( + 0[0-7]+ # Octal form + | [0-9]+ # Decimal form + | x[0-9a-fA-F]+ # Hexadecimal form + ) + ; # Trailing semicolon + """, re.VERBOSE) + + Without the verbose setting, the RE would look like this:: + + charref = re.compile("&#(0[0-7]+" + "|[0-9]+" + "|x[0-9a-fA-F]+);") + + In the above example, Python's automatic concatenation of string literals has + been used to break up the RE into smaller pieces, but it's still more difficult + to understand than the version using :const:`re.VERBOSE`. + + +More Pattern Power +================== + +So far we've only covered a part of the features of regular expressions. In +this section, we'll cover some new metacharacters, and how to use groups to +retrieve portions of the text that was matched. + + +.. _more-metacharacters: + +More Metacharacters +------------------- + +There are some metacharacters that we haven't covered yet. Most of them will be +covered in this section. + +Some of the remaining metacharacters to be discussed are :dfn:`zero-width +assertions`. They don't cause the engine to advance through the string; +instead, they consume no characters at all, and simply succeed or fail. For +example, ``\b`` is an assertion that the current position is located at a word +boundary; the position isn't changed by the ``\b`` at all. This means that +zero-width assertions should never be repeated, because if they match once at a +given location, they can obviously be matched an infinite number of times. + +``|`` + Alternation, or the "or" operator. If A and B are regular expressions, + ``A|B`` will match any string that matches either ``A`` or ``B``. ``|`` has very + low precedence in order to make it work reasonably when you're alternating + multi-character strings. ``Crow|Servo`` will match either ``Crow`` or ``Servo``, + not ``Cro``, a ``'w'`` or an ``'S'``, and ``ervo``. + + To match a literal ``'|'``, use ``\|``, or enclose it inside a character class, + as in ``[|]``. + +``^`` + Matches at the beginning of lines. Unless the :const:`MULTILINE` flag has been + set, this will only match at the beginning of the string. In :const:`MULTILINE` + mode, this also matches immediately after each newline within the string. + + For example, if you wish to match the word ``From`` only at the beginning of a + line, the RE to use is ``^From``. :: + + >>> print re.search('^From', 'From Here to Eternity') + + >>> print re.search('^From', 'Reciting From Memory') + None + + .. % To match a literal \character{\^}, use \regexp{\e\^} or enclose it + .. % inside a character class, as in \regexp{[{\e}\^]}. + +``$`` + Matches at the end of a line, which is defined as either the end of the string, + or any location followed by a newline character. :: + + >>> print re.search('}$', '{block}') + + >>> print re.search('}$', '{block} ') + None + >>> print re.search('}$', '{block}\n') + + + To match a literal ``'$'``, use ``\$`` or enclose it inside a character class, + as in ``[$]``. + + .. % $ + +``\A`` + Matches only at the start of the string. When not in :const:`MULTILINE` mode, + ``\A`` and ``^`` are effectively the same. In :const:`MULTILINE` mode, they're + different: ``\A`` still matches only at the beginning of the string, but ``^`` + may match at any location inside the string that follows a newline character. + +``\Z`` + Matches only at the end of the string. + +``\b`` + Word boundary. This is a zero-width assertion that matches only at the + beginning or end of a word. A word is defined as a sequence of alphanumeric + characters, so the end of a word is indicated by whitespace or a + non-alphanumeric character. + + The following example matches ``class`` only when it's a complete word; it won't + match when it's contained inside another word. :: + + >>> p = re.compile(r'\bclass\b') + >>> print p.search('no class at all') + + >>> print p.search('the declassified algorithm') + None + >>> print p.search('one subclass is') + None + + There are two subtleties you should remember when using this special sequence. + First, this is the worst collision between Python's string literals and regular + expression sequences. In Python's string literals, ``\b`` is the backspace + character, ASCII value 8. If you're not using raw strings, then Python will + convert the ``\b`` to a backspace, and your RE won't match as you expect it to. + The following example looks the same as our previous RE, but omits the ``'r'`` + in front of the RE string. :: + + >>> p = re.compile('\bclass\b') + >>> print p.search('no class at all') + None + >>> print p.search('\b' + 'class' + '\b') + + + Second, inside a character class, where there's no use for this assertion, + ``\b`` represents the backspace character, for compatibility with Python's + string literals. + +``\B`` + Another zero-width assertion, this is the opposite of ``\b``, only matching when + the current position is not at a word boundary. + + +Grouping +-------- + +Frequently you need to obtain more information than just whether the RE matched +or not. Regular expressions are often used to dissect strings by writing a RE +divided into several subgroups which match different components of interest. +For example, an RFC-822 header line is divided into a header name and a value, +separated by a ``':'``, like this:: + + From: author@example.com + User-Agent: Thunderbird 1.5.0.9 (X11/20061227) + MIME-Version: 1.0 + To: editor@example.com + +This can be handled by writing a regular expression which matches an entire +header line, and has one group which matches the header name, and another group +which matches the header's value. + +Groups are marked by the ``'('``, ``')'`` metacharacters. ``'('`` and ``')'`` +have much the same meaning as they do in mathematical expressions; they group +together the expressions contained inside them, and you can repeat the contents +of a group with a repeating qualifier, such as ``*``, ``+``, ``?``, or +``{m,n}``. For example, ``(ab)*`` will match zero or more repetitions of +``ab``. :: + + >>> p = re.compile('(ab)*') + >>> print p.match('ababababab').span() + (0, 10) + +Groups indicated with ``'('``, ``')'`` also capture the starting and ending +index of the text that they match; this can be retrieved by passing an argument +to :meth:`group`, :meth:`start`, :meth:`end`, and :meth:`span`. Groups are +numbered starting with 0. Group 0 is always present; it's the whole RE, so +:class:`MatchObject` methods all have group 0 as their default argument. Later +we'll see how to express groups that don't capture the span of text that they +match. :: + + >>> p = re.compile('(a)b') + >>> m = p.match('ab') + >>> m.group() + 'ab' + >>> m.group(0) + 'ab' + +Subgroups are numbered from left to right, from 1 upward. Groups can be nested; +to determine the number, just count the opening parenthesis characters, going +from left to right. :: + + >>> p = re.compile('(a(b)c)d') + >>> m = p.match('abcd') + >>> m.group(0) + 'abcd' + >>> m.group(1) + 'abc' + >>> m.group(2) + 'b' + +:meth:`group` can be passed multiple group numbers at a time, in which case it +will return a tuple containing the corresponding values for those groups. :: + + >>> m.group(2,1,2) + ('b', 'abc', 'b') + +The :meth:`groups` method returns a tuple containing the strings for all the +subgroups, from 1 up to however many there are. :: + + >>> m.groups() + ('abc', 'b') + +Backreferences in a pattern allow you to specify that the contents of an earlier +capturing group must also be found at the current location in the string. For +example, ``\1`` will succeed if the exact contents of group 1 can be found at +the current position, and fails otherwise. Remember that Python's string +literals also use a backslash followed by numbers to allow including arbitrary +characters in a string, so be sure to use a raw string when incorporating +backreferences in a RE. + +For example, the following RE detects doubled words in a string. :: + + >>> p = re.compile(r'(\b\w+)\s+\1') + >>> p.search('Paris in the the spring').group() + 'the the' + +Backreferences like this aren't often useful for just searching through a string +--- there are few text formats which repeat data in this way --- but you'll soon +find out that they're *very* useful when performing string substitutions. + + +Non-capturing and Named Groups +------------------------------ + +Elaborate REs may use many groups, both to capture substrings of interest, and +to group and structure the RE itself. In complex REs, it becomes difficult to +keep track of the group numbers. There are two features which help with this +problem. Both of them use a common syntax for regular expression extensions, so +we'll look at that first. + +Perl 5 added several additional features to standard regular expressions, and +the Python :mod:`re` module supports most of them. It would have been +difficult to choose new single-keystroke metacharacters or new special sequences +beginning with ``\`` to represent the new features without making Perl's regular +expressions confusingly different from standard REs. If you chose ``&`` as a +new metacharacter, for example, old expressions would be assuming that ``&`` was +a regular character and wouldn't have escaped it by writing ``\&`` or ``[&]``. + +The solution chosen by the Perl developers was to use ``(?...)`` as the +extension syntax. ``?`` immediately after a parenthesis was a syntax error +because the ``?`` would have nothing to repeat, so this didn't introduce any +compatibility problems. The characters immediately after the ``?`` indicate +what extension is being used, so ``(?=foo)`` is one thing (a positive lookahead +assertion) and ``(?:foo)`` is something else (a non-capturing group containing +the subexpression ``foo``). + +Python adds an extension syntax to Perl's extension syntax. If the first +character after the question mark is a ``P``, you know that it's an extension +that's specific to Python. Currently there are two such extensions: +``(?P...)`` defines a named group, and ``(?P=name)`` is a backreference to +a named group. If future versions of Perl 5 add similar features using a +different syntax, the :mod:`re` module will be changed to support the new +syntax, while preserving the Python-specific syntax for compatibility's sake. + +Now that we've looked at the general extension syntax, we can return to the +features that simplify working with groups in complex REs. Since groups are +numbered from left to right and a complex expression may use many groups, it can +become difficult to keep track of the correct numbering. Modifying such a +complex RE is annoying, too: insert a new group near the beginning and you +change the numbers of everything that follows it. + +Sometimes you'll want to use a group to collect a part of a regular expression, +but aren't interested in retrieving the group's contents. You can make this fact +explicit by using a non-capturing group: ``(?:...)``, where you can replace the +``...`` with any other regular expression. :: + + >>> m = re.match("([abc])+", "abc") + >>> m.groups() + ('c',) + >>> m = re.match("(?:[abc])+", "abc") + >>> m.groups() + () + +Except for the fact that you can't retrieve the contents of what the group +matched, a non-capturing group behaves exactly the same as a capturing group; +you can put anything inside it, repeat it with a repetition metacharacter such +as ``*``, and nest it within other groups (capturing or non-capturing). +``(?:...)`` is particularly useful when modifying an existing pattern, since you +can add new groups without changing how all the other groups are numbered. It +should be mentioned that there's no performance difference in searching between +capturing and non-capturing groups; neither form is any faster than the other. + +A more significant feature is named groups: instead of referring to them by +numbers, groups can be referenced by a name. + +The syntax for a named group is one of the Python-specific extensions: +``(?P...)``. *name* is, obviously, the name of the group. Named groups +also behave exactly like capturing groups, and additionally associate a name +with a group. The :class:`MatchObject` methods that deal with capturing groups +all accept either integers that refer to the group by number or strings that +contain the desired group's name. Named groups are still given numbers, so you +can retrieve information about a group in two ways:: + + >>> p = re.compile(r'(?P\b\w+\b)') + >>> m = p.search( '(((( Lots of punctuation )))' ) + >>> m.group('word') + 'Lots' + >>> m.group(1) + 'Lots' + +Named groups are handy because they let you use easily-remembered names, instead +of having to remember numbers. Here's an example RE from the :mod:`imaplib` +module:: + + InternalDate = re.compile(r'INTERNALDATE "' + r'(?P[ 123][0-9])-(?P[A-Z][a-z][a-z])-' + r'(?P[0-9][0-9][0-9][0-9])' + r' (?P[0-9][0-9]):(?P[0-9][0-9]):(?P[0-9][0-9])' + r' (?P[-+])(?P[0-9][0-9])(?P[0-9][0-9])' + r'"') + +It's obviously much easier to retrieve ``m.group('zonem')``, instead of having +to remember to retrieve group 9. + +The syntax for backreferences in an expression such as ``(...)\1`` refers to the +number of the group. There's naturally a variant that uses the group name +instead of the number. This is another Python extension: ``(?P=name)`` indicates +that the contents of the group called *name* should again be matched at the +current point. The regular expression for finding doubled words, +``(\b\w+)\s+\1`` can also be written as ``(?P\b\w+)\s+(?P=word)``:: + + >>> p = re.compile(r'(?P\b\w+)\s+(?P=word)') + >>> p.search('Paris in the the spring').group() + 'the the' + + +Lookahead Assertions +-------------------- + +Another zero-width assertion is the lookahead assertion. Lookahead assertions +are available in both positive and negative form, and look like this: + +``(?=...)`` + Positive lookahead assertion. This succeeds if the contained regular + expression, represented here by ``...``, successfully matches at the current + location, and fails otherwise. But, once the contained expression has been + tried, the matching engine doesn't advance at all; the rest of the pattern is + tried right where the assertion started. + +``(?!...)`` + Negative lookahead assertion. This is the opposite of the positive assertion; + it succeeds if the contained expression *doesn't* match at the current position + in the string. + +To make this concrete, let's look at a case where a lookahead is useful. +Consider a simple pattern to match a filename and split it apart into a base +name and an extension, separated by a ``.``. For example, in ``news.rc``, +``news`` is the base name, and ``rc`` is the filename's extension. + +The pattern to match this is quite simple: + +``.*[.].*$`` + +Notice that the ``.`` needs to be treated specially because it's a +metacharacter; I've put it inside a character class. Also notice the trailing +``$``; this is added to ensure that all the rest of the string must be included +in the extension. This regular expression matches ``foo.bar`` and +``autoexec.bat`` and ``sendmail.cf`` and ``printers.conf``. + +Now, consider complicating the problem a bit; what if you want to match +filenames where the extension is not ``bat``? Some incorrect attempts: + +``.*[.][^b].*$`` The first attempt above tries to exclude ``bat`` by requiring +that the first character of the extension is not a ``b``. This is wrong, +because the pattern also doesn't match ``foo.bar``. + +.. % $ + +``.*[.]([^b]..|.[^a].|..[^t])$`` + +.. % Messes up the HTML without the curly braces around \^ + +The expression gets messier when you try to patch up the first solution by +requiring one of the following cases to match: the first character of the +extension isn't ``b``; the second character isn't ``a``; or the third character +isn't ``t``. This accepts ``foo.bar`` and rejects ``autoexec.bat``, but it +requires a three-letter extension and won't accept a filename with a two-letter +extension such as ``sendmail.cf``. We'll complicate the pattern again in an +effort to fix it. + +``.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$`` + +In the third attempt, the second and third letters are all made optional in +order to allow matching extensions shorter than three characters, such as +``sendmail.cf``. + +The pattern's getting really complicated now, which makes it hard to read and +understand. Worse, if the problem changes and you want to exclude both ``bat`` +and ``exe`` as extensions, the pattern would get even more complicated and +confusing. + +A negative lookahead cuts through all this confusion: + +``.*[.](?!bat$).*$`` The negative lookahead means: if the expression ``bat`` +doesn't match at this point, try the rest of the pattern; if ``bat$`` does +match, the whole pattern will fail. The trailing ``$`` is required to ensure +that something like ``sample.batch``, where the extension only starts with +``bat``, will be allowed. + +.. % $ + +Excluding another filename extension is now easy; simply add it as an +alternative inside the assertion. The following pattern excludes filenames that +end in either ``bat`` or ``exe``: + +``.*[.](?!bat$|exe$).*$`` + +.. % $ + + +Modifying Strings +================= + +Up to this point, we've simply performed searches against a static string. +Regular expressions are also commonly used to modify strings in various ways, +using the following :class:`RegexObject` methods: + ++------------------+-----------------------------------------------+ +| Method/Attribute | Purpose | ++==================+===============================================+ +| ``split()`` | Split the string into a list, splitting it | +| | wherever the RE matches | ++------------------+-----------------------------------------------+ +| ``sub()`` | Find all substrings where the RE matches, and | +| | replace them with a different string | ++------------------+-----------------------------------------------+ +| ``subn()`` | Does the same thing as :meth:`sub`, but | +| | returns the new string and the number of | +| | replacements | ++------------------+-----------------------------------------------+ + + +Splitting Strings +----------------- + +The :meth:`split` method of a :class:`RegexObject` splits a string apart +wherever the RE matches, returning a list of the pieces. It's similar to the +:meth:`split` method of strings but provides much more generality in the +delimiters that you can split by; :meth:`split` only supports splitting by +whitespace or by a fixed string. As you'd expect, there's a module-level +:func:`re.split` function, too. + + +.. method:: .split(string [, maxsplit=0]) + :noindex: + + Split *string* by the matches of the regular expression. If capturing + parentheses are used in the RE, then their contents will also be returned as + part of the resulting list. If *maxsplit* is nonzero, at most *maxsplit* splits + are performed. + +You can limit the number of splits made, by passing a value for *maxsplit*. +When *maxsplit* is nonzero, at most *maxsplit* splits will be made, and the +remainder of the string is returned as the final element of the list. In the +following example, the delimiter is any sequence of non-alphanumeric characters. +:: + + >>> p = re.compile(r'\W+') + >>> p.split('This is a test, short and sweet, of split().') + ['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', ''] + >>> p.split('This is a test, short and sweet, of split().', 3) + ['This', 'is', 'a', 'test, short and sweet, of split().'] + +Sometimes you're not only interested in what the text between delimiters is, but +also need to know what the delimiter was. If capturing parentheses are used in +the RE, then their values are also returned as part of the list. Compare the +following calls:: + + >>> p = re.compile(r'\W+') + >>> p2 = re.compile(r'(\W+)') + >>> p.split('This... is a test.') + ['This', 'is', 'a', 'test', ''] + >>> p2.split('This... is a test.') + ['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', ''] + +The module-level function :func:`re.split` adds the RE to be used as the first +argument, but is otherwise the same. :: + + >>> re.split('[\W]+', 'Words, words, words.') + ['Words', 'words', 'words', ''] + >>> re.split('([\W]+)', 'Words, words, words.') + ['Words', ', ', 'words', ', ', 'words', '.', ''] + >>> re.split('[\W]+', 'Words, words, words.', 1) + ['Words', 'words, words.'] + + +Search and Replace +------------------ + +Another common task is to find all the matches for a pattern, and replace them +with a different string. The :meth:`sub` method takes a replacement value, +which can be either a string or a function, and the string to be processed. + + +.. method:: .sub(replacement, string[, count=0]) + :noindex: + + Returns the string obtained by replacing the leftmost non-overlapping + occurrences of the RE in *string* by the replacement *replacement*. If the + pattern isn't found, *string* is returned unchanged. + + The optional argument *count* is the maximum number of pattern occurrences to be + replaced; *count* must be a non-negative integer. The default value of 0 means + to replace all occurrences. + +Here's a simple example of using the :meth:`sub` method. It replaces colour +names with the word ``colour``:: + + >>> p = re.compile( '(blue|white|red)') + >>> p.sub( 'colour', 'blue socks and red shoes') + 'colour socks and colour shoes' + >>> p.sub( 'colour', 'blue socks and red shoes', count=1) + 'colour socks and red shoes' + +The :meth:`subn` method does the same work, but returns a 2-tuple containing the +new string value and the number of replacements that were performed:: + + >>> p = re.compile( '(blue|white|red)') + >>> p.subn( 'colour', 'blue socks and red shoes') + ('colour socks and colour shoes', 2) + >>> p.subn( 'colour', 'no colours at all') + ('no colours at all', 0) + +Empty matches are replaced only when they're not adjacent to a previous match. +:: + + >>> p = re.compile('x*') + >>> p.sub('-', 'abxd') + '-a-b-d-' + +If *replacement* is a string, any backslash escapes in it are processed. That +is, ``\n`` is converted to a single newline character, ``\r`` is converted to a +carriage return, and so forth. Unknown escapes such as ``\j`` are left alone. +Backreferences, such as ``\6``, are replaced with the substring matched by the +corresponding group in the RE. This lets you incorporate portions of the +original text in the resulting replacement string. + +This example matches the word ``section`` followed by a string enclosed in +``{``, ``}``, and changes ``section`` to ``subsection``:: + + >>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE) + >>> p.sub(r'subsection{\1}','section{First} section{second}') + 'subsection{First} subsection{second}' + +There's also a syntax for referring to named groups as defined by the +``(?P...)`` syntax. ``\g`` will use the substring matched by the +group named ``name``, and ``\g`` uses the corresponding group number. +``\g<2>`` is therefore equivalent to ``\2``, but isn't ambiguous in a +replacement string such as ``\g<2>0``. (``\20`` would be interpreted as a +reference to group 20, not a reference to group 2 followed by the literal +character ``'0'``.) The following substitutions are all equivalent, but use all +three variations of the replacement string. :: + + >>> p = re.compile('section{ (?P [^}]* ) }', re.VERBOSE) + >>> p.sub(r'subsection{\1}','section{First}') + 'subsection{First}' + >>> p.sub(r'subsection{\g<1>}','section{First}') + 'subsection{First}' + >>> p.sub(r'subsection{\g}','section{First}') + 'subsection{First}' + +*replacement* can also be a function, which gives you even more control. If +*replacement* is a function, the function is called for every non-overlapping +occurrence of *pattern*. On each call, the function is passed a +:class:`MatchObject` argument for the match and can use this information to +compute the desired replacement string and return it. + +In the following example, the replacement function translates decimals into +hexadecimal:: + + >>> def hexrepl( match ): + ... "Return the hex string for a decimal number" + ... value = int( match.group() ) + ... return hex(value) + ... + >>> p = re.compile(r'\d+') + >>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.') + 'Call 0xffd2 for printing, 0xc000 for user code.' + +When using the module-level :func:`re.sub` function, the pattern is passed as +the first argument. The pattern may be a string or a :class:`RegexObject`; if +you need to specify regular expression flags, you must either use a +:class:`RegexObject` as the first parameter, or use embedded modifiers in the +pattern, e.g. ``sub("(?i)b+", "x", "bbbb BBBB")`` returns ``'x x'``. + + +Common Problems +=============== + +Regular expressions are a powerful tool for some applications, but in some ways +their behaviour isn't intuitive and at times they don't behave the way you may +expect them to. This section will point out some of the most common pitfalls. + + +Use String Methods +------------------ + +Sometimes using the :mod:`re` module is a mistake. If you're matching a fixed +string, or a single character class, and you're not using any :mod:`re` features +such as the :const:`IGNORECASE` flag, then the full power of regular expressions +may not be required. Strings have several methods for performing operations with +fixed strings and they're usually much faster, because the implementation is a +single small C loop that's been optimized for the purpose, instead of the large, +more generalized regular expression engine. + +One example might be replacing a single fixed string with another one; for +example, you might replace ``word`` with ``deed``. ``re.sub()`` seems like the +function to use for this, but consider the :meth:`replace` method. Note that +:func:`replace` will also replace ``word`` inside words, turning ``swordfish`` +into ``sdeedfish``, but the naive RE ``word`` would have done that, too. (To +avoid performing the substitution on parts of words, the pattern would have to +be ``\bword\b``, in order to require that ``word`` have a word boundary on +either side. This takes the job beyond :meth:`replace`'s abilities.) + +Another common task is deleting every occurrence of a single character from a +string or replacing it with another single character. You might do this with +something like ``re.sub('\n', ' ', S)``, but :meth:`translate` is capable of +doing both tasks and will be faster than any regular expression operation can +be. + +In short, before turning to the :mod:`re` module, consider whether your problem +can be solved with a faster and simpler string method. + + +match() versus search() +----------------------- + +The :func:`match` function only checks if the RE matches at the beginning of the +string while :func:`search` will scan forward through the string for a match. +It's important to keep this distinction in mind. Remember, :func:`match` will +only report a successful match which will start at 0; if the match wouldn't +start at zero, :func:`match` will *not* report it. :: + + >>> print re.match('super', 'superstition').span() + (0, 5) + >>> print re.match('super', 'insuperable') + None + +On the other hand, :func:`search` will scan forward through the string, +reporting the first match it finds. :: + + >>> print re.search('super', 'superstition').span() + (0, 5) + >>> print re.search('super', 'insuperable').span() + (2, 7) + +Sometimes you'll be tempted to keep using :func:`re.match`, and just add ``.*`` +to the front of your RE. Resist this temptation and use :func:`re.search` +instead. The regular expression compiler does some analysis of REs in order to +speed up the process of looking for a match. One such analysis figures out what +the first character of a match must be; for example, a pattern starting with +``Crow`` must match starting with a ``'C'``. The analysis lets the engine +quickly scan through the string looking for the starting character, only trying +the full match if a ``'C'`` is found. + +Adding ``.*`` defeats this optimization, requiring scanning to the end of the +string and then backtracking to find a match for the rest of the RE. Use +:func:`re.search` instead. + + +Greedy versus Non-Greedy +------------------------ + +When repeating a regular expression, as in ``a*``, the resulting action is to +consume as much of the pattern as possible. This fact often bites you when +you're trying to match a pair of balanced delimiters, such as the angle brackets +surrounding an HTML tag. The naive pattern for matching a single HTML tag +doesn't work because of the greedy nature of ``.*``. :: + + >>> s = 'Title' + >>> len(s) + 32 + >>> print re.match('<.*>', s).span() + (0, 32) + >>> print re.match('<.*>', s).group() + Title + +The RE matches the ``'<'`` in ````, and the ``.*`` consumes the rest of +the string. There's still more left in the RE, though, and the ``>`` can't +match at the end of the string, so the regular expression engine has to +backtrack character by character until it finds a match for the ``>``. The +final match extends from the ``'<'`` in ```` to the ``'>'`` in +````, which isn't what you want. + +In this case, the solution is to use the non-greedy qualifiers ``*?``, ``+?``, +``??``, or ``{m,n}?``, which match as *little* text as possible. In the above +example, the ``'>'`` is tried immediately after the first ``'<'`` matches, and +when it fails, the engine advances a character at a time, retrying the ``'>'`` +at every step. This produces just the right result:: + + >>> print re.match('<.*?>', s).group() + + +(Note that parsing HTML or XML with regular expressions is painful. +Quick-and-dirty patterns will handle common cases, but HTML and XML have special +cases that will break the obvious regular expression; by the time you've written +a regular expression that handles all of the possible cases, the patterns will +be *very* complicated. Use an HTML or XML parser module for such tasks.) + + +Not Using re.VERBOSE +-------------------- + +By now you've probably noticed that regular expressions are a very compact +notation, but they're not terribly readable. REs of moderate complexity can +become lengthy collections of backslashes, parentheses, and metacharacters, +making them difficult to read and understand. + +For such REs, specifying the ``re.VERBOSE`` flag when compiling the regular +expression can be helpful, because it allows you to format the regular +expression more clearly. + +The ``re.VERBOSE`` flag has several effects. Whitespace in the regular +expression that *isn't* inside a character class is ignored. This means that an +expression such as ``dog | cat`` is equivalent to the less readable ``dog|cat``, +but ``[a b]`` will still match the characters ``'a'``, ``'b'``, or a space. In +addition, you can also put comments inside a RE; comments extend from a ``#`` +character to the next newline. When used with triple-quoted strings, this +enables REs to be formatted more neatly:: + + pat = re.compile(r""" + \s* # Skip leading whitespace + (?P
[^:]+) # Header name + \s* : # Whitespace, and a colon + (?P.*?) # The header's value -- *? used to + # lose the following trailing whitespace + \s*$ # Trailing whitespace to end-of-line + """, re.VERBOSE) + +This is far more readable than: + +.. % $ + +:: + + pat = re.compile(r"\s*(?P
[^:]+)\s*:(?P.*?)\s*$") + +.. % $ + + +Feedback +======== + +Regular expressions are a complicated topic. Did this document help you +understand them? Were there parts that were unclear, or Problems you +encountered that weren't covered here? If so, please send suggestions for +improvements to the author. + +The most complete book on regular expressions is almost certainly Jeffrey +Friedl's Mastering Regular Expressions, published by O'Reilly. Unfortunately, +it exclusively concentrates on Perl and Java's flavours of regular expressions, +and doesn't contain any Python material at all, so it won't be useful as a +reference for programming in Python. (The first edition covered Python's +now-removed :mod:`regex` module, which won't help you much.) Consider checking +it out from your library. + + +.. rubric:: Footnotes + +.. [#] Introduced in Python 2.2.2. + diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst new file mode 100644 index 0000000..dc05d32 --- /dev/null +++ b/Doc/howto/sockets.rst @@ -0,0 +1,421 @@ +**************************** + Socket Programming HOWTO +**************************** + +:Author: Gordon McMillan + + +.. topic:: Abstract + + Sockets are used nearly everywhere, but are one of the most severely + misunderstood technologies around. This is a 10,000 foot overview of sockets. + It's not really a tutorial - you'll still have work to do in getting things + operational. It doesn't cover the fine points (and there are a lot of them), but + I hope it will give you enough background to begin using them decently. + + +Sockets +======= + +Sockets are used nearly everywhere, but are one of the most severely +misunderstood technologies around. This is a 10,000 foot overview of sockets. +It's not really a tutorial - you'll still have work to do in getting things +working. It doesn't cover the fine points (and there are a lot of them), but I +hope it will give you enough background to begin using them decently. + +I'm only going to talk about INET sockets, but they account for at least 99% of +the sockets in use. And I'll only talk about STREAM sockets - unless you really +know what you're doing (in which case this HOWTO isn't for you!), you'll get +better behavior and performance from a STREAM socket than anything else. I will +try to clear up the mystery of what a socket is, as well as some hints on how to +work with blocking and non-blocking sockets. But I'll start by talking about +blocking sockets. You'll need to know how they work before dealing with +non-blocking sockets. + +Part of the trouble with understanding these things is that "socket" can mean a +number of subtly different things, depending on context. So first, let's make a +distinction between a "client" socket - an endpoint of a conversation, and a +"server" socket, which is more like a switchboard operator. The client +application (your browser, for example) uses "client" sockets exclusively; the +web server it's talking to uses both "server" sockets and "client" sockets. + + +History +------- + +Of the various forms of IPC (*Inter Process Communication*), sockets are by far +the most popular. On any given platform, there are likely to be other forms of +IPC that are faster, but for cross-platform communication, sockets are about the +only game in town. + +They were invented in Berkeley as part of the BSD flavor of Unix. They spread +like wildfire with the Internet. With good reason --- the combination of sockets +with INET makes talking to arbitrary machines around the world unbelievably easy +(at least compared to other schemes). + + +Creating a Socket +================= + +Roughly speaking, when you clicked on the link that brought you to this page, +your browser did something like the following:: + + #create an INET, STREAMing socket + s = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) + #now connect to the web server on port 80 + # - the normal http port + s.connect(("www.mcmillan-inc.com", 80)) + +When the ``connect`` completes, the socket ``s`` can now be used to send in a +request for the text of this page. The same socket will read the reply, and then +be destroyed. That's right - destroyed. Client sockets are normally only used +for one exchange (or a small set of sequential exchanges). + +What happens in the web server is a bit more complex. First, the web server +creates a "server socket". :: + + #create an INET, STREAMing socket + serversocket = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) + #bind the socket to a public host, + # and a well-known port + serversocket.bind((socket.gethostname(), 80)) + #become a server socket + serversocket.listen(5) + +A couple things to notice: we used ``socket.gethostname()`` so that the socket +would be visible to the outside world. If we had used ``s.bind(('', 80))`` or +``s.bind(('localhost', 80))`` or ``s.bind(('127.0.0.1', 80))`` we would still +have a "server" socket, but one that was only visible within the same machine. + +A second thing to note: low number ports are usually reserved for "well known" +services (HTTP, SNMP etc). If you're playing around, use a nice high number (4 +digits). + +Finally, the argument to ``listen`` tells the socket library that we want it to +queue up as many as 5 connect requests (the normal max) before refusing outside +connections. If the rest of the code is written properly, that should be plenty. + +OK, now we have a "server" socket, listening on port 80. Now we enter the +mainloop of the web server:: + + while 1: + #accept connections from outside + (clientsocket, address) = serversocket.accept() + #now do something with the clientsocket + #in this case, we'll pretend this is a threaded server + ct = client_thread(clientsocket) + ct.run() + +There's actually 3 general ways in which this loop could work - dispatching a +thread to handle ``clientsocket``, create a new process to handle +``clientsocket``, or restructure this app to use non-blocking sockets, and +mulitplex between our "server" socket and any active ``clientsocket``\ s using +``select``. More about that later. The important thing to understand now is +this: this is *all* a "server" socket does. It doesn't send any data. It doesn't +receive any data. It just produces "client" sockets. Each ``clientsocket`` is +created in response to some *other* "client" socket doing a ``connect()`` to the +host and port we're bound to. As soon as we've created that ``clientsocket``, we +go back to listening for more connections. The two "clients" are free to chat it +up - they are using some dynamically allocated port which will be recycled when +the conversation ends. + + +IPC +--- + +If you need fast IPC between two processes on one machine, you should look into +whatever form of shared memory the platform offers. A simple protocol based +around shared memory and locks or semaphores is by far the fastest technique. + +If you do decide to use sockets, bind the "server" socket to ``'localhost'``. On +most platforms, this will take a shortcut around a couple of layers of network +code and be quite a bit faster. + + +Using a Socket +============== + +The first thing to note, is that the web browser's "client" socket and the web +server's "client" socket are identical beasts. That is, this is a "peer to peer" +conversation. Or to put it another way, *as the designer, you will have to +decide what the rules of etiquette are for a conversation*. Normally, the +``connect``\ ing socket starts the conversation, by sending in a request, or +perhaps a signon. But that's a design decision - it's not a rule of sockets. + +Now there are two sets of verbs to use for communication. You can use ``send`` +and ``recv``, or you can transform your client socket into a file-like beast and +use ``read`` and ``write``. The latter is the way Java presents their sockets. +I'm not going to talk about it here, except to warn you that you need to use +``flush`` on sockets. These are buffered "files", and a common mistake is to +``write`` something, and then ``read`` for a reply. Without a ``flush`` in +there, you may wait forever for the reply, because the request may still be in +your output buffer. + +Now we come the major stumbling block of sockets - ``send`` and ``recv`` operate +on the network buffers. They do not necessarily handle all the bytes you hand +them (or expect from them), because their major focus is handling the network +buffers. In general, they return when the associated network buffers have been +filled (``send``) or emptied (``recv``). They then tell you how many bytes they +handled. It is *your* responsibility to call them again until your message has +been completely dealt with. + +When a ``recv`` returns 0 bytes, it means the other side has closed (or is in +the process of closing) the connection. You will not receive any more data on +this connection. Ever. You may be able to send data successfully; I'll talk +about that some on the next page. + +A protocol like HTTP uses a socket for only one transfer. The client sends a +request, the reads a reply. That's it. The socket is discarded. This means that +a client can detect the end of the reply by receiving 0 bytes. + +But if you plan to reuse your socket for further transfers, you need to realize +that *there is no "EOT" (End of Transfer) on a socket.* I repeat: if a socket +``send`` or ``recv`` returns after handling 0 bytes, the connection has been +broken. If the connection has *not* been broken, you may wait on a ``recv`` +forever, because the socket will *not* tell you that there's nothing more to +read (for now). Now if you think about that a bit, you'll come to realize a +fundamental truth of sockets: *messages must either be fixed length* (yuck), *or +be delimited* (shrug), *or indicate how long they are* (much better), *or end by +shutting down the connection*. The choice is entirely yours, (but some ways are +righter than others). + +Assuming you don't want to end the connection, the simplest solution is a fixed +length message:: + + class mysocket: + '''demonstration class only + - coded for clarity, not efficiency + ''' + + def __init__(self, sock=None): + if sock is None: + self.sock = socket.socket( + socket.AF_INET, socket.SOCK_STREAM) + else: + self.sock = sock + + def connect(self, host, port): + self.sock.connect((host, port)) + + def mysend(self, msg): + totalsent = 0 + while totalsent < MSGLEN: + sent = self.sock.send(msg[totalsent:]) + if sent == 0: + raise RuntimeError, \ + "socket connection broken" + totalsent = totalsent + sent + + def myreceive(self): + msg = '' + while len(msg) < MSGLEN: + chunk = self.sock.recv(MSGLEN-len(msg)) + if chunk == '': + raise RuntimeError, \ + "socket connection broken" + msg = msg + chunk + return msg + +The sending code here is usable for almost any messaging scheme - in Python you +send strings, and you can use ``len()`` to determine its length (even if it has +embedded ``\0`` characters). It's mostly the receiving code that gets more +complex. (And in C, it's not much worse, except you can't use ``strlen`` if the +message has embedded ``\0``\ s.) + +The easiest enhancement is to make the first character of the message an +indicator of message type, and have the type determine the length. Now you have +two ``recv``\ s - the first to get (at least) that first character so you can +look up the length, and the second in a loop to get the rest. If you decide to +go the delimited route, you'll be receiving in some arbitrary chunk size, (4096 +or 8192 is frequently a good match for network buffer sizes), and scanning what +you've received for a delimiter. + +One complication to be aware of: if your conversational protocol allows multiple +messages to be sent back to back (without some kind of reply), and you pass +``recv`` an arbitrary chunk size, you may end up reading the start of a +following message. You'll need to put that aside and hold onto it, until it's +needed. + +Prefixing the message with it's length (say, as 5 numeric characters) gets more +complex, because (believe it or not), you may not get all 5 characters in one +``recv``. In playing around, you'll get away with it; but in high network loads, +your code will very quickly break unless you use two ``recv`` loops - the first +to determine the length, the second to get the data part of the message. Nasty. +This is also when you'll discover that ``send`` does not always manage to get +rid of everything in one pass. And despite having read this, you will eventually +get bit by it! + +In the interests of space, building your character, (and preserving my +competitive position), these enhancements are left as an exercise for the +reader. Lets move on to cleaning up. + + +Binary Data +----------- + +It is perfectly possible to send binary data over a socket. The major problem is +that not all machines use the same formats for binary data. For example, a +Motorola chip will represent a 16 bit integer with the value 1 as the two hex +bytes 00 01. Intel and DEC, however, are byte-reversed - that same 1 is 01 00. +Socket libraries have calls for converting 16 and 32 bit integers - ``ntohl, +htonl, ntohs, htons`` where "n" means *network* and "h" means *host*, "s" means +*short* and "l" means *long*. Where network order is host order, these do +nothing, but where the machine is byte-reversed, these swap the bytes around +appropriately. + +In these days of 32 bit machines, the ascii representation of binary data is +frequently smaller than the binary representation. That's because a surprising +amount of the time, all those longs have the value 0, or maybe 1. The string "0" +would be two bytes, while binary is four. Of course, this doesn't fit well with +fixed-length messages. Decisions, decisions. + + +Disconnecting +============= + +Strictly speaking, you're supposed to use ``shutdown`` on a socket before you +``close`` it. The ``shutdown`` is an advisory to the socket at the other end. +Depending on the argument you pass it, it can mean "I'm not going to send +anymore, but I'll still listen", or "I'm not listening, good riddance!". Most +socket libraries, however, are so used to programmers neglecting to use this +piece of etiquette that normally a ``close`` is the same as ``shutdown(); +close()``. So in most situations, an explicit ``shutdown`` is not needed. + +One way to use ``shutdown`` effectively is in an HTTP-like exchange. The client +sends a request and then does a ``shutdown(1)``. This tells the server "This +client is done sending, but can still receive." The server can detect "EOF" by +a receive of 0 bytes. It can assume it has the complete request. The server +sends a reply. If the ``send`` completes successfully then, indeed, the client +was still receiving. + +Python takes the automatic shutdown a step further, and says that when a socket +is garbage collected, it will automatically do a ``close`` if it's needed. But +relying on this is a very bad habit. If your socket just disappears without +doing a ``close``, the socket at the other end may hang indefinitely, thinking +you're just being slow. *Please* ``close`` your sockets when you're done. + + +When Sockets Die +---------------- + +Probably the worst thing about using blocking sockets is what happens when the +other side comes down hard (without doing a ``close``). Your socket is likely to +hang. SOCKSTREAM is a reliable protocol, and it will wait a long, long time +before giving up on a connection. If you're using threads, the entire thread is +essentially dead. There's not much you can do about it. As long as you aren't +doing something dumb, like holding a lock while doing a blocking read, the +thread isn't really consuming much in the way of resources. Do *not* try to kill +the thread - part of the reason that threads are more efficient than processes +is that they avoid the overhead associated with the automatic recycling of +resources. In other words, if you do manage to kill the thread, your whole +process is likely to be screwed up. + + +Non-blocking Sockets +==================== + +If you've understood the preceeding, you already know most of what you need to +know about the mechanics of using sockets. You'll still use the same calls, in +much the same ways. It's just that, if you do it right, your app will be almost +inside-out. + +In Python, you use ``socket.setblocking(0)`` to make it non-blocking. In C, it's +more complex, (for one thing, you'll need to choose between the BSD flavor +``O_NONBLOCK`` and the almost indistinguishable Posix flavor ``O_NDELAY``, which +is completely different from ``TCP_NODELAY``), but it's the exact same idea. You +do this after creating the socket, but before using it. (Actually, if you're +nuts, you can switch back and forth.) + +The major mechanical difference is that ``send``, ``recv``, ``connect`` and +``accept`` can return without having done anything. You have (of course) a +number of choices. You can check return code and error codes and generally drive +yourself crazy. If you don't believe me, try it sometime. Your app will grow +large, buggy and suck CPU. So let's skip the brain-dead solutions and do it +right. + +Use ``select``. + +In C, coding ``select`` is fairly complex. In Python, it's a piece of cake, but +it's close enough to the C version that if you understand ``select`` in Python, +you'll have little trouble with it in C. :: + + ready_to_read, ready_to_write, in_error = \ + select.select( + potential_readers, + potential_writers, + potential_errs, + timeout) + +You pass ``select`` three lists: the first contains all sockets that you might +want to try reading; the second all the sockets you might want to try writing +to, and the last (normally left empty) those that you want to check for errors. +You should note that a socket can go into more than one list. The ``select`` +call is blocking, but you can give it a timeout. This is generally a sensible +thing to do - give it a nice long timeout (say a minute) unless you have good +reason to do otherwise. + +In return, you will get three lists. They have the sockets that are actually +readable, writable and in error. Each of these lists is a subset (possbily +empty) of the corresponding list you passed in. And if you put a socket in more +than one input list, it will only be (at most) in one output list. + +If a socket is in the output readable list, you can be +as-close-to-certain-as-we-ever-get-in-this-business that a ``recv`` on that +socket will return *something*. Same idea for the writable list. You'll be able +to send *something*. Maybe not all you want to, but *something* is better than +nothing. (Actually, any reasonably healthy socket will return as writable - it +just means outbound network buffer space is available.) + +If you have a "server" socket, put it in the potential_readers list. If it comes +out in the readable list, your ``accept`` will (almost certainly) work. If you +have created a new socket to ``connect`` to someone else, put it in the +ptoential_writers list. If it shows up in the writable list, you have a decent +chance that it has connected. + +One very nasty problem with ``select``: if somewhere in those input lists of +sockets is one which has died a nasty death, the ``select`` will fail. You then +need to loop through every single damn socket in all those lists and do a +``select([sock],[],[],0)`` until you find the bad one. That timeout of 0 means +it won't take long, but it's ugly. + +Actually, ``select`` can be handy even with blocking sockets. It's one way of +determining whether you will block - the socket returns as readable when there's +something in the buffers. However, this still doesn't help with the problem of +determining whether the other end is done, or just busy with something else. + +**Portability alert**: On Unix, ``select`` works both with the sockets and +files. Don't try this on Windows. On Windows, ``select`` works with sockets +only. Also note that in C, many of the more advanced socket options are done +differently on Windows. In fact, on Windows I usually use threads (which work +very, very well) with my sockets. Face it, if you want any kind of performance, +your code will look very different on Windows than on Unix. (I haven't the +foggiest how you do this stuff on a Mac.) + + +Performance +----------- + +There's no question that the fastest sockets code uses non-blocking sockets and +select to multiplex them. You can put together something that will saturate a +LAN connection without putting any strain on the CPU. The trouble is that an app +written this way can't do much of anything else - it needs to be ready to +shuffle bytes around at all times. + +Assuming that your app is actually supposed to do something more than that, +threading is the optimal solution, (and using non-blocking sockets will be +faster than using blocking sockets). Unfortunately, threading support in Unixes +varies both in API and quality. So the normal Unix solution is to fork a +subprocess to deal with each connection. The overhead for this is significant +(and don't do this on Windows - the overhead of process creation is enormous +there). It also means that unless each subprocess is completely independent, +you'll need to use another form of IPC, say a pipe, or shared memory and +semaphores, to communicate between the parent and child processes. + +Finally, remember that even though blocking sockets are somewhat slower than +non-blocking, in many cases they are the "right" solution. After all, if your +app is driven by the data it receives over a socket, there's not much sense in +complicating the logic just so your app can wait on ``select`` instead of +``recv``. + diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst new file mode 100644 index 0000000..16bd5a8 --- /dev/null +++ b/Doc/howto/unicode.rst @@ -0,0 +1,732 @@ +***************** + Unicode HOWTO +***************** + +:Release: 1.02 + +This HOWTO discusses Python's support for Unicode, and explains various problems +that people commonly encounter when trying to work with Unicode. + +Introduction to Unicode +======================= + +History of Character Codes +-------------------------- + +In 1968, the American Standard Code for Information Interchange, better known by +its acronym ASCII, was standardized. ASCII defined numeric codes for various +characters, with the numeric values running from 0 to +127. For example, the lowercase letter 'a' is assigned 97 as its code +value. + +ASCII was an American-developed standard, so it only defined unaccented +characters. There was an 'e', but no 'é' or 'Í'. This meant that languages +which required accented characters couldn't be faithfully represented in ASCII. +(Actually the missing accents matter for English, too, which contains words such +as 'naïve' and 'café', and some publications have house styles which require +spellings such as 'coöperate'.) + +For a while people just wrote programs that didn't display accents. I remember +looking at Apple ][ BASIC programs, published in French-language publications in +the mid-1980s, that had lines like these:: + + PRINT "FICHER EST COMPLETE." + PRINT "CARACTERE NON ACCEPTE." + +Those messages should contain accents, and they just look wrong to someone who +can read French. + +In the 1980s, almost all personal computers were 8-bit, meaning that bytes could +hold values ranging from 0 to 255. ASCII codes only went up to 127, so some +machines assigned values between 128 and 255 to accented characters. Different +machines had different codes, however, which led to problems exchanging files. +Eventually various commonly used sets of values for the 128-255 range emerged. +Some were true standards, defined by the International Standards Organization, +and some were **de facto** conventions that were invented by one company or +another and managed to catch on. + +255 characters aren't very many. For example, you can't fit both the accented +characters used in Western Europe and the Cyrillic alphabet used for Russian +into the 128-255 range because there are more than 127 such characters. + +You could write files using different codes (all your Russian files in a coding +system called KOI8, all your French files in a different coding system called +Latin1), but what if you wanted to write a French document that quotes some +Russian text? In the 1980s people began to want to solve this problem, and the +Unicode standardization effort began. + +Unicode started out using 16-bit characters instead of 8-bit characters. 16 +bits means you have 2^16 = 65,536 distinct values available, making it possible +to represent many different characters from many different alphabets; an initial +goal was to have Unicode contain the alphabets for every single human language. +It turns out that even 16 bits isn't enough to meet that goal, and the modern +Unicode specification uses a wider range of codes, 0-1,114,111 (0x10ffff in +base-16). + +There's a related ISO standard, ISO 10646. Unicode and ISO 10646 were +originally separate efforts, but the specifications were merged with the 1.1 +revision of Unicode. + +(This discussion of Unicode's history is highly simplified. I don't think the +average Python programmer needs to worry about the historical details; consult +the Unicode consortium site listed in the References for more information.) + + +Definitions +----------- + +A **character** is the smallest possible component of a text. 'A', 'B', 'C', +etc., are all different characters. So are 'È' and 'Í'. Characters are +abstractions, and vary depending on the language or context you're talking +about. For example, the symbol for ohms (Ω) is usually drawn much like the +capital letter omega (Ω) in the Greek alphabet (they may even be the same in +some fonts), but these are two different characters that have different +meanings. + +The Unicode standard describes how characters are represented by **code +points**. A code point is an integer value, usually denoted in base 16. In the +standard, a code point is written using the notation U+12ca to mean the +character with value 0x12ca (4810 decimal). The Unicode standard contains a lot +of tables listing characters and their corresponding code points:: + + 0061 'a'; LATIN SMALL LETTER A + 0062 'b'; LATIN SMALL LETTER B + 0063 'c'; LATIN SMALL LETTER C + ... + 007B '{'; LEFT CURLY BRACKET + +Strictly, these definitions imply that it's meaningless to say 'this is +character U+12ca'. U+12ca is a code point, which represents some particular +character; in this case, it represents the character 'ETHIOPIC SYLLABLE WI'. In +informal contexts, this distinction between code points and characters will +sometimes be forgotten. + +A character is represented on a screen or on paper by a set of graphical +elements that's called a **glyph**. The glyph for an uppercase A, for example, +is two diagonal strokes and a horizontal stroke, though the exact details will +depend on the font being used. Most Python code doesn't need to worry about +glyphs; figuring out the correct glyph to display is generally the job of a GUI +toolkit or a terminal's font renderer. + + +Encodings +--------- + +To summarize the previous section: a Unicode string is a sequence of code +points, which are numbers from 0 to 0x10ffff. This sequence needs to be +represented as a set of bytes (meaning, values from 0-255) in memory. The rules +for translating a Unicode string into a sequence of bytes are called an +**encoding**. + +The first encoding you might think of is an array of 32-bit integers. In this +representation, the string "Python" would look like this:: + + P y t h o n + 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 + +This representation is straightforward but using it presents a number of +problems. + +1. It's not portable; different processors order the bytes differently. + +2. It's very wasteful of space. In most texts, the majority of the code points + are less than 127, or less than 255, so a lot of space is occupied by zero + bytes. The above string takes 24 bytes compared to the 6 bytes needed for an + ASCII representation. Increased RAM usage doesn't matter too much (desktop + computers have megabytes of RAM, and strings aren't usually that large), but + expanding our usage of disk and network bandwidth by a factor of 4 is + intolerable. + +3. It's not compatible with existing C functions such as ``strlen()``, so a new + family of wide string functions would need to be used. + +4. Many Internet standards are defined in terms of textual data, and can't + handle content with embedded zero bytes. + +Generally people don't use this encoding, instead choosing other encodings that +are more efficient and convenient. + +Encodings don't have to handle every possible Unicode character, and most +encodings don't. For example, Python's default encoding is the 'ascii' +encoding. The rules for converting a Unicode string into the ASCII encoding are +simple; for each code point: + +1. If the code point is < 128, each byte is the same as the value of the code + point. + +2. If the code point is 128 or greater, the Unicode string can't be represented + in this encoding. (Python raises a :exc:`UnicodeEncodeError` exception in this + case.) + +Latin-1, also known as ISO-8859-1, is a similar encoding. Unicode code points +0-255 are identical to the Latin-1 values, so converting to this encoding simply +requires converting code points to byte values; if a code point larger than 255 +is encountered, the string can't be encoded into Latin-1. + +Encodings don't have to be simple one-to-one mappings like Latin-1. Consider +IBM's EBCDIC, which was used on IBM mainframes. Letter values weren't in one +block: 'a' through 'i' had values from 129 to 137, but 'j' through 'r' were 145 +through 153. If you wanted to use EBCDIC as an encoding, you'd probably use +some sort of lookup table to perform the conversion, but this is largely an +internal detail. + +UTF-8 is one of the most commonly used encodings. UTF stands for "Unicode +Transformation Format", and the '8' means that 8-bit numbers are used in the +encoding. (There's also a UTF-16 encoding, but it's less frequently used than +UTF-8.) UTF-8 uses the following rules: + +1. If the code point is <128, it's represented by the corresponding byte value. +2. If the code point is between 128 and 0x7ff, it's turned into two byte values + between 128 and 255. +3. Code points >0x7ff are turned into three- or four-byte sequences, where each + byte of the sequence is between 128 and 255. + +UTF-8 has several convenient properties: + +1. It can handle any Unicode code point. +2. A Unicode string is turned into a string of bytes containing no embedded zero + bytes. This avoids byte-ordering issues, and means UTF-8 strings can be + processed by C functions such as ``strcpy()`` and sent through protocols that + can't handle zero bytes. +3. A string of ASCII text is also valid UTF-8 text. +4. UTF-8 is fairly compact; the majority of code points are turned into two + bytes, and values less than 128 occupy only a single byte. +5. If bytes are corrupted or lost, it's possible to determine the start of the + next UTF-8-encoded code point and resynchronize. It's also unlikely that + random 8-bit data will look like valid UTF-8. + + + +References +---------- + +The Unicode Consortium site at has character charts, a +glossary, and PDF versions of the Unicode specification. Be prepared for some +difficult reading. is a chronology of the +origin and development of Unicode. + +To help understand the standard, Jukka Korpela has written an introductory guide +to reading the Unicode character tables, available at +. + +Roman Czyborra wrote another explanation of Unicode's basic principles; it's at +. Czyborra has written a number of +other Unicode-related documentation, available from . + +Two other good introductory articles were written by Joel Spolsky + and Jason Orendorff +. If this introduction didn't make +things clear to you, you should try reading one of these alternate articles +before continuing. + +Wikipedia entries are often helpful; see the entries for "character encoding" + and UTF-8 +, for example. + + +Python's Unicode Support +======================== + +Now that you've learned the rudiments of Unicode, we can look at Python's +Unicode features. + + +The Unicode Type +---------------- + +Unicode strings are expressed as instances of the :class:`unicode` type, one of +Python's repertoire of built-in types. It derives from an abstract type called +:class:`basestring`, which is also an ancestor of the :class:`str` type; you can +therefore check if a value is a string type with ``isinstance(value, +basestring)``. Under the hood, Python represents Unicode strings as either 16- +or 32-bit integers, depending on how the Python interpreter was compiled. + +The :func:`unicode` constructor has the signature ``unicode(string[, encoding, +errors])``. All of its arguments should be 8-bit strings. The first argument +is converted to Unicode using the specified encoding; if you leave off the +``encoding`` argument, the ASCII encoding is used for the conversion, so +characters greater than 127 will be treated as errors:: + + >>> unicode('abcdef') + u'abcdef' + >>> s = unicode('abcdef') + >>> type(s) + + >>> unicode('abcdef' + chr(255)) + Traceback (most recent call last): + File "", line 1, in ? + UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 6: + ordinal not in range(128) + +The ``errors`` argument specifies the response when the input string can't be +converted according to the encoding's rules. Legal values for this argument are +'strict' (raise a ``UnicodeDecodeError`` exception), 'replace' (add U+FFFD, +'REPLACEMENT CHARACTER'), or 'ignore' (just leave the character out of the +Unicode result). The following examples show the differences:: + + >>> unicode('\x80abc', errors='strict') + Traceback (most recent call last): + File "", line 1, in ? + UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: + ordinal not in range(128) + >>> unicode('\x80abc', errors='replace') + u'\ufffdabc' + >>> unicode('\x80abc', errors='ignore') + u'abc' + +Encodings are specified as strings containing the encoding's name. Python 2.4 +comes with roughly 100 different encodings; see the Python Library Reference at + for a list. Some encodings +have multiple names; for example, 'latin-1', 'iso_8859_1' and '8859' are all +synonyms for the same encoding. + +One-character Unicode strings can also be created with the :func:`unichr` +built-in function, which takes integers and returns a Unicode string of length 1 +that contains the corresponding code point. The reverse operation is the +built-in :func:`ord` function that takes a one-character Unicode string and +returns the code point value:: + + >>> unichr(40960) + u'\ua000' + >>> ord(u'\ua000') + 40960 + +Instances of the :class:`unicode` type have many of the same methods as the +8-bit string type for operations such as searching and formatting:: + + >>> s = u'Was ever feather so lightly blown to and fro as this multitude?' + >>> s.count('e') + 5 + >>> s.find('feather') + 9 + >>> s.find('bird') + -1 + >>> s.replace('feather', 'sand') + u'Was ever sand so lightly blown to and fro as this multitude?' + >>> s.upper() + u'WAS EVER FEATHER SO LIGHTLY BLOWN TO AND FRO AS THIS MULTITUDE?' + +Note that the arguments to these methods can be Unicode strings or 8-bit +strings. 8-bit strings will be converted to Unicode before carrying out the +operation; Python's default ASCII encoding will be used, so characters greater +than 127 will cause an exception:: + + >>> s.find('Was\x9f') + Traceback (most recent call last): + File "", line 1, in ? + UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 3: ordinal not in range(128) + >>> s.find(u'Was\x9f') + -1 + +Much Python code that operates on strings will therefore work with Unicode +strings without requiring any changes to the code. (Input and output code needs +more updating for Unicode; more on this later.) + +Another important method is ``.encode([encoding], [errors='strict'])``, which +returns an 8-bit string version of the Unicode string, encoded in the requested +encoding. The ``errors`` parameter is the same as the parameter of the +``unicode()`` constructor, with one additional possibility; as well as 'strict', +'ignore', and 'replace', you can also pass 'xmlcharrefreplace' which uses XML's +character references. The following example shows the different results:: + + >>> u = unichr(40960) + u'abcd' + unichr(1972) + >>> u.encode('utf-8') + '\xea\x80\x80abcd\xde\xb4' + >>> u.encode('ascii') + Traceback (most recent call last): + File "", line 1, in ? + UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128) + >>> u.encode('ascii', 'ignore') + 'abcd' + >>> u.encode('ascii', 'replace') + '?abcd?' + >>> u.encode('ascii', 'xmlcharrefreplace') + 'ꀀabcd޴' + +Python's 8-bit strings have a ``.decode([encoding], [errors])`` method that +interprets the string using the given encoding:: + + >>> u = unichr(40960) + u'abcd' + unichr(1972) # Assemble a string + >>> utf8_version = u.encode('utf-8') # Encode as UTF-8 + >>> type(utf8_version), utf8_version + (, '\xea\x80\x80abcd\xde\xb4') + >>> u2 = utf8_version.decode('utf-8') # Decode using UTF-8 + >>> u == u2 # The two strings match + True + +The low-level routines for registering and accessing the available encodings are +found in the :mod:`codecs` module. However, the encoding and decoding functions +returned by this module are usually more low-level than is comfortable, so I'm +not going to describe the :mod:`codecs` module here. If you need to implement a +completely new encoding, you'll need to learn about the :mod:`codecs` module +interfaces, but implementing encodings is a specialized task that also won't be +covered here. Consult the Python documentation to learn more about this module. + +The most commonly used part of the :mod:`codecs` module is the +:func:`codecs.open` function which will be discussed in the section on input and +output. + + +Unicode Literals in Python Source Code +-------------------------------------- + +In Python source code, Unicode literals are written as strings prefixed with the +'u' or 'U' character: ``u'abcdefghijk'``. Specific code points can be written +using the ``\u`` escape sequence, which is followed by four hex digits giving +the code point. The ``\U`` escape sequence is similar, but expects 8 hex +digits, not 4. + +Unicode literals can also use the same escape sequences as 8-bit strings, +including ``\x``, but ``\x`` only takes two hex digits so it can't express an +arbitrary code point. Octal escapes can go up to U+01ff, which is octal 777. + +:: + + >>> s = u"a\xac\u1234\u20ac\U00008000" + ^^^^ two-digit hex escape + ^^^^^^ four-digit Unicode escape + ^^^^^^^^^^ eight-digit Unicode escape + >>> for c in s: print ord(c), + ... + 97 172 4660 8364 32768 + +Using escape sequences for code points greater than 127 is fine in small doses, +but becomes an annoyance if you're using many accented characters, as you would +in a program with messages in French or some other accent-using language. You +can also assemble strings using the :func:`unichr` built-in function, but this is +even more tedious. + +Ideally, you'd want to be able to write literals in your language's natural +encoding. You could then edit Python source code with your favorite editor +which would display the accented characters naturally, and have the right +characters used at runtime. + +Python supports writing Unicode literals in any encoding, but you have to +declare the encoding being used. This is done by including a special comment as +either the first or second line of the source file:: + + #!/usr/bin/env python + # -*- coding: latin-1 -*- + + u = u'abcdé' + print ord(u[-1]) + +The syntax is inspired by Emacs's notation for specifying variables local to a +file. Emacs supports many different variables, but Python only supports +'coding'. The ``-*-`` symbols indicate that the comment is special; within +them, you must supply the name ``coding`` and the name of your chosen encoding, +separated by ``':'``. + +If you don't include such a comment, the default encoding used will be ASCII. +Versions of Python before 2.4 were Euro-centric and assumed Latin-1 as a default +encoding for string literals; in Python 2.4, characters greater than 127 still +work but result in a warning. For example, the following program has no +encoding declaration:: + + #!/usr/bin/env python + u = u'abcdé' + print ord(u[-1]) + +When you run it with Python 2.4, it will output the following warning:: + + amk:~$ python p263.py + sys:1: DeprecationWarning: Non-ASCII character '\xe9' + in file p263.py on line 2, but no encoding declared; + see http://www.python.org/peps/pep-0263.html for details + + +Unicode Properties +------------------ + +The Unicode specification includes a database of information about code points. +For each code point that's defined, the information includes the character's +name, its category, the numeric value if applicable (Unicode has characters +representing the Roman numerals and fractions such as one-third and +four-fifths). There are also properties related to the code point's use in +bidirectional text and other display-related properties. + +The following program displays some information about several characters, and +prints the numeric value of one particular character:: + + import unicodedata + + u = unichr(233) + unichr(0x0bf2) + unichr(3972) + unichr(6000) + unichr(13231) + + for i, c in enumerate(u): + print i, '%04x' % ord(c), unicodedata.category(c), + print unicodedata.name(c) + + # Get numeric value of second character + print unicodedata.numeric(u[1]) + +When run, this prints:: + + 0 00e9 Ll LATIN SMALL LETTER E WITH ACUTE + 1 0bf2 No TAMIL NUMBER ONE THOUSAND + 2 0f84 Mn TIBETAN MARK HALANTA + 3 1770 Lo TAGBANWA LETTER SA + 4 33af So SQUARE RAD OVER S SQUARED + 1000.0 + +The category codes are abbreviations describing the nature of the character. +These are grouped into categories such as "Letter", "Number", "Punctuation", or +"Symbol", which in turn are broken up into subcategories. To take the codes +from the above output, ``'Ll'`` means 'Letter, lowercase', ``'No'`` means +"Number, other", ``'Mn'`` is "Mark, nonspacing", and ``'So'`` is "Symbol, +other". See + for a +list of category codes. + +References +---------- + +The Unicode and 8-bit string types are described in the Python library reference +at :ref:`typesseq`. + +The documentation for the :mod:`unicodedata` module. + +The documentation for the :mod:`codecs` module. + +Marc-André Lemburg gave a presentation at EuroPython 2002 titled "Python and +Unicode". A PDF version of his slides is available at +, and is an +excellent overview of the design of Python's Unicode features. + + +Reading and Writing Unicode Data +================================ + +Once you've written some code that works with Unicode data, the next problem is +input/output. How do you get Unicode strings into your program, and how do you +convert Unicode into a form suitable for storage or transmission? + +It's possible that you may not need to do anything depending on your input +sources and output destinations; you should check whether the libraries used in +your application support Unicode natively. XML parsers often return Unicode +data, for example. Many relational databases also support Unicode-valued +columns and can return Unicode values from an SQL query. + +Unicode data is usually converted to a particular encoding before it gets +written to disk or sent over a socket. It's possible to do all the work +yourself: open a file, read an 8-bit string from it, and convert the string with +``unicode(str, encoding)``. However, the manual approach is not recommended. + +One problem is the multi-byte nature of encodings; one Unicode character can be +represented by several bytes. If you want to read the file in arbitrary-sized +chunks (say, 1K or 4K), you need to write error-handling code to catch the case +where only part of the bytes encoding a single Unicode character are read at the +end of a chunk. One solution would be to read the entire file into memory and +then perform the decoding, but that prevents you from working with files that +are extremely large; if you need to read a 2Gb file, you need 2Gb of RAM. +(More, really, since for at least a moment you'd need to have both the encoded +string and its Unicode version in memory.) + +The solution would be to use the low-level decoding interface to catch the case +of partial coding sequences. The work of implementing this has already been +done for you: the :mod:`codecs` module includes a version of the :func:`open` +function that returns a file-like object that assumes the file's contents are in +a specified encoding and accepts Unicode parameters for methods such as +``.read()`` and ``.write()``. + +The function's parameters are ``open(filename, mode='rb', encoding=None, +errors='strict', buffering=1)``. ``mode`` can be ``'r'``, ``'w'``, or ``'a'``, +just like the corresponding parameter to the regular built-in ``open()`` +function; add a ``'+'`` to update the file. ``buffering`` is similarly parallel +to the standard function's parameter. ``encoding`` is a string giving the +encoding to use; if it's left as ``None``, a regular Python file object that +accepts 8-bit strings is returned. Otherwise, a wrapper object is returned, and +data written to or read from the wrapper object will be converted as needed. +``errors`` specifies the action for encoding errors and can be one of the usual +values of 'strict', 'ignore', and 'replace'. + +Reading Unicode from a file is therefore simple:: + + import codecs + f = codecs.open('unicode.rst', encoding='utf-8') + for line in f: + print repr(line) + +It's also possible to open files in update mode, allowing both reading and +writing:: + + f = codecs.open('test', encoding='utf-8', mode='w+') + f.write(u'\u4500 blah blah blah\n') + f.seek(0) + print repr(f.readline()[:1]) + f.close() + +Unicode character U+FEFF is used as a byte-order mark (BOM), and is often +written as the first character of a file in order to assist with autodetection +of the file's byte ordering. Some encodings, such as UTF-16, expect a BOM to be +present at the start of a file; when such an encoding is used, the BOM will be +automatically written as the first character and will be silently dropped when +the file is read. There are variants of these encodings, such as 'utf-16-le' +and 'utf-16-be' for little-endian and big-endian encodings, that specify one +particular byte ordering and don't skip the BOM. + + +Unicode filenames +----------------- + +Most of the operating systems in common use today support filenames that contain +arbitrary Unicode characters. Usually this is implemented by converting the +Unicode string into some encoding that varies depending on the system. For +example, MacOS X uses UTF-8 while Windows uses a configurable encoding; on +Windows, Python uses the name "mbcs" to refer to whatever the currently +configured encoding is. On Unix systems, there will only be a filesystem +encoding if you've set the ``LANG`` or ``LC_CTYPE`` environment variables; if +you haven't, the default encoding is ASCII. + +The :func:`sys.getfilesystemencoding` function returns the encoding to use on +your current system, in case you want to do the encoding manually, but there's +not much reason to bother. When opening a file for reading or writing, you can +usually just provide the Unicode string as the filename, and it will be +automatically converted to the right encoding for you:: + + filename = u'filename\u4500abc' + f = open(filename, 'w') + f.write('blah\n') + f.close() + +Functions in the :mod:`os` module such as :func:`os.stat` will also accept Unicode +filenames. + +:func:`os.listdir`, which returns filenames, raises an issue: should it return +the Unicode version of filenames, or should it return 8-bit strings containing +the encoded versions? :func:`os.listdir` will do both, depending on whether you +provided the directory path as an 8-bit string or a Unicode string. If you pass +a Unicode string as the path, filenames will be decoded using the filesystem's +encoding and a list of Unicode strings will be returned, while passing an 8-bit +path will return the 8-bit versions of the filenames. For example, assuming the +default filesystem encoding is UTF-8, running the following program:: + + fn = u'filename\u4500abc' + f = open(fn, 'w') + f.close() + + import os + print os.listdir('.') + print os.listdir(u'.') + +will produce the following output:: + + amk:~$ python t.py + ['.svn', 'filename\xe4\x94\x80abc', ...] + [u'.svn', u'filename\u4500abc', ...] + +The first list contains UTF-8-encoded filenames, and the second list contains +the Unicode versions. + + + +Tips for Writing Unicode-aware Programs +--------------------------------------- + +This section provides some suggestions on writing software that deals with +Unicode. + +The most important tip is: + + Software should only work with Unicode strings internally, converting to a + particular encoding on output. + +If you attempt to write processing functions that accept both Unicode and 8-bit +strings, you will find your program vulnerable to bugs wherever you combine the +two different kinds of strings. Python's default encoding is ASCII, so whenever +a character with an ASCII value > 127 is in the input data, you'll get a +:exc:`UnicodeDecodeError` because that character can't be handled by the ASCII +encoding. + +It's easy to miss such problems if you only test your software with data that +doesn't contain any accents; everything will seem to work, but there's actually +a bug in your program waiting for the first user who attempts to use characters +> 127. A second tip, therefore, is: + + Include characters > 127 and, even better, characters > 255 in your test + data. + +When using data coming from a web browser or some other untrusted source, a +common technique is to check for illegal characters in a string before using the +string in a generated command line or storing it in a database. If you're doing +this, be careful to check the string once it's in the form that will be used or +stored; it's possible for encodings to be used to disguise characters. This is +especially true if the input data also specifies the encoding; many encodings +leave the commonly checked-for characters alone, but Python includes some +encodings such as ``'base64'`` that modify every single character. + +For example, let's say you have a content management system that takes a Unicode +filename, and you want to disallow paths with a '/' character. You might write +this code:: + + def read_file (filename, encoding): + if '/' in filename: + raise ValueError("'/' not allowed in filenames") + unicode_name = filename.decode(encoding) + f = open(unicode_name, 'r') + # ... return contents of file ... + +However, if an attacker could specify the ``'base64'`` encoding, they could pass +``'L2V0Yy9wYXNzd2Q='``, which is the base-64 encoded form of the string +``'/etc/passwd'``, to read a system file. The above code looks for ``'/'`` +characters in the encoded form and misses the dangerous character in the +resulting decoded form. + +References +---------- + +The PDF slides for Marc-André Lemburg's presentation "Writing Unicode-aware +Applications in Python" are available at + +and discuss questions of character encodings as well as how to internationalize +and localize an application. + + +Revision History and Acknowledgements +===================================== + +Thanks to the following people who have noted errors or offered suggestions on +this article: Nicholas Bastin, Marius Gedminas, Kent Johnson, Ken Krugler, +Marc-André Lemburg, Martin von Löwis, Chad Whitacre. + +Version 1.0: posted August 5 2005. + +Version 1.01: posted August 7 2005. Corrects factual and markup errors; adds +several links. + +Version 1.02: posted August 16 2005. Corrects factual errors. + + +.. comment Additional topic: building Python w/ UCS2 or UCS4 support +.. comment Describe obscure -U switch somewhere? +.. comment Describe use of codecs.StreamRecoder and StreamReaderWriter + +.. comment + Original outline: + + - [ ] Unicode introduction + - [ ] ASCII + - [ ] Terms + - [ ] Character + - [ ] Code point + - [ ] Encodings + - [ ] Common encodings: ASCII, Latin-1, UTF-8 + - [ ] Unicode Python type + - [ ] Writing unicode literals + - [ ] Obscurity: -U switch + - [ ] Built-ins + - [ ] unichr() + - [ ] ord() + - [ ] unicode() constructor + - [ ] Unicode type + - [ ] encode(), decode() methods + - [ ] Unicodedata module for character properties + - [ ] I/O + - [ ] Reading/writing Unicode data into files + - [ ] Byte-order marks + - [ ] Unicode filenames + - [ ] Writing Unicode programs + - [ ] Do everything in Unicode + - [ ] Declaring source code encodings (PEP 263) + - [ ] Other issues + - [ ] Building Python (UCS2, UCS4) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst new file mode 100644 index 0000000..dc20b02 --- /dev/null +++ b/Doc/howto/urllib2.rst @@ -0,0 +1,578 @@ +************************************************ + HOWTO Fetch Internet Resources Using urllib2 +************************************************ + +:Author: `Michael Foord `_ + +.. note:: + + There is an French translation of an earlier revision of this + HOWTO, available at `urllib2 - Le Manuel manquant + `_. + + + +Introduction +============ + +.. sidebar:: Related Articles + + You may also find useful the following article on fetching web resources + with Python : + + * `Basic Authentication `_ + + A tutorial on *Basic Authentication*, with examples in Python. + +**urllib2** is a `Python `_ module for fetching URLs +(Uniform Resource Locators). It offers a very simple interface, in the form of +the *urlopen* function. This is capable of fetching URLs using a variety of +different protocols. It also offers a slightly more complex interface for +handling common situations - like basic authentication, cookies, proxies and so +on. These are provided by objects called handlers and openers. + +urllib2 supports fetching URLs for many "URL schemes" (identified by the string +before the ":" in URL - for example "ftp" is the URL scheme of +"ftp://python.org/") using their associated network protocols (e.g. FTP, HTTP). +This tutorial focuses on the most common case, HTTP. + +For straightforward situations *urlopen* is very easy to use. But as soon as you +encounter errors or non-trivial cases when opening HTTP URLs, you will need some +understanding of the HyperText Transfer Protocol. The most comprehensive and +authoritative reference to HTTP is :rfc:`2616`. This is a technical document and +not intended to be easy to read. This HOWTO aims to illustrate using *urllib2*, +with enough detail about HTTP to help you through. It is not intended to replace +the :mod:`urllib2` docs, but is supplementary to them. + + +Fetching URLs +============= + +The simplest way to use urllib2 is as follows:: + + import urllib2 + response = urllib2.urlopen('http://python.org/') + html = response.read() + +Many uses of urllib2 will be that simple (note that instead of an 'http:' URL we +could have used an URL starting with 'ftp:', 'file:', etc.). However, it's the +purpose of this tutorial to explain the more complicated cases, concentrating on +HTTP. + +HTTP is based on requests and responses - the client makes requests and servers +send responses. urllib2 mirrors this with a ``Request`` object which represents +the HTTP request you are making. In its simplest form you create a Request +object that specifies the URL you want to fetch. Calling ``urlopen`` with this +Request object returns a response object for the URL requested. This response is +a file-like object, which means you can for example call ``.read()`` on the +response:: + + import urllib2 + + req = urllib2.Request('http://www.voidspace.org.uk') + response = urllib2.urlopen(req) + the_page = response.read() + +Note that urllib2 makes use of the same Request interface to handle all URL +schemes. For example, you can make an FTP request like so:: + + req = urllib2.Request('ftp://example.com/') + +In the case of HTTP, there are two extra things that Request objects allow you +to do: First, you can pass data to be sent to the server. Second, you can pass +extra information ("metadata") *about* the data or the about request itself, to +the server - this information is sent as HTTP "headers". Let's look at each of +these in turn. + +Data +---- + +Sometimes you want to send data to a URL (often the URL will refer to a CGI +(Common Gateway Interface) script [#]_ or other web application). With HTTP, +this is often done using what's known as a **POST** request. This is often what +your browser does when you submit a HTML form that you filled in on the web. Not +all POSTs have to come from forms: you can use a POST to transmit arbitrary data +to your own application. In the common case of HTML forms, the data needs to be +encoded in a standard way, and then passed to the Request object as the ``data`` +argument. The encoding is done using a function from the ``urllib`` library +*not* from ``urllib2``. :: + + import urllib + import urllib2 + + url = 'http://www.someserver.com/cgi-bin/register.cgi' + values = {'name' : 'Michael Foord', + 'location' : 'Northampton', + 'language' : 'Python' } + + data = urllib.urlencode(values) + req = urllib2.Request(url, data) + response = urllib2.urlopen(req) + the_page = response.read() + +Note that other encodings are sometimes required (e.g. for file upload from HTML +forms - see `HTML Specification, Form Submission +`_ for more +details). + +If you do not pass the ``data`` argument, urllib2 uses a **GET** request. One +way in which GET and POST requests differ is that POST requests often have +"side-effects": they change the state of the system in some way (for example by +placing an order with the website for a hundredweight of tinned spam to be +delivered to your door). Though the HTTP standard makes it clear that POSTs are +intended to *always* cause side-effects, and GET requests *never* to cause +side-effects, nothing prevents a GET request from having side-effects, nor a +POST requests from having no side-effects. Data can also be passed in an HTTP +GET request by encoding it in the URL itself. + +This is done as follows:: + + >>> import urllib2 + >>> import urllib + >>> data = {} + >>> data['name'] = 'Somebody Here' + >>> data['location'] = 'Northampton' + >>> data['language'] = 'Python' + >>> url_values = urllib.urlencode(data) + >>> print url_values + name=Somebody+Here&language=Python&location=Northampton + >>> url = 'http://www.example.com/example.cgi' + >>> full_url = url + '?' + url_values + >>> data = urllib2.open(full_url) + +Notice that the full URL is created by adding a ``?`` to the URL, followed by +the encoded values. + +Headers +------- + +We'll discuss here one particular HTTP header, to illustrate how to add headers +to your HTTP request. + +Some websites [#]_ dislike being browsed by programs, or send different versions +to different browsers [#]_ . By default urllib2 identifies itself as +``Python-urllib/x.y`` (where ``x`` and ``y`` are the major and minor version +numbers of the Python release, +e.g. ``Python-urllib/2.5``), which may confuse the site, or just plain +not work. The way a browser identifies itself is through the +``User-Agent`` header [#]_. When you create a Request object you can +pass a dictionary of headers in. The following example makes the same +request as above, but identifies itself as a version of Internet +Explorer [#]_. :: + + import urllib + import urllib2 + + url = 'http://www.someserver.com/cgi-bin/register.cgi' + user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' + values = {'name' : 'Michael Foord', + 'location' : 'Northampton', + 'language' : 'Python' } + headers = { 'User-Agent' : user_agent } + + data = urllib.urlencode(values) + req = urllib2.Request(url, data, headers) + response = urllib2.urlopen(req) + the_page = response.read() + +The response also has two useful methods. See the section on `info and geturl`_ +which comes after we have a look at what happens when things go wrong. + + +Handling Exceptions +=================== + +*urlopen* raises ``URLError`` when it cannot handle a response (though as usual +with Python APIs, builtin exceptions such as ValueError, TypeError etc. may also +be raised). + +``HTTPError`` is the subclass of ``URLError`` raised in the specific case of +HTTP URLs. + +URLError +-------- + +Often, URLError is raised because there is no network connection (no route to +the specified server), or the specified server doesn't exist. In this case, the +exception raised will have a 'reason' attribute, which is a tuple containing an +error code and a text error message. + +e.g. :: + + >>> req = urllib2.Request('http://www.pretend_server.org') + >>> try: urllib2.urlopen(req) + >>> except URLError, e: + >>> print e.reason + >>> + (4, 'getaddrinfo failed') + + +HTTPError +--------- + +Every HTTP response from the server contains a numeric "status code". Sometimes +the status code indicates that the server is unable to fulfil the request. The +default handlers will handle some of these responses for you (for example, if +the response is a "redirection" that requests the client fetch the document from +a different URL, urllib2 will handle that for you). For those it can't handle, +urlopen will raise an ``HTTPError``. Typical errors include '404' (page not +found), '403' (request forbidden), and '401' (authentication required). + +See section 10 of RFC 2616 for a reference on all the HTTP error codes. + +The ``HTTPError`` instance raised will have an integer 'code' attribute, which +corresponds to the error sent by the server. + +Error Codes +~~~~~~~~~~~ + +Because the default handlers handle redirects (codes in the 300 range), and +codes in the 100-299 range indicate success, you will usually only see error +codes in the 400-599 range. + +``BaseHTTPServer.BaseHTTPRequestHandler.responses`` is a useful dictionary of +response codes in that shows all the response codes used by RFC 2616. The +dictionary is reproduced here for convenience :: + + # Table mapping response codes to messages; entries have the + # form {code: (shortmessage, longmessage)}. + responses = { + 100: ('Continue', 'Request received, please continue'), + 101: ('Switching Protocols', + 'Switching to new protocol; obey Upgrade header'), + + 200: ('OK', 'Request fulfilled, document follows'), + 201: ('Created', 'Document created, URL follows'), + 202: ('Accepted', + 'Request accepted, processing continues off-line'), + 203: ('Non-Authoritative Information', 'Request fulfilled from cache'), + 204: ('No Content', 'Request fulfilled, nothing follows'), + 205: ('Reset Content', 'Clear input form for further input.'), + 206: ('Partial Content', 'Partial content follows.'), + + 300: ('Multiple Choices', + 'Object has several resources -- see URI list'), + 301: ('Moved Permanently', 'Object moved permanently -- see URI list'), + 302: ('Found', 'Object moved temporarily -- see URI list'), + 303: ('See Other', 'Object moved -- see Method and URL list'), + 304: ('Not Modified', + 'Document has not changed since given time'), + 305: ('Use Proxy', + 'You must use proxy specified in Location to access this ' + 'resource.'), + 307: ('Temporary Redirect', + 'Object moved temporarily -- see URI list'), + + 400: ('Bad Request', + 'Bad request syntax or unsupported method'), + 401: ('Unauthorized', + 'No permission -- see authorization schemes'), + 402: ('Payment Required', + 'No payment -- see charging schemes'), + 403: ('Forbidden', + 'Request forbidden -- authorization will not help'), + 404: ('Not Found', 'Nothing matches the given URI'), + 405: ('Method Not Allowed', + 'Specified method is invalid for this server.'), + 406: ('Not Acceptable', 'URI not available in preferred format.'), + 407: ('Proxy Authentication Required', 'You must authenticate with ' + 'this proxy before proceeding.'), + 408: ('Request Timeout', 'Request timed out; try again later.'), + 409: ('Conflict', 'Request conflict.'), + 410: ('Gone', + 'URI no longer exists and has been permanently removed.'), + 411: ('Length Required', 'Client must specify Content-Length.'), + 412: ('Precondition Failed', 'Precondition in headers is false.'), + 413: ('Request Entity Too Large', 'Entity is too large.'), + 414: ('Request-URI Too Long', 'URI is too long.'), + 415: ('Unsupported Media Type', 'Entity body in unsupported format.'), + 416: ('Requested Range Not Satisfiable', + 'Cannot satisfy request range.'), + 417: ('Expectation Failed', + 'Expect condition could not be satisfied.'), + + 500: ('Internal Server Error', 'Server got itself in trouble'), + 501: ('Not Implemented', + 'Server does not support this operation'), + 502: ('Bad Gateway', 'Invalid responses from another server/proxy.'), + 503: ('Service Unavailable', + 'The server cannot process the request due to a high load'), + 504: ('Gateway Timeout', + 'The gateway server did not receive a timely response'), + 505: ('HTTP Version Not Supported', 'Cannot fulfill request.'), + } + +When an error is raised the server responds by returning an HTTP error code +*and* an error page. You can use the ``HTTPError`` instance as a response on the +page returned. This means that as well as the code attribute, it also has read, +geturl, and info, methods. :: + + >>> req = urllib2.Request('http://www.python.org/fish.html') + >>> try: + >>> urllib2.urlopen(req) + >>> except URLError, e: + >>> print e.code + >>> print e.read() + >>> + 404 + + + Error 404: File Not Found + ...... etc... + +Wrapping it Up +-------------- + +So if you want to be prepared for ``HTTPError`` *or* ``URLError`` there are two +basic approaches. I prefer the second approach. + +Number 1 +~~~~~~~~ + +:: + + + from urllib2 import Request, urlopen, URLError, HTTPError + req = Request(someurl) + try: + response = urlopen(req) + except HTTPError, e: + print 'The server couldn\'t fulfill the request.' + print 'Error code: ', e.code + except URLError, e: + print 'We failed to reach a server.' + print 'Reason: ', e.reason + else: + # everything is fine + + +.. note:: + + The ``except HTTPError`` *must* come first, otherwise ``except URLError`` + will *also* catch an ``HTTPError``. + +Number 2 +~~~~~~~~ + +:: + + from urllib2 import Request, urlopen, URLError + req = Request(someurl) + try: + response = urlopen(req) + except URLError, e: + if hasattr(e, 'reason'): + print 'We failed to reach a server.' + print 'Reason: ', e.reason + elif hasattr(e, 'code'): + print 'The server couldn\'t fulfill the request.' + print 'Error code: ', e.code + else: + # everything is fine + + +info and geturl +=============== + +The response returned by urlopen (or the ``HTTPError`` instance) has two useful +methods ``info`` and ``geturl``. + +**geturl** - this returns the real URL of the page fetched. This is useful +because ``urlopen`` (or the opener object used) may have followed a +redirect. The URL of the page fetched may not be the same as the URL requested. + +**info** - this returns a dictionary-like object that describes the page +fetched, particularly the headers sent by the server. It is currently an +``httplib.HTTPMessage`` instance. + +Typical headers include 'Content-length', 'Content-type', and so on. See the +`Quick Reference to HTTP Headers `_ +for a useful listing of HTTP headers with brief explanations of their meaning +and use. + + +Openers and Handlers +==================== + +When you fetch a URL you use an opener (an instance of the perhaps +confusingly-named :class:`urllib2.OpenerDirector`). Normally we have been using +the default opener - via ``urlopen`` - but you can create custom +openers. Openers use handlers. All the "heavy lifting" is done by the +handlers. Each handler knows how to open URLs for a particular URL scheme (http, +ftp, etc.), or how to handle an aspect of URL opening, for example HTTP +redirections or HTTP cookies. + +You will want to create openers if you want to fetch URLs with specific handlers +installed, for example to get an opener that handles cookies, or to get an +opener that does not handle redirections. + +To create an opener, instantiate an ``OpenerDirector``, and then call +``.add_handler(some_handler_instance)`` repeatedly. + +Alternatively, you can use ``build_opener``, which is a convenience function for +creating opener objects with a single function call. ``build_opener`` adds +several handlers by default, but provides a quick way to add more and/or +override the default handlers. + +Other sorts of handlers you might want to can handle proxies, authentication, +and other common but slightly specialised situations. + +``install_opener`` can be used to make an ``opener`` object the (global) default +opener. This means that calls to ``urlopen`` will use the opener you have +installed. + +Opener objects have an ``open`` method, which can be called directly to fetch +urls in the same way as the ``urlopen`` function: there's no need to call +``install_opener``, except as a convenience. + + +Basic Authentication +==================== + +To illustrate creating and installing a handler we will use the +``HTTPBasicAuthHandler``. For a more detailed discussion of this subject -- +including an explanation of how Basic Authentication works - see the `Basic +Authentication Tutorial +`_. + +When authentication is required, the server sends a header (as well as the 401 +error code) requesting authentication. This specifies the authentication scheme +and a 'realm'. The header looks like : ``Www-authenticate: SCHEME +realm="REALM"``. + +e.g. :: + + Www-authenticate: Basic realm="cPanel Users" + + +The client should then retry the request with the appropriate name and password +for the realm included as a header in the request. This is 'basic +authentication'. In order to simplify this process we can create an instance of +``HTTPBasicAuthHandler`` and an opener to use this handler. + +The ``HTTPBasicAuthHandler`` uses an object called a password manager to handle +the mapping of URLs and realms to passwords and usernames. If you know what the +realm is (from the authentication header sent by the server), then you can use a +``HTTPPasswordMgr``. Frequently one doesn't care what the realm is. In that +case, it is convenient to use ``HTTPPasswordMgrWithDefaultRealm``. This allows +you to specify a default username and password for a URL. This will be supplied +in the absence of you providing an alternative combination for a specific +realm. We indicate this by providing ``None`` as the realm argument to the +``add_password`` method. + +The top-level URL is the first URL that requires authentication. URLs "deeper" +than the URL you pass to .add_password() will also match. :: + + # create a password manager + password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() + + # Add the username and password. + # If we knew the realm, we could use it instead of ``None``. + top_level_url = "http://example.com/foo/" + password_mgr.add_password(None, top_level_url, username, password) + + handler = urllib2.HTTPBasicAuthHandler(password_mgr) + + # create "opener" (OpenerDirector instance) + opener = urllib2.build_opener(handler) + + # use the opener to fetch a URL + opener.open(a_url) + + # Install the opener. + # Now all calls to urllib2.urlopen use our opener. + urllib2.install_opener(opener) + +.. note:: + + In the above example we only supplied our ``HHTPBasicAuthHandler`` to + ``build_opener``. By default openers have the handlers for normal situations + -- ``ProxyHandler``, ``UnknownHandler``, ``HTTPHandler``, + ``HTTPDefaultErrorHandler``, ``HTTPRedirectHandler``, ``FTPHandler``, + ``FileHandler``, ``HTTPErrorProcessor``. + +``top_level_url`` is in fact *either* a full URL (including the 'http:' scheme +component and the hostname and optionally the port number) +e.g. "http://example.com/" *or* an "authority" (i.e. the hostname, +optionally including the port number) e.g. "example.com" or "example.com:8080" +(the latter example includes a port number). The authority, if present, must +NOT contain the "userinfo" component - for example "joe@password:example.com" is +not correct. + + +Proxies +======= + +**urllib2** will auto-detect your proxy settings and use those. This is through +the ``ProxyHandler`` which is part of the normal handler chain. Normally that's +a good thing, but there are occasions when it may not be helpful [#]_. One way +to do this is to setup our own ``ProxyHandler``, with no proxies defined. This +is done using similar steps to setting up a `Basic Authentication`_ handler : :: + + >>> proxy_support = urllib2.ProxyHandler({}) + >>> opener = urllib2.build_opener(proxy_support) + >>> urllib2.install_opener(opener) + +.. note:: + + Currently ``urllib2`` *does not* support fetching of ``https`` locations + through a proxy. However, this can be enabled by extending urllib2 as + shown in the recipe [#]_. + + +Sockets and Layers +================== + +The Python support for fetching resources from the web is layered. urllib2 uses +the httplib library, which in turn uses the socket library. + +As of Python 2.3 you can specify how long a socket should wait for a response +before timing out. This can be useful in applications which have to fetch web +pages. By default the socket module has *no timeout* and can hang. Currently, +the socket timeout is not exposed at the httplib or urllib2 levels. However, +you can set the default timeout globally for all sockets using :: + + import socket + import urllib2 + + # timeout in seconds + timeout = 10 + socket.setdefaulttimeout(timeout) + + # this call to urllib2.urlopen now uses the default timeout + # we have set in the socket module + req = urllib2.Request('http://www.voidspace.org.uk') + response = urllib2.urlopen(req) + + +------- + + +Footnotes +========= + +This document was reviewed and revised by John Lee. + +.. [#] For an introduction to the CGI protocol see + `Writing Web Applications in Python `_. +.. [#] Like Google for example. The *proper* way to use google from a program + is to use `PyGoogle `_ of course. See + `Voidspace Google `_ + for some examples of using the Google API. +.. [#] Browser sniffing is a very bad practise for website design - building + sites using web standards is much more sensible. Unfortunately a lot of + sites still send different versions to different browsers. +.. [#] The user agent for MSIE 6 is + *'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)'* +.. [#] For details of more HTTP request headers, see + `Quick Reference to HTTP Headers`_. +.. [#] In my case I have to use a proxy to access the internet at work. If you + attempt to fetch *localhost* URLs through this proxy it blocks them. IE + is set to use the proxy, which urllib2 picks up on. In order to test + scripts with a localhost server, I have to prevent urllib2 from using + the proxy. +.. [#] urllib2 opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe + `_. + diff --git a/Doc/includes/email-dir.py b/Doc/includes/email-dir.py new file mode 100644 index 0000000..c04f57d --- /dev/null +++ b/Doc/includes/email-dir.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +"""Send the contents of a directory as a MIME message.""" + +import os +import sys +import smtplib +# For guessing MIME type based on file name extension +import mimetypes + +from optparse import OptionParser + +from email import encoders +from email.message import Message +from email.mime.audio import MIMEAudio +from email.mime.base import MIMEBase +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText + +COMMASPACE = ', ' + + +def main(): + parser = OptionParser(usage="""\ +Send the contents of a directory as a MIME message. + +Usage: %prog [options] + +Unless the -o option is given, the email is sent by forwarding to your local +SMTP server, which then does the normal delivery process. Your local machine +must be running an SMTP server. +""") + parser.add_option('-d', '--directory', + type='string', action='store', + help="""Mail the contents of the specified directory, + otherwise use the current directory. Only the regular + files in the directory are sent, and we don't recurse to + subdirectories.""") + parser.add_option('-o', '--output', + type='string', action='store', metavar='FILE', + help="""Print the composed message to FILE instead of + sending the message to the SMTP server.""") + parser.add_option('-s', '--sender', + type='string', action='store', metavar='SENDER', + help='The value of the From: header (required)') + parser.add_option('-r', '--recipient', + type='string', action='append', metavar='RECIPIENT', + default=[], dest='recipients', + help='A To: header value (at least one required)') + opts, args = parser.parse_args() + if not opts.sender or not opts.recipients: + parser.print_help() + sys.exit(1) + directory = opts.directory + if not directory: + directory = '.' + # Create the enclosing (outer) message + outer = MIMEMultipart() + outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory) + outer['To'] = COMMASPACE.join(opts.recipients) + outer['From'] = opts.sender + outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' + + for filename in os.listdir(directory): + path = os.path.join(directory, filename) + if not os.path.isfile(path): + continue + # Guess the content type based on the file's extension. Encoding + # will be ignored, although we should check for simple things like + # gzip'd or compressed files. + ctype, encoding = mimetypes.guess_type(path) + if ctype is None or encoding is not None: + # No guess could be made, or the file is encoded (compressed), so + # use a generic bag-of-bits type. + ctype = 'application/octet-stream' + maintype, subtype = ctype.split('/', 1) + if maintype == 'text': + fp = open(path) + # Note: we should handle calculating the charset + msg = MIMEText(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'image': + fp = open(path, 'rb') + msg = MIMEImage(fp.read(), _subtype=subtype) + fp.close() + elif maintype == 'audio': + fp = open(path, 'rb') + msg = MIMEAudio(fp.read(), _subtype=subtype) + fp.close() + else: + fp = open(path, 'rb') + msg = MIMEBase(maintype, subtype) + msg.set_payload(fp.read()) + fp.close() + # Encode the payload using Base64 + encoders.encode_base64(msg) + # Set the filename parameter + msg.add_header('Content-Disposition', 'attachment', filename=filename) + outer.attach(msg) + # Now send or store the message + composed = outer.as_string() + if opts.output: + fp = open(opts.output, 'w') + fp.write(composed) + fp.close() + else: + s = smtplib.SMTP() + s.connect() + s.sendmail(opts.sender, opts.recipients, composed) + s.close() + + +if __name__ == '__main__': + main() diff --git a/Doc/includes/email-mime.py b/Doc/includes/email-mime.py new file mode 100644 index 0000000..5097253 --- /dev/null +++ b/Doc/includes/email-mime.py @@ -0,0 +1,32 @@ +# Import smtplib for the actual sending function +import smtplib + +# Here are the email package modules we'll need +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart + +COMMASPACE = ', ' + +# Create the container (outer) email message. +msg = MIMEMultipart() +msg['Subject'] = 'Our family reunion' +# me == the sender's email address +# family = the list of all recipients' email addresses +msg['From'] = me +msg['To'] = COMMASPACE.join(family) +msg.preamble = 'Our family reunion' + +# Assume we know that the image files are all in PNG format +for file in pngfiles: + # Open the files in binary mode. Let the MIMEImage class automatically + # guess the specific image type. + fp = open(file, 'rb') + img = MIMEImage(fp.read()) + fp.close() + msg.attach(img) + +# Send the email via our own SMTP server. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, family, msg.as_string()) +s.close() diff --git a/Doc/includes/email-simple.py b/Doc/includes/email-simple.py new file mode 100644 index 0000000..44152a4 --- /dev/null +++ b/Doc/includes/email-simple.py @@ -0,0 +1,25 @@ +# Import smtplib for the actual sending function +import smtplib + +# Import the email modules we'll need +from email.mime.text import MIMEText + +# Open a plain text file for reading. For this example, assume that +# the text file contains only ASCII characters. +fp = open(textfile, 'rb') +# Create a text/plain message +msg = MIMEText(fp.read()) +fp.close() + +# me == the sender's email address +# you == the recipient's email address +msg['Subject'] = 'The contents of %s' % textfile +msg['From'] = me +msg['To'] = you + +# Send the message via our own SMTP server, but don't include the +# envelope header. +s = smtplib.SMTP() +s.connect() +s.sendmail(me, [you], msg.as_string()) +s.close() diff --git a/Doc/includes/email-unpack.py b/Doc/includes/email-unpack.py new file mode 100644 index 0000000..e596b98 --- /dev/null +++ b/Doc/includes/email-unpack.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +"""Unpack a MIME message into a directory of files.""" + +import os +import sys +import email +import errno +import mimetypes + +from optparse import OptionParser + + +def main(): + parser = OptionParser(usage="""\ +Unpack a MIME message into a directory of files. + +Usage: %prog [options] msgfile +""") + parser.add_option('-d', '--directory', + type='string', action='store', + help="""Unpack the MIME message into the named + directory, which will be created if it doesn't already + exist.""") + opts, args = parser.parse_args() + if not opts.directory: + parser.print_help() + sys.exit(1) + + try: + msgfile = args[0] + except IndexError: + parser.print_help() + sys.exit(1) + + try: + os.mkdir(opts.directory) + except OSError as e: + # Ignore directory exists error + if e.errno != errno.EEXIST: + raise + + fp = open(msgfile) + msg = email.message_from_file(fp) + fp.close() + + counter = 1 + for part in msg.walk(): + # multipart/* are just containers + if part.get_content_maintype() == 'multipart': + continue + # Applications should really sanitize the given filename so that an + # email message can't be used to overwrite important files + filename = part.get_filename() + if not filename: + ext = mimetypes.guess_extension(part.get_type()) + if not ext: + # Use a generic bag-of-bits extension + ext = '.bin' + filename = 'part-%03d%s' % (counter, ext) + counter += 1 + fp = open(os.path.join(opts.directory, filename), 'wb') + fp.write(part.get_payload(decode=True)) + fp.close() + + +if __name__ == '__main__': + main() diff --git a/Doc/includes/minidom-example.py b/Doc/includes/minidom-example.py new file mode 100644 index 0000000..c30c4e0 --- /dev/null +++ b/Doc/includes/minidom-example.py @@ -0,0 +1,64 @@ +import xml.dom.minidom + +document = """\ + +Demo slideshow +Slide title +This is a demo +Of a program for processing slides + + +Another demo slide +It is important +To have more than +one slide + + +""" + +dom = xml.dom.minidom.parseString(document) + +def getText(nodelist): + rc = "" + for node in nodelist: + if node.nodeType == node.TEXT_NODE: + rc = rc + node.data + return rc + +def handleSlideshow(slideshow): + print "" + handleSlideshowTitle(slideshow.getElementsByTagName("title")[0]) + slides = slideshow.getElementsByTagName("slide") + handleToc(slides) + handleSlides(slides) + print "" + +def handleSlides(slides): + for slide in slides: + handleSlide(slide) + +def handleSlide(slide): + handleSlideTitle(slide.getElementsByTagName("title")[0]) + handlePoints(slide.getElementsByTagName("point")) + +def handleSlideshowTitle(title): + print "%s" % getText(title.childNodes) + +def handleSlideTitle(title): + print "

%s

" % getText(title.childNodes) + +def handlePoints(points): + print "
    " + for point in points: + handlePoint(point) + print "
" + +def handlePoint(point): + print "
  • %s
  • " % getText(point.childNodes) + +def handleToc(slides): + for slide in slides: + title = slide.getElementsByTagName("title")[0] + print "

    %s

    " % getText(title.childNodes) + +handleSlideshow(dom) diff --git a/Doc/includes/noddy.c b/Doc/includes/noddy.c new file mode 100644 index 0000000..ec2d669 --- /dev/null +++ b/Doc/includes/noddy.c @@ -0,0 +1,54 @@ +#include + +typedef struct { + PyObject_HEAD + /* Type-specific fields go here. */ +} noddy_NoddyObject; + +static PyTypeObject noddy_NoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "noddy.Noddy", /*tp_name*/ + sizeof(noddy_NoddyObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + "Noddy objects", /* tp_doc */ +}; + +static PyMethodDef noddy_methods[] = { + {NULL} /* Sentinel */ +}; + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +initnoddy(void) +{ + PyObject* m; + + noddy_NoddyType.tp_new = PyType_GenericNew; + if (PyType_Ready(&noddy_NoddyType) < 0) + return; + + m = Py_InitModule3("noddy", noddy_methods, + "Example module that creates an extension type."); + + Py_INCREF(&noddy_NoddyType); + PyModule_AddObject(m, "Noddy", (PyObject *)&noddy_NoddyType); +} diff --git a/Doc/includes/noddy2.c b/Doc/includes/noddy2.c new file mode 100644 index 0000000..2caf985 --- /dev/null +++ b/Doc/includes/noddy2.c @@ -0,0 +1,190 @@ +#include +#include "structmember.h" + +typedef struct { + PyObject_HEAD + PyObject *first; /* first name */ + PyObject *last; /* last name */ + int number; +} Noddy; + +static void +Noddy_dealloc(Noddy* self) +{ + Py_XDECREF(self->first); + Py_XDECREF(self->last); + self->ob_type->tp_free((PyObject*)self); +} + +static PyObject * +Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + Noddy *self; + + self = (Noddy *)type->tp_alloc(type, 0); + if (self != NULL) { + self->first = PyString_FromString(""); + if (self->first == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->last = PyString_FromString(""); + if (self->last == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->number = 0; + } + + return (PyObject *)self; +} + +static int +Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) +{ + PyObject *first=NULL, *last=NULL, *tmp; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &first, &last, + &self->number)) + return -1; + + if (first) { + tmp = self->first; + Py_INCREF(first); + self->first = first; + Py_XDECREF(tmp); + } + + if (last) { + tmp = self->last; + Py_INCREF(last); + self->last = last; + Py_XDECREF(tmp); + } + + return 0; +} + + +static PyMemberDef Noddy_members[] = { + {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, + "last name"}, + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ +}; + +static PyObject * +Noddy_name(Noddy* self) +{ + static PyObject *format = NULL; + PyObject *args, *result; + + if (format == NULL) { + format = PyString_FromString("%s %s"); + if (format == NULL) + return NULL; + } + + if (self->first == NULL) { + PyErr_SetString(PyExc_AttributeError, "first"); + return NULL; + } + + if (self->last == NULL) { + PyErr_SetString(PyExc_AttributeError, "last"); + return NULL; + } + + args = Py_BuildValue("OO", self->first, self->last); + if (args == NULL) + return NULL; + + result = PyString_Format(format, args); + Py_DECREF(args); + + return result; +} + +static PyMethodDef Noddy_methods[] = { + {"name", (PyCFunction)Noddy_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ +}; + +static PyTypeObject NoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "noddy.Noddy", /*tp_name*/ + sizeof(Noddy), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Noddy_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "Noddy objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + Noddy_methods, /* tp_methods */ + Noddy_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Noddy_init, /* tp_init */ + 0, /* tp_alloc */ + Noddy_new, /* tp_new */ +}; + +static PyMethodDef module_methods[] = { + {NULL} /* Sentinel */ +}; + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +initnoddy2(void) +{ + PyObject* m; + + if (PyType_Ready(&NoddyType) < 0) + return; + + m = Py_InitModule3("noddy2", module_methods, + "Example module that creates an extension type."); + + if (m == NULL) + return; + + Py_INCREF(&NoddyType); + PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType); +} diff --git a/Doc/includes/noddy3.c b/Doc/includes/noddy3.c new file mode 100644 index 0000000..60260ad --- /dev/null +++ b/Doc/includes/noddy3.c @@ -0,0 +1,243 @@ +#include +#include "structmember.h" + +typedef struct { + PyObject_HEAD + PyObject *first; + PyObject *last; + int number; +} Noddy; + +static void +Noddy_dealloc(Noddy* self) +{ + Py_XDECREF(self->first); + Py_XDECREF(self->last); + self->ob_type->tp_free((PyObject*)self); +} + +static PyObject * +Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + Noddy *self; + + self = (Noddy *)type->tp_alloc(type, 0); + if (self != NULL) { + self->first = PyString_FromString(""); + if (self->first == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->last = PyString_FromString(""); + if (self->last == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->number = 0; + } + + return (PyObject *)self; +} + +static int +Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) +{ + PyObject *first=NULL, *last=NULL, *tmp; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|SSi", kwlist, + &first, &last, + &self->number)) + return -1; + + if (first) { + tmp = self->first; + Py_INCREF(first); + self->first = first; + Py_DECREF(tmp); + } + + if (last) { + tmp = self->last; + Py_INCREF(last); + self->last = last; + Py_DECREF(tmp); + } + + return 0; +} + +static PyMemberDef Noddy_members[] = { + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ +}; + +static PyObject * +Noddy_getfirst(Noddy *self, void *closure) +{ + Py_INCREF(self->first); + return self->first; +} + +static int +Noddy_setfirst(Noddy *self, PyObject *value, void *closure) +{ + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete the first attribute"); + return -1; + } + + if (! PyString_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "The first attribute value must be a string"); + return -1; + } + + Py_DECREF(self->first); + Py_INCREF(value); + self->first = value; + + return 0; +} + +static PyObject * +Noddy_getlast(Noddy *self, void *closure) +{ + Py_INCREF(self->last); + return self->last; +} + +static int +Noddy_setlast(Noddy *self, PyObject *value, void *closure) +{ + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete the last attribute"); + return -1; + } + + if (! PyString_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "The last attribute value must be a string"); + return -1; + } + + Py_DECREF(self->last); + Py_INCREF(value); + self->last = value; + + return 0; +} + +static PyGetSetDef Noddy_getseters[] = { + {"first", + (getter)Noddy_getfirst, (setter)Noddy_setfirst, + "first name", + NULL}, + {"last", + (getter)Noddy_getlast, (setter)Noddy_setlast, + "last name", + NULL}, + {NULL} /* Sentinel */ +}; + +static PyObject * +Noddy_name(Noddy* self) +{ + static PyObject *format = NULL; + PyObject *args, *result; + + if (format == NULL) { + format = PyString_FromString("%s %s"); + if (format == NULL) + return NULL; + } + + args = Py_BuildValue("OO", self->first, self->last); + if (args == NULL) + return NULL; + + result = PyString_Format(format, args); + Py_DECREF(args); + + return result; +} + +static PyMethodDef Noddy_methods[] = { + {"name", (PyCFunction)Noddy_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ +}; + +static PyTypeObject NoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "noddy.Noddy", /*tp_name*/ + sizeof(Noddy), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Noddy_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "Noddy objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + Noddy_methods, /* tp_methods */ + Noddy_members, /* tp_members */ + Noddy_getseters, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Noddy_init, /* tp_init */ + 0, /* tp_alloc */ + Noddy_new, /* tp_new */ +}; + +static PyMethodDef module_methods[] = { + {NULL} /* Sentinel */ +}; + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +initnoddy3(void) +{ + PyObject* m; + + if (PyType_Ready(&NoddyType) < 0) + return; + + m = Py_InitModule3("noddy3", module_methods, + "Example module that creates an extension type."); + + if (m == NULL) + return; + + Py_INCREF(&NoddyType); + PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType); +} diff --git a/Doc/includes/noddy4.c b/Doc/includes/noddy4.c new file mode 100644 index 0000000..878e086 --- /dev/null +++ b/Doc/includes/noddy4.c @@ -0,0 +1,224 @@ +#include +#include "structmember.h" + +typedef struct { + PyObject_HEAD + PyObject *first; + PyObject *last; + int number; +} Noddy; + +static int +Noddy_traverse(Noddy *self, visitproc visit, void *arg) +{ + int vret; + + if (self->first) { + vret = visit(self->first, arg); + if (vret != 0) + return vret; + } + if (self->last) { + vret = visit(self->last, arg); + if (vret != 0) + return vret; + } + + return 0; +} + +static int +Noddy_clear(Noddy *self) +{ + PyObject *tmp; + + tmp = self->first; + self->first = NULL; + Py_XDECREF(tmp); + + tmp = self->last; + self->last = NULL; + Py_XDECREF(tmp); + + return 0; +} + +static void +Noddy_dealloc(Noddy* self) +{ + Noddy_clear(self); + self->ob_type->tp_free((PyObject*)self); +} + +static PyObject * +Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + Noddy *self; + + self = (Noddy *)type->tp_alloc(type, 0); + if (self != NULL) { + self->first = PyString_FromString(""); + if (self->first == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->last = PyString_FromString(""); + if (self->last == NULL) + { + Py_DECREF(self); + return NULL; + } + + self->number = 0; + } + + return (PyObject *)self; +} + +static int +Noddy_init(Noddy *self, PyObject *args, PyObject *kwds) +{ + PyObject *first=NULL, *last=NULL, *tmp; + + static char *kwlist[] = {"first", "last", "number", NULL}; + + if (! PyArg_ParseTupleAndKeywords(args, kwds, "|OOi", kwlist, + &first, &last, + &self->number)) + return -1; + + if (first) { + tmp = self->first; + Py_INCREF(first); + self->first = first; + Py_XDECREF(tmp); + } + + if (last) { + tmp = self->last; + Py_INCREF(last); + self->last = last; + Py_XDECREF(tmp); + } + + return 0; +} + + +static PyMemberDef Noddy_members[] = { + {"first", T_OBJECT_EX, offsetof(Noddy, first), 0, + "first name"}, + {"last", T_OBJECT_EX, offsetof(Noddy, last), 0, + "last name"}, + {"number", T_INT, offsetof(Noddy, number), 0, + "noddy number"}, + {NULL} /* Sentinel */ +}; + +static PyObject * +Noddy_name(Noddy* self) +{ + static PyObject *format = NULL; + PyObject *args, *result; + + if (format == NULL) { + format = PyString_FromString("%s %s"); + if (format == NULL) + return NULL; + } + + if (self->first == NULL) { + PyErr_SetString(PyExc_AttributeError, "first"); + return NULL; + } + + if (self->last == NULL) { + PyErr_SetString(PyExc_AttributeError, "last"); + return NULL; + } + + args = Py_BuildValue("OO", self->first, self->last); + if (args == NULL) + return NULL; + + result = PyString_Format(format, args); + Py_DECREF(args); + + return result; +} + +static PyMethodDef Noddy_methods[] = { + {"name", (PyCFunction)Noddy_name, METH_NOARGS, + "Return the name, combining the first and last name" + }, + {NULL} /* Sentinel */ +}; + +static PyTypeObject NoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "noddy.Noddy", /*tp_name*/ + sizeof(Noddy), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)Noddy_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "Noddy objects", /* tp_doc */ + (traverseproc)Noddy_traverse, /* tp_traverse */ + (inquiry)Noddy_clear, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + Noddy_methods, /* tp_methods */ + Noddy_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Noddy_init, /* tp_init */ + 0, /* tp_alloc */ + Noddy_new, /* tp_new */ +}; + +static PyMethodDef module_methods[] = { + {NULL} /* Sentinel */ +}; + +#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ +#define PyMODINIT_FUNC void +#endif +PyMODINIT_FUNC +initnoddy4(void) +{ + PyObject* m; + + if (PyType_Ready(&NoddyType) < 0) + return; + + m = Py_InitModule3("noddy4", module_methods, + "Example module that creates an extension type."); + + if (m == NULL) + return; + + Py_INCREF(&NoddyType); + PyModule_AddObject(m, "Noddy", (PyObject *)&NoddyType); +} diff --git a/Doc/includes/run-func.c b/Doc/includes/run-func.c new file mode 100644 index 0000000..5a7df0d --- /dev/null +++ b/Doc/includes/run-func.c @@ -0,0 +1,68 @@ +#include + +int +main(int argc, char *argv[]) +{ + PyObject *pName, *pModule, *pDict, *pFunc; + PyObject *pArgs, *pValue; + int i; + + if (argc < 3) { + fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); + return 1; + } + + Py_Initialize(); + pName = PyString_FromString(argv[1]); + /* Error checking of pName left out */ + + pModule = PyImport_Import(pName); + Py_DECREF(pName); + + if (pModule != NULL) { + pFunc = PyObject_GetAttrString(pModule, argv[2]); + /* pFunc is a new reference */ + + if (pFunc && PyCallable_Check(pFunc)) { + pArgs = PyTuple_New(argc - 3); + for (i = 0; i < argc - 3; ++i) { + pValue = PyInt_FromLong(atoi(argv[i + 3])); + if (!pValue) { + Py_DECREF(pArgs); + Py_DECREF(pModule); + fprintf(stderr, "Cannot convert argument\n"); + return 1; + } + /* pValue reference stolen here: */ + PyTuple_SetItem(pArgs, i, pValue); + } + pValue = PyObject_CallObject(pFunc, pArgs); + Py_DECREF(pArgs); + if (pValue != NULL) { + printf("Result of call: %ld\n", PyInt_AsLong(pValue)); + Py_DECREF(pValue); + } + else { + Py_DECREF(pFunc); + Py_DECREF(pModule); + PyErr_Print(); + fprintf(stderr,"Call failed\n"); + return 1; + } + } + else { + if (PyErr_Occurred()) + PyErr_Print(); + fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); + } + Py_XDECREF(pFunc); + Py_DECREF(pModule); + } + else { + PyErr_Print(); + fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); + return 1; + } + Py_Finalize(); + return 0; +} diff --git a/Doc/includes/setup.py b/Doc/includes/setup.py new file mode 100644 index 0000000..b853d23 --- /dev/null +++ b/Doc/includes/setup.py @@ -0,0 +1,8 @@ +from distutils.core import setup, Extension +setup(name="noddy", version="1.0", + ext_modules=[ + Extension("noddy", ["noddy.c"]), + Extension("noddy2", ["noddy2.c"]), + Extension("noddy3", ["noddy3.c"]), + Extension("noddy4", ["noddy4.c"]), + ]) diff --git a/Doc/includes/shoddy.c b/Doc/includes/shoddy.c new file mode 100644 index 0000000..07a4177 --- /dev/null +++ b/Doc/includes/shoddy.c @@ -0,0 +1,91 @@ +#include + +typedef struct { + PyListObject list; + int state; +} Shoddy; + + +static PyObject * +Shoddy_increment(Shoddy *self, PyObject *unused) +{ + self->state++; + return PyInt_FromLong(self->state); +} + + +static PyMethodDef Shoddy_methods[] = { + {"increment", (PyCFunction)Shoddy_increment, METH_NOARGS, + PyDoc_STR("increment state counter")}, + {NULL, NULL}, +}; + +static int +Shoddy_init(Shoddy *self, PyObject *args, PyObject *kwds) +{ + if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0) + return -1; + self->state = 0; + return 0; +} + + +static PyTypeObject ShoddyType = { + PyObject_HEAD_INIT(NULL) + 0, /* ob_size */ + "shoddy.Shoddy", /* tp_name */ + sizeof(Shoddy), /* tp_basicsize */ + 0, /* tp_itemsize */ + 0, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + Shoddy_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)Shoddy_init, /* tp_init */ + 0, /* tp_alloc */ + 0, /* tp_new */ +}; + +PyMODINIT_FUNC +initshoddy(void) +{ + PyObject *m; + + ShoddyType.tp_base = &PyList_Type; + if (PyType_Ready(&ShoddyType) < 0) + return; + + m = Py_InitModule3("shoddy", NULL, "Shoddy module"); + if (m == NULL) + return; + + Py_INCREF(&ShoddyType); + PyModule_AddObject(m, "Shoddy", (PyObject *) &ShoddyType); +} diff --git a/Doc/includes/sqlite3/adapter_datetime.py b/Doc/includes/sqlite3/adapter_datetime.py new file mode 100644 index 0000000..5869e22 --- /dev/null +++ b/Doc/includes/sqlite3/adapter_datetime.py @@ -0,0 +1,14 @@ +import sqlite3 +import datetime, time + +def adapt_datetime(ts): + return time.mktime(ts.timetuple()) + +sqlite3.register_adapter(datetime.datetime, adapt_datetime) + +con = sqlite3.connect(":memory:") +cur = con.cursor() + +now = datetime.datetime.now() +cur.execute("select ?", (now,)) +print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/adapter_point_1.py b/Doc/includes/sqlite3/adapter_point_1.py new file mode 100644 index 0000000..1343acd --- /dev/null +++ b/Doc/includes/sqlite3/adapter_point_1.py @@ -0,0 +1,16 @@ +import sqlite3 + +class Point(object): + def __init__(self, x, y): + self.x, self.y = x, y + + def __conform__(self, protocol): + if protocol is sqlite3.PrepareProtocol: + return "%f;%f" % (self.x, self.y) + +con = sqlite3.connect(":memory:") +cur = con.cursor() + +p = Point(4.0, -3.2) +cur.execute("select ?", (p,)) +print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/adapter_point_2.py b/Doc/includes/sqlite3/adapter_point_2.py new file mode 100644 index 0000000..1e1719a --- /dev/null +++ b/Doc/includes/sqlite3/adapter_point_2.py @@ -0,0 +1,17 @@ +import sqlite3 + +class Point(object): + def __init__(self, x, y): + self.x, self.y = x, y + +def adapt_point(point): + return "%f;%f" % (point.x, point.y) + +sqlite3.register_adapter(Point, adapt_point) + +con = sqlite3.connect(":memory:") +cur = con.cursor() + +p = Point(4.0, -3.2) +cur.execute("select ?", (p,)) +print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/collation_reverse.py b/Doc/includes/sqlite3/collation_reverse.py new file mode 100644 index 0000000..bfd7f5b --- /dev/null +++ b/Doc/includes/sqlite3/collation_reverse.py @@ -0,0 +1,15 @@ +import sqlite3 + +def collate_reverse(string1, string2): + return -cmp(string1, string2) + +con = sqlite3.connect(":memory:") +con.create_collation("reverse", collate_reverse) + +cur = con.cursor() +cur.execute("create table test(x)") +cur.executemany("insert into test(x) values (?)", [("a",), ("b",)]) +cur.execute("select x from test order by x collate reverse") +for row in cur: + print(row) +con.close() diff --git a/Doc/includes/sqlite3/complete_statement.py b/Doc/includes/sqlite3/complete_statement.py new file mode 100644 index 0000000..cd38d73 --- /dev/null +++ b/Doc/includes/sqlite3/complete_statement.py @@ -0,0 +1,30 @@ +# A minimal SQLite shell for experiments + +import sqlite3 + +con = sqlite3.connect(":memory:") +con.isolation_level = None +cur = con.cursor() + +buffer = "" + +print("Enter your SQL commands to execute in sqlite3.") +print("Enter a blank line to exit.") + +while True: + line = input() + if line == "": + break + buffer += line + if sqlite3.complete_statement(buffer): + try: + buffer = buffer.strip() + cur.execute(buffer) + + if buffer.lstrip().upper().startswith("SELECT"): + print(cur.fetchall()) + except sqlite3.Error as e: + print("An error occurred:", e.args[0]) + buffer = "" + +con.close() diff --git a/Doc/includes/sqlite3/connect_db_1.py b/Doc/includes/sqlite3/connect_db_1.py new file mode 100644 index 0000000..1b97523 --- /dev/null +++ b/Doc/includes/sqlite3/connect_db_1.py @@ -0,0 +1,3 @@ +import sqlite3 + +con = sqlite3.connect("mydb") diff --git a/Doc/includes/sqlite3/connect_db_2.py b/Doc/includes/sqlite3/connect_db_2.py new file mode 100644 index 0000000..f9728b36 --- /dev/null +++ b/Doc/includes/sqlite3/connect_db_2.py @@ -0,0 +1,3 @@ +import sqlite3 + +con = sqlite3.connect(":memory:") diff --git a/Doc/includes/sqlite3/converter_point.py b/Doc/includes/sqlite3/converter_point.py new file mode 100644 index 0000000..d0707ab --- /dev/null +++ b/Doc/includes/sqlite3/converter_point.py @@ -0,0 +1,47 @@ +import sqlite3 + +class Point(object): + def __init__(self, x, y): + self.x, self.y = x, y + + def __repr__(self): + return "(%f;%f)" % (self.x, self.y) + +def adapt_point(point): + return "%f;%f" % (point.x, point.y) + +def convert_point(s): + x, y = list(map(float, s.split(";"))) + return Point(x, y) + +# Register the adapter +sqlite3.register_adapter(Point, adapt_point) + +# Register the converter +sqlite3.register_converter("point", convert_point) + +p = Point(4.0, -3.2) + +######################### +# 1) Using declared types +con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES) +cur = con.cursor() +cur.execute("create table test(p point)") + +cur.execute("insert into test(p) values (?)", (p,)) +cur.execute("select p from test") +print("with declared types:", cur.fetchone()[0]) +cur.close() +con.close() + +####################### +# 1) Using column names +con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES) +cur = con.cursor() +cur.execute("create table test(p)") + +cur.execute("insert into test(p) values (?)", (p,)) +cur.execute('select p as "p [point]" from test') +print("with column names:", cur.fetchone()[0]) +cur.close() +con.close() diff --git a/Doc/includes/sqlite3/countcursors.py b/Doc/includes/sqlite3/countcursors.py new file mode 100644 index 0000000..ef3e70a --- /dev/null +++ b/Doc/includes/sqlite3/countcursors.py @@ -0,0 +1,15 @@ +import sqlite3 + +class CountCursorsConnection(sqlite3.Connection): + def __init__(self, *args, **kwargs): + sqlite3.Connection.__init__(self, *args, **kwargs) + self.numcursors = 0 + + def cursor(self, *args, **kwargs): + self.numcursors += 1 + return sqlite3.Connection.cursor(self, *args, **kwargs) + +con = sqlite3.connect(":memory:", factory=CountCursorsConnection) +cur1 = con.cursor() +cur2 = con.cursor() +print(con.numcursors) diff --git a/Doc/includes/sqlite3/createdb.py b/Doc/includes/sqlite3/createdb.py new file mode 100644 index 0000000..ee2950b --- /dev/null +++ b/Doc/includes/sqlite3/createdb.py @@ -0,0 +1,28 @@ +# Not referenced from the documentation, but builds the database file the other +# code snippets expect. + +import sqlite3 +import os + +DB_FILE = "mydb" + +if os.path.exists(DB_FILE): + os.remove(DB_FILE) + +con = sqlite3.connect(DB_FILE) +cur = con.cursor() +cur.execute(""" + create table people + ( + name_last varchar(20), + age integer + ) + """) + +cur.execute("insert into people (name_last, age) values ('Yeltsin', 72)") +cur.execute("insert into people (name_last, age) values ('Putin', 51)") + +con.commit() + +cur.close() +con.close() diff --git a/Doc/includes/sqlite3/execsql_fetchonerow.py b/Doc/includes/sqlite3/execsql_fetchonerow.py new file mode 100644 index 0000000..078873b --- /dev/null +++ b/Doc/includes/sqlite3/execsql_fetchonerow.py @@ -0,0 +1,17 @@ +import sqlite3 + +con = sqlite3.connect("mydb") + +cur = con.cursor() +SELECT = "select name_last, age from people order by age, name_last" + +# 1. Iterate over the rows available from the cursor, unpacking the +# resulting sequences to yield their elements (name_last, age): +cur.execute(SELECT) +for (name_last, age) in cur: + print('%s is %d years old.' % (name_last, age)) + +# 2. Equivalently: +cur.execute(SELECT) +for row in cur: + print('%s is %d years old.' % (row[0], row[1])) diff --git a/Doc/includes/sqlite3/execsql_printall_1.py b/Doc/includes/sqlite3/execsql_printall_1.py new file mode 100644 index 0000000..a4ce5c5 --- /dev/null +++ b/Doc/includes/sqlite3/execsql_printall_1.py @@ -0,0 +1,13 @@ +import sqlite3 + +# Create a connection to the database file "mydb": +con = sqlite3.connect("mydb") + +# Get a Cursor object that operates in the context of Connection con: +cur = con.cursor() + +# Execute the SELECT statement: +cur.execute("select * from people order by age") + +# Retrieve all rows as a sequence and print that sequence: +print(cur.fetchall()) diff --git a/Doc/includes/sqlite3/execute_1.py b/Doc/includes/sqlite3/execute_1.py new file mode 100644 index 0000000..3d08840 --- /dev/null +++ b/Doc/includes/sqlite3/execute_1.py @@ -0,0 +1,11 @@ +import sqlite3 + +con = sqlite3.connect("mydb") + +cur = con.cursor() + +who = "Yeltsin" +age = 72 + +cur.execute("select name_last, age from people where name_last=? and age=?", (who, age)) +print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/execute_2.py b/Doc/includes/sqlite3/execute_2.py new file mode 100644 index 0000000..84734f9 --- /dev/null +++ b/Doc/includes/sqlite3/execute_2.py @@ -0,0 +1,12 @@ +import sqlite3 + +con = sqlite3.connect("mydb") + +cur = con.cursor() + +who = "Yeltsin" +age = 72 + +cur.execute("select name_last, age from people where name_last=:who and age=:age", + {"who": who, "age": age}) +print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/execute_3.py b/Doc/includes/sqlite3/execute_3.py new file mode 100644 index 0000000..0353683 --- /dev/null +++ b/Doc/includes/sqlite3/execute_3.py @@ -0,0 +1,12 @@ +import sqlite3 + +con = sqlite3.connect("mydb") + +cur = con.cursor() + +who = "Yeltsin" +age = 72 + +cur.execute("select name_last, age from people where name_last=:who and age=:age", + locals()) +print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/executemany_1.py b/Doc/includes/sqlite3/executemany_1.py new file mode 100644 index 0000000..efae106 --- /dev/null +++ b/Doc/includes/sqlite3/executemany_1.py @@ -0,0 +1,24 @@ +import sqlite3 + +class IterChars: + def __init__(self): + self.count = ord('a') + + def __iter__(self): + return self + + def __next__(self): + if self.count > ord('z'): + raise StopIteration + self.count += 1 + return (chr(self.count - 1),) # this is a 1-tuple + +con = sqlite3.connect(":memory:") +cur = con.cursor() +cur.execute("create table characters(c)") + +theIter = IterChars() +cur.executemany("insert into characters(c) values (?)", theIter) + +cur.execute("select c from characters") +print(cur.fetchall()) diff --git a/Doc/includes/sqlite3/executemany_2.py b/Doc/includes/sqlite3/executemany_2.py new file mode 100644 index 0000000..518cd94 --- /dev/null +++ b/Doc/includes/sqlite3/executemany_2.py @@ -0,0 +1,15 @@ +import sqlite3 + +def char_generator(): + import string + for c in string.letters[:26]: + yield (c,) + +con = sqlite3.connect(":memory:") +cur = con.cursor() +cur.execute("create table characters(c)") + +cur.executemany("insert into characters(c) values (?)", char_generator()) + +cur.execute("select c from characters") +print(cur.fetchall()) diff --git a/Doc/includes/sqlite3/executescript.py b/Doc/includes/sqlite3/executescript.py new file mode 100644 index 0000000..7e53581 --- /dev/null +++ b/Doc/includes/sqlite3/executescript.py @@ -0,0 +1,24 @@ +import sqlite3 + +con = sqlite3.connect(":memory:") +cur = con.cursor() +cur.executescript(""" + create table person( + firstname, + lastname, + age + ); + + create table book( + title, + author, + published + ); + + insert into book(title, author, published) + values ( + 'Dirk Gently''s Holistic Detective Agency', + 'Douglas Adams', + 1987 + ); + """) diff --git a/Doc/includes/sqlite3/insert_more_people.py b/Doc/includes/sqlite3/insert_more_people.py new file mode 100644 index 0000000..edbc79e --- /dev/null +++ b/Doc/includes/sqlite3/insert_more_people.py @@ -0,0 +1,16 @@ +import sqlite3 + +con = sqlite3.connect("mydb") + +cur = con.cursor() + +newPeople = ( + ('Lebed' , 53), + ('Zhirinovsky' , 57), + ) + +for person in newPeople: + cur.execute("insert into people (name_last, age) values (?, ?)", person) + +# The changes will not be saved unless the transaction is committed explicitly: +con.commit() diff --git a/Doc/includes/sqlite3/md5func.py b/Doc/includes/sqlite3/md5func.py new file mode 100644 index 0000000..b7bc05b --- /dev/null +++ b/Doc/includes/sqlite3/md5func.py @@ -0,0 +1,11 @@ +import sqlite3 +import hashlib + +def md5sum(t): + return hashlib.md5(t).hexdigest() + +con = sqlite3.connect(":memory:") +con.create_function("md5", 1, md5sum) +cur = con.cursor() +cur.execute("select md5(?)", ("foo",)) +print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/mysumaggr.py b/Doc/includes/sqlite3/mysumaggr.py new file mode 100644 index 0000000..d2dfd2c --- /dev/null +++ b/Doc/includes/sqlite3/mysumaggr.py @@ -0,0 +1,20 @@ +import sqlite3 + +class MySum: + def __init__(self): + self.count = 0 + + def step(self, value): + self.count += value + + def finalize(self): + return self.count + +con = sqlite3.connect(":memory:") +con.create_aggregate("mysum", 1, MySum) +cur = con.cursor() +cur.execute("create table test(i)") +cur.execute("insert into test(i) values (1)") +cur.execute("insert into test(i) values (2)") +cur.execute("select mysum(i) from test") +print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/parse_colnames.py b/Doc/includes/sqlite3/parse_colnames.py new file mode 100644 index 0000000..cc68c76 --- /dev/null +++ b/Doc/includes/sqlite3/parse_colnames.py @@ -0,0 +1,8 @@ +import sqlite3 +import datetime + +con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES) +cur = con.cursor() +cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),)) +dt = cur.fetchone()[0] +print(dt, type(dt)) diff --git a/Doc/includes/sqlite3/pysqlite_datetime.py b/Doc/includes/sqlite3/pysqlite_datetime.py new file mode 100644 index 0000000..68d4935 --- /dev/null +++ b/Doc/includes/sqlite3/pysqlite_datetime.py @@ -0,0 +1,20 @@ +import sqlite3 +import datetime + +con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES) +cur = con.cursor() +cur.execute("create table test(d date, ts timestamp)") + +today = datetime.date.today() +now = datetime.datetime.now() + +cur.execute("insert into test(d, ts) values (?, ?)", (today, now)) +cur.execute("select d, ts from test") +row = cur.fetchone() +print(today, "=>", row[0], type(row[0])) +print(now, "=>", row[1], type(row[1])) + +cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"') +row = cur.fetchone() +print("current_date", row[0], type(row[0])) +print("current_timestamp", row[1], type(row[1])) diff --git a/Doc/includes/sqlite3/row_factory.py b/Doc/includes/sqlite3/row_factory.py new file mode 100644 index 0000000..e436ffc --- /dev/null +++ b/Doc/includes/sqlite3/row_factory.py @@ -0,0 +1,13 @@ +import sqlite3 + +def dict_factory(cursor, row): + d = {} + for idx, col in enumerate(cursor.description): + d[col[0]] = row[idx] + return d + +con = sqlite3.connect(":memory:") +con.row_factory = dict_factory +cur = con.cursor() +cur.execute("select 1 as a") +print(cur.fetchone()["a"]) diff --git a/Doc/includes/sqlite3/rowclass.py b/Doc/includes/sqlite3/rowclass.py new file mode 100644 index 0000000..3fa0b87 --- /dev/null +++ b/Doc/includes/sqlite3/rowclass.py @@ -0,0 +1,12 @@ +import sqlite3 + +con = sqlite3.connect("mydb") +con.row_factory = sqlite3.Row + +cur = con.cursor() +cur.execute("select name_last, age from people") +for row in cur: + assert row[0] == row["name_last"] + assert row["name_last"] == row["nAmE_lAsT"] + assert row[1] == row["age"] + assert row[1] == row["AgE"] diff --git a/Doc/includes/sqlite3/shared_cache.py b/Doc/includes/sqlite3/shared_cache.py new file mode 100644 index 0000000..bf1d7b4 --- /dev/null +++ b/Doc/includes/sqlite3/shared_cache.py @@ -0,0 +1,6 @@ +import sqlite3 + +# The shared cache is only available in SQLite versions 3.3.3 or later +# See the SQLite documentaton for details. + +sqlite3.enable_shared_cache(True) diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py new file mode 100644 index 0000000..596d87c --- /dev/null +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -0,0 +1,21 @@ +import sqlite3 + +persons = [ + ("Hugo", "Boss"), + ("Calvin", "Klein") + ] + +con = sqlite3.connect(":memory:") + +# Create the table +con.execute("create table person(firstname, lastname)") + +# Fill the table +con.executemany("insert into person(firstname, lastname) values (?, ?)", persons) + +# Print the table contents +for row in con.execute("select firstname, lastname from person"): + print(row) + +# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes. +print("I just deleted", con.execute("delete from person where 1=1").rowcount, "rows") diff --git a/Doc/includes/sqlite3/simple_tableprinter.py b/Doc/includes/sqlite3/simple_tableprinter.py new file mode 100644 index 0000000..231d872 --- /dev/null +++ b/Doc/includes/sqlite3/simple_tableprinter.py @@ -0,0 +1,26 @@ +import sqlite3 + +FIELD_MAX_WIDTH = 20 +TABLE_NAME = 'people' +SELECT = 'select * from %s order by age, name_last' % TABLE_NAME + +con = sqlite3.connect("mydb") + +cur = con.cursor() +cur.execute(SELECT) + +# Print a header. +for fieldDesc in cur.description: + print(fieldDesc[0].ljust(FIELD_MAX_WIDTH), end=' ') +print() # Finish the header with a newline. +print('-' * 78) + +# For each row, print the value of each field left-justified within +# the maximum possible width of that field. +fieldIndices = range(len(cur.description)) +for row in cur: + for fieldIndex in fieldIndices: + fieldValue = str(row[fieldIndex]) + print(fieldValue.ljust(FIELD_MAX_WIDTH), end=' ') + + print() # Finish the row with a newline. diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py new file mode 100644 index 0000000..2dab8e4 --- /dev/null +++ b/Doc/includes/sqlite3/text_factory.py @@ -0,0 +1,42 @@ +import sqlite3 + +con = sqlite3.connect(":memory:") +cur = con.cursor() + +# Create the table +con.execute("create table person(lastname, firstname)") + +AUSTRIA = "\xd6sterreich" + +# by default, rows are returned as Unicode +cur.execute("select ?", (AUSTRIA,)) +row = cur.fetchone() +assert row[0] == AUSTRIA + +# but we can make pysqlite always return bytestrings ... +con.text_factory = str +cur.execute("select ?", (AUSTRIA,)) +row = cur.fetchone() +assert type(row[0]) == str +# the bytestrings will be encoded in UTF-8, unless you stored garbage in the +# database ... +assert row[0] == AUSTRIA.encode("utf-8") + +# we can also implement a custom text_factory ... +# here we implement one that will ignore Unicode characters that cannot be +# decoded from UTF-8 +con.text_factory = lambda x: str(x, "utf-8", "ignore") +cur.execute("select ?", ("this is latin1 and would normally create errors" + "\xe4\xf6\xfc".encode("latin1"),)) +row = cur.fetchone() +assert type(row[0]) == str + +# pysqlite offers a builtin optimized text_factory that will return bytestring +# objects, if the data is in ASCII only, and otherwise return unicode objects +con.text_factory = sqlite3.OptimizedUnicode +cur.execute("select ?", (AUSTRIA,)) +row = cur.fetchone() +assert type(row[0]) == str + +cur.execute("select ?", ("Germany",)) +row = cur.fetchone() +assert type(row[0]) == str diff --git a/Doc/includes/test.py b/Doc/includes/test.py new file mode 100644 index 0000000..7ebf46a --- /dev/null +++ b/Doc/includes/test.py @@ -0,0 +1,213 @@ +"""Test module for the noddy examples + +Noddy 1: + +>>> import noddy +>>> n1 = noddy.Noddy() +>>> n2 = noddy.Noddy() +>>> del n1 +>>> del n2 + + +Noddy 2 + +>>> import noddy2 +>>> n1 = noddy2.Noddy('jim', 'fulton', 42) +>>> n1.first +'jim' +>>> n1.last +'fulton' +>>> n1.number +42 +>>> n1.name() +'jim fulton' +>>> n1.first = 'will' +>>> n1.name() +'will fulton' +>>> n1.last = 'tell' +>>> n1.name() +'will tell' +>>> del n1.first +>>> n1.name() +Traceback (most recent call last): +... +AttributeError: first +>>> n1.first +Traceback (most recent call last): +... +AttributeError: first +>>> n1.first = 'drew' +>>> n1.first +'drew' +>>> del n1.number +Traceback (most recent call last): +... +TypeError: can't delete numeric/char attribute +>>> n1.number=2 +>>> n1.number +2 +>>> n1.first = 42 +>>> n1.name() +'42 tell' +>>> n2 = noddy2.Noddy() +>>> n2.name() +' ' +>>> n2.first +'' +>>> n2.last +'' +>>> del n2.first +>>> n2.first +Traceback (most recent call last): +... +AttributeError: first +>>> n2.first +Traceback (most recent call last): +... +AttributeError: first +>>> n2.name() +Traceback (most recent call last): + File "", line 1, in ? +AttributeError: first +>>> n2.number +0 +>>> n3 = noddy2.Noddy('jim', 'fulton', 'waaa') +Traceback (most recent call last): + File "", line 1, in ? +TypeError: an integer is required +>>> del n1 +>>> del n2 + + +Noddy 3 + +>>> import noddy3 +>>> n1 = noddy3.Noddy('jim', 'fulton', 42) +>>> n1 = noddy3.Noddy('jim', 'fulton', 42) +>>> n1.name() +'jim fulton' +>>> del n1.first +Traceback (most recent call last): + File "", line 1, in ? +TypeError: Cannot delete the first attribute +>>> n1.first = 42 +Traceback (most recent call last): + File "", line 1, in ? +TypeError: The first attribute value must be a string +>>> n1.first = 'will' +>>> n1.name() +'will fulton' +>>> n2 = noddy3.Noddy() +>>> n2 = noddy3.Noddy() +>>> n2 = noddy3.Noddy() +>>> n3 = noddy3.Noddy('jim', 'fulton', 'waaa') +Traceback (most recent call last): + File "", line 1, in ? +TypeError: an integer is required +>>> del n1 +>>> del n2 + +Noddy 4 + +>>> import noddy4 +>>> n1 = noddy4.Noddy('jim', 'fulton', 42) +>>> n1.first +'jim' +>>> n1.last +'fulton' +>>> n1.number +42 +>>> n1.name() +'jim fulton' +>>> n1.first = 'will' +>>> n1.name() +'will fulton' +>>> n1.last = 'tell' +>>> n1.name() +'will tell' +>>> del n1.first +>>> n1.name() +Traceback (most recent call last): +... +AttributeError: first +>>> n1.first +Traceback (most recent call last): +... +AttributeError: first +>>> n1.first = 'drew' +>>> n1.first +'drew' +>>> del n1.number +Traceback (most recent call last): +... +TypeError: can't delete numeric/char attribute +>>> n1.number=2 +>>> n1.number +2 +>>> n1.first = 42 +>>> n1.name() +'42 tell' +>>> n2 = noddy4.Noddy() +>>> n2 = noddy4.Noddy() +>>> n2 = noddy4.Noddy() +>>> n2 = noddy4.Noddy() +>>> n2.name() +' ' +>>> n2.first +'' +>>> n2.last +'' +>>> del n2.first +>>> n2.first +Traceback (most recent call last): +... +AttributeError: first +>>> n2.first +Traceback (most recent call last): +... +AttributeError: first +>>> n2.name() +Traceback (most recent call last): + File "", line 1, in ? +AttributeError: first +>>> n2.number +0 +>>> n3 = noddy4.Noddy('jim', 'fulton', 'waaa') +Traceback (most recent call last): + File "", line 1, in ? +TypeError: an integer is required + + +Test cyclic gc(?) + +>>> import gc +>>> gc.disable() + +>>> x = [] +>>> l = [x] +>>> n2.first = l +>>> n2.first +[[]] +>>> l.append(n2) +>>> del l +>>> del n1 +>>> del n2 +>>> sys.getrefcount(x) +3 +>>> ignore = gc.collect() +>>> sys.getrefcount(x) +2 + +>>> gc.enable() +""" + +import os +import sys +from distutils.util import get_platform +PLAT_SPEC = "%s-%s" % (get_platform(), sys.version[0:3]) +src = os.path.join("build", "lib.%s" % PLAT_SPEC) +sys.path.append(src) + +if __name__ == "__main__": + import doctest, __main__ + doctest.testmod(__main__) diff --git a/Doc/includes/typestruct.h b/Doc/includes/typestruct.h new file mode 100644 index 0000000..0afe375 --- /dev/null +++ b/Doc/includes/typestruct.h @@ -0,0 +1,76 @@ +typedef struct _typeobject { + PyObject_VAR_HEAD + char *tp_name; /* For printing, in format "." */ + int tp_basicsize, tp_itemsize; /* For allocation */ + + /* Methods to implement standard operations */ + + destructor tp_dealloc; + printfunc tp_print; + getattrfunc tp_getattr; + setattrfunc tp_setattr; + cmpfunc tp_compare; + reprfunc tp_repr; + + /* Method suites for standard classes */ + + PyNumberMethods *tp_as_number; + PySequenceMethods *tp_as_sequence; + PyMappingMethods *tp_as_mapping; + + /* More standard operations (here for binary compatibility) */ + + hashfunc tp_hash; + ternaryfunc tp_call; + reprfunc tp_str; + getattrofunc tp_getattro; + setattrofunc tp_setattro; + + /* Functions to access object as input/output buffer */ + PyBufferProcs *tp_as_buffer; + + /* Flags to define presence of optional/expanded features */ + long tp_flags; + + char *tp_doc; /* Documentation string */ + + /* Assigned meaning in release 2.0 */ + /* call function for all accessible objects */ + traverseproc tp_traverse; + + /* delete references to contained objects */ + inquiry tp_clear; + + /* Assigned meaning in release 2.1 */ + /* rich comparisons */ + richcmpfunc tp_richcompare; + + /* weak reference enabler */ + long tp_weaklistoffset; + + /* Added in release 2.2 */ + /* Iterators */ + getiterfunc tp_iter; + iternextfunc tp_iternext; + + /* Attribute descriptor and subclassing stuff */ + struct PyMethodDef *tp_methods; + struct PyMemberDef *tp_members; + struct PyGetSetDef *tp_getset; + struct _typeobject *tp_base; + PyObject *tp_dict; + descrgetfunc tp_descr_get; + descrsetfunc tp_descr_set; + long tp_dictoffset; + initproc tp_init; + allocfunc tp_alloc; + newfunc tp_new; + freefunc tp_free; /* Low-level free-memory routine */ + inquiry tp_is_gc; /* For PyObject_IS_GC */ + PyObject *tp_bases; + PyObject *tp_mro; /* method resolution order */ + PyObject *tp_cache; + PyObject *tp_subclasses; + PyObject *tp_weaklist; + +} PyTypeObject; diff --git a/Doc/includes/tzinfo-examples.py b/Doc/includes/tzinfo-examples.py new file mode 100644 index 0000000..5a2b8ad --- /dev/null +++ b/Doc/includes/tzinfo-examples.py @@ -0,0 +1,139 @@ +from datetime import tzinfo, timedelta, datetime + +ZERO = timedelta(0) +HOUR = timedelta(hours=1) + +# A UTC class. + +class UTC(tzinfo): + """UTC""" + + def utcoffset(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return ZERO + +utc = UTC() + +# A class building tzinfo objects for fixed-offset time zones. +# Note that FixedOffset(0, "UTC") is a different way to build a +# UTC tzinfo object. + +class FixedOffset(tzinfo): + """Fixed offset in minutes east from UTC.""" + + def __init__(self, offset, name): + self.__offset = timedelta(minutes = offset) + self.__name = name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + +# A class capturing the platform's idea of local time. + +import time as _time + +STDOFFSET = timedelta(seconds = -_time.timezone) +if _time.daylight: + DSTOFFSET = timedelta(seconds = -_time.altzone) +else: + DSTOFFSET = STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = _time.mktime(tt) + tt = _time.localtime(stamp) + return tt.tm_isdst > 0 + +Local = LocalTimezone() + + +# A complete implementation of current DST rules for major US time zones. + +def first_sunday_on_or_after(dt): + days_to_go = 6 - dt.weekday() + if days_to_go: + dt += timedelta(days_to_go) + return dt + +# In the US, DST starts at 2am (standard time) on the first Sunday in April. +DSTSTART = datetime(1, 4, 1, 2) +# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct. +# which is the first Sunday on or after Oct 25. +DSTEND = datetime(1, 10, 25, 1) + +class USTimeZone(tzinfo): + + def __init__(self, hours, reprname, stdname, dstname): + self.stdoffset = timedelta(hours=hours) + self.reprname = reprname + self.stdname = stdname + self.dstname = dstname + + def __repr__(self): + return self.reprname + + def tzname(self, dt): + if self.dst(dt): + return self.dstname + else: + return self.stdname + + def utcoffset(self, dt): + return self.stdoffset + self.dst(dt) + + def dst(self, dt): + if dt is None or dt.tzinfo is None: + # An exception may be sensible here, in one or both cases. + # It depends on how you want to treat them. The default + # fromutc() implementation (called by the default astimezone() + # implementation) passes a datetime with dt.tzinfo is self. + return ZERO + assert dt.tzinfo is self + + # Find first Sunday in April & the last in October. + start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year)) + end = first_sunday_on_or_after(DSTEND.replace(year=dt.year)) + + # Can't compare naive to aware objects, so strip the timezone from + # dt first. + if start <= dt.replace(tzinfo=None) < end: + return HOUR + else: + return ZERO + +Eastern = USTimeZone(-5, "Eastern", "EST", "EDT") +Central = USTimeZone(-6, "Central", "CST", "CDT") +Mountain = USTimeZone(-7, "Mountain", "MST", "MDT") +Pacific = USTimeZone(-8, "Pacific", "PST", "PDT") diff --git a/Doc/install/index.rst b/Doc/install/index.rst new file mode 100644 index 0000000..01f17f8 --- /dev/null +++ b/Doc/install/index.rst @@ -0,0 +1,1011 @@ +.. highlightlang:: none + +.. _install-index: + +***************************** + Installing Python Modules +***************************** + +:Author: Greg Ward +:Release: |version| +:Date: |today| + +.. % TODO: +.. % Fill in XXX comments + +.. % The audience for this document includes people who don't know anything +.. % about Python and aren't about to learn the language just in order to +.. % install and maintain it for their users, i.e. system administrators. +.. % Thus, I have to be sure to explain the basics at some point: +.. % sys.path and PYTHONPATH at least. Should probably give pointers to +.. % other docs on "import site", PYTHONSTARTUP, PYTHONHOME, etc. +.. % +.. % Finally, it might be useful to include all the material from my "Care +.. % and Feeding of a Python Installation" talk in here somewhere. Yow! + +.. topic:: Abstract + + This document describes the Python Distribution Utilities ("Distutils") from the + end-user's point-of-view, describing how to extend the capabilities of a + standard Python installation by building and installing third-party Python + modules and extensions. + + +.. _inst-intro: + +Introduction +============ + +Although Python's extensive standard library covers many programming needs, +there often comes a time when you need to add some new functionality to your +Python installation in the form of third-party modules. This might be necessary +to support your own programming, or to support an application that you want to +use and that happens to be written in Python. + +In the past, there has been little support for adding third-party modules to an +existing Python installation. With the introduction of the Python Distribution +Utilities (Distutils for short) in Python 2.0, this changed. + +This document is aimed primarily at the people who need to install third-party +Python modules: end-users and system administrators who just need to get some +Python application running, and existing Python programmers who want to add some +new goodies to their toolbox. You don't need to know Python to read this +document; there will be some brief forays into using Python's interactive mode +to explore your installation, but that's it. If you're looking for information +on how to distribute your own Python modules so that others may use them, see +the :ref:`distutils-index` manual. + + +.. _inst-trivial-install: + +Best case: trivial installation +------------------------------- + +In the best case, someone will have prepared a special version of the module +distribution you want to install that is targeted specifically at your platform +and is installed just like any other software on your platform. For example, +the module developer might make an executable installer available for Windows +users, an RPM package for users of RPM-based Linux systems (Red Hat, SuSE, +Mandrake, and many others), a Debian package for users of Debian-based Linux +systems, and so forth. + +In that case, you would download the installer appropriate to your platform and +do the obvious thing with it: run it if it's an executable installer, ``rpm +--install`` it if it's an RPM, etc. You don't need to run Python or a setup +script, you don't need to compile anything---you might not even need to read any +instructions (although it's always a good idea to do so anyways). + +Of course, things will not always be that easy. You might be interested in a +module distribution that doesn't have an easy-to-use installer for your +platform. In that case, you'll have to start with the source distribution +released by the module's author/maintainer. Installing from a source +distribution is not too hard, as long as the modules are packaged in the +standard way. The bulk of this document is about building and installing +modules from standard source distributions. + + +.. _inst-new-standard: + +The new standard: Distutils +--------------------------- + +If you download a module source distribution, you can tell pretty quickly if it +was packaged and distributed in the standard way, i.e. using the Distutils. +First, the distribution's name and version number will be featured prominently +in the name of the downloaded archive, e.g. :file:`foo-1.0.tar.gz` or +:file:`widget-0.9.7.zip`. Next, the archive will unpack into a similarly-named +directory: :file:`foo-1.0` or :file:`widget-0.9.7`. Additionally, the +distribution will contain a setup script :file:`setup.py`, and a file named +:file:`README.txt` or possibly just :file:`README`, which should explain that +building and installing the module distribution is a simple matter of running :: + + python setup.py install + +If all these things are true, then you already know how to build and install the +modules you've just downloaded: Run the command above. Unless you need to +install things in a non-standard way or customize the build process, you don't +really need this manual. Or rather, the above command is everything you need to +get out of this manual. + + +.. _inst-standard-install: + +Standard Build and Install +========================== + +As described in section :ref:`inst-new-standard`, building and installing a module +distribution using the Distutils is usually one simple command:: + + python setup.py install + +On Unix, you'd run this command from a shell prompt; on Windows, you have to +open a command prompt window ("DOS box") and do it there; on Mac OS X, you open +a :command:`Terminal` window to get a shell prompt. + + +.. _inst-platform-variations: + +Platform variations +------------------- + +You should always run the setup command from the distribution root directory, +i.e. the top-level subdirectory that the module source distribution unpacks +into. For example, if you've just downloaded a module source distribution +:file:`foo-1.0.tar.gz` onto a Unix system, the normal thing to do is:: + + gunzip -c foo-1.0.tar.gz | tar xf - # unpacks into directory foo-1.0 + cd foo-1.0 + python setup.py install + +On Windows, you'd probably download :file:`foo-1.0.zip`. If you downloaded the +archive file to :file:`C:\\Temp`, then it would unpack into +:file:`C:\\Temp\\foo-1.0`; you can use either a archive manipulator with a +graphical user interface (such as WinZip) or a command-line tool (such as +:program:`unzip` or :program:`pkunzip`) to unpack the archive. Then, open a +command prompt window ("DOS box"), and run:: + + cd c:\Temp\foo-1.0 + python setup.py install + + +.. _inst-splitting-up: + +Splitting the job up +-------------------- + +Running ``setup.py install`` builds and installs all modules in one run. If you +prefer to work incrementally---especially useful if you want to customize the +build process, or if things are going wrong---you can use the setup script to do +one thing at a time. This is particularly helpful when the build and install +will be done by different users---for example, you might want to build a module +distribution and hand it off to a system administrator for installation (or do +it yourself, with super-user privileges). + +For example, you can build everything in one step, and then install everything +in a second step, by invoking the setup script twice:: + + python setup.py build + python setup.py install + +If you do this, you will notice that running the :command:`install` command +first runs the :command:`build` command, which---in this case---quickly notices +that it has nothing to do, since everything in the :file:`build` directory is +up-to-date. + +You may not need this ability to break things down often if all you do is +install modules downloaded off the 'net, but it's very handy for more advanced +tasks. If you get into distributing your own Python modules and extensions, +you'll run lots of individual Distutils commands on their own. + + +.. _inst-how-build-works: + +How building works +------------------ + +As implied above, the :command:`build` command is responsible for putting the +files to install into a *build directory*. By default, this is :file:`build` +under the distribution root; if you're excessively concerned with speed, or want +to keep the source tree pristine, you can change the build directory with the +:option:`--build-base` option. For example:: + + python setup.py build --build-base=/tmp/pybuild/foo-1.0 + +(Or you could do this permanently with a directive in your system or personal +Distutils configuration file; see section :ref:`inst-config-files`.) Normally, this +isn't necessary. + +The default layout for the build tree is as follows:: + + --- build/ --- lib/ + or + --- build/ --- lib./ + temp./ + +where ```` expands to a brief description of the current OS/hardware +platform and Python version. The first form, with just a :file:`lib` directory, +is used for "pure module distributions"---that is, module distributions that +include only pure Python modules. If a module distribution contains any +extensions (modules written in C/C++), then the second form, with two ```` +directories, is used. In that case, the :file:`temp.{plat}` directory holds +temporary files generated by the compile/link process that don't actually get +installed. In either case, the :file:`lib` (or :file:`lib.{plat}`) directory +contains all Python modules (pure Python and extensions) that will be installed. + +In the future, more directories will be added to handle Python scripts, +documentation, binary executables, and whatever else is needed to handle the job +of installing Python modules and applications. + + +.. _inst-how-install-works: + +How installation works +---------------------- + +After the :command:`build` command runs (whether you run it explicitly, or the +:command:`install` command does it for you), the work of the :command:`install` +command is relatively simple: all it has to do is copy everything under +:file:`build/lib` (or :file:`build/lib.{plat}`) to your chosen installation +directory. + +If you don't choose an installation directory---i.e., if you just run ``setup.py +install``\ ---then the :command:`install` command installs to the standard +location for third-party Python modules. This location varies by platform and +by how you built/installed Python itself. On Unix (and Mac OS X, which is also +Unix-based), it also depends on whether the module distribution being installed +is pure Python or contains extensions ("non-pure"): + ++-----------------+-----------------------------------------------------+--------------------------------------------------+-------+ +| Platform | Standard installation location | Default value | Notes | ++=================+=====================================================+==================================================+=======+ +| Unix (pure) | :file:`{prefix}/lib/python{X.Y}/site-packages` | :file:`/usr/local/lib/python{X.Y}/site-packages` | \(1) | ++-----------------+-----------------------------------------------------+--------------------------------------------------+-------+ +| Unix (non-pure) | :file:`{exec-prefix}/lib/python{X.Y}/site-packages` | :file:`/usr/local/lib/python{X.Y}/site-packages` | \(1) | ++-----------------+-----------------------------------------------------+--------------------------------------------------+-------+ +| Windows | :file:`{prefix}` | :file:`C:\\Python` | \(2) | ++-----------------+-----------------------------------------------------+--------------------------------------------------+-------+ + +Notes: + +(1) + Most Linux distributions include Python as a standard part of the system, so + :file:`{prefix}` and :file:`{exec-prefix}` are usually both :file:`/usr` on + Linux. If you build Python yourself on Linux (or any Unix-like system), the + default :file:`{prefix}` and :file:`{exec-prefix}` are :file:`/usr/local`. + +(2) + The default installation directory on Windows was :file:`C:\\Program + Files\\Python` under Python 1.6a1, 1.5.2, and earlier. + +:file:`{prefix}` and :file:`{exec-prefix}` stand for the directories that Python +is installed to, and where it finds its libraries at run-time. They are always +the same under Windows, and very often the same under Unix and Mac OS X. You +can find out what your Python installation uses for :file:`{prefix}` and +:file:`{exec-prefix}` by running Python in interactive mode and typing a few +simple commands. Under Unix, just type ``python`` at the shell prompt. Under +Windows, choose :menuselection:`Start --> Programs --> Python X.Y --> +Python (command line)`. Once the interpreter is started, you type Python code +at the prompt. For example, on my Linux system, I type the three Python +statements shown below, and get the output as shown, to find out my +:file:`{prefix}` and :file:`{exec-prefix}`:: + + Python 2.4 (#26, Aug 7 2004, 17:19:02) + Type "help", "copyright", "credits" or "license" for more information. + >>> import sys + >>> sys.prefix + '/usr' + >>> sys.exec_prefix + '/usr' + +If you don't want to install modules to the standard location, or if you don't +have permission to write there, then you need to read about alternate +installations in section :ref:`inst-alt-install`. If you want to customize your +installation directories more heavily, see section :ref:`inst-custom-install` on +custom installations. + + +.. _inst-alt-install: + +Alternate Installation +====================== + +Often, it is necessary or desirable to install modules to a location other than +the standard location for third-party Python modules. For example, on a Unix +system you might not have permission to write to the standard third-party module +directory. Or you might wish to try out a module before making it a standard +part of your local Python installation. This is especially true when upgrading +a distribution already present: you want to make sure your existing base of +scripts still works with the new version before actually upgrading. + +The Distutils :command:`install` command is designed to make installing module +distributions to an alternate location simple and painless. The basic idea is +that you supply a base directory for the installation, and the +:command:`install` command picks a set of directories (called an *installation +scheme*) under this base directory in which to install files. The details +differ across platforms, so read whichever of the following sections applies to +you. + + +.. _inst-alt-install-prefix: + +Alternate installation: the home scheme +--------------------------------------- + +The idea behind the "home scheme" is that you build and maintain a personal +stash of Python modules. This scheme's name is derived from the idea of a +"home" directory on Unix, since it's not unusual for a Unix user to make their +home directory have a layout similar to :file:`/usr/` or :file:`/usr/local/`. +This scheme can be used by anyone, regardless of the operating system their +installing for. + +Installing a new module distribution is as simple as :: + + python setup.py install --home= + +where you can supply any directory you like for the :option:`--home` option. On +Unix, lazy typists can just type a tilde (``~``); the :command:`install` command +will expand this to your home directory:: + + python setup.py install --home=~ + +The :option:`--home` option defines the installation base directory. Files are +installed to the following directories under the installation base as follows: + ++------------------------------+---------------------------+-----------------------------+ +| Type of file | Installation Directory | Override option | ++==============================+===========================+=============================+ +| pure module distribution | :file:`{home}/lib/python` | :option:`--install-purelib` | ++------------------------------+---------------------------+-----------------------------+ +| non-pure module distribution | :file:`{home}/lib/python` | :option:`--install-platlib` | ++------------------------------+---------------------------+-----------------------------+ +| scripts | :file:`{home}/bin` | :option:`--install-scripts` | ++------------------------------+---------------------------+-----------------------------+ +| data | :file:`{home}/share` | :option:`--install-data` | ++------------------------------+---------------------------+-----------------------------+ + +.. versionchanged:: 2.4 + The :option:`--home` option used to be supported only on Unix. + + +.. _inst-alt-install-home: + +Alternate installation: Unix (the prefix scheme) +------------------------------------------------ + +The "prefix scheme" is useful when you wish to use one Python installation to +perform the build/install (i.e., to run the setup script), but install modules +into the third-party module directory of a different Python installation (or +something that looks like a different Python installation). If this sounds a +trifle unusual, it is---that's why the "home scheme" comes first. However, +there are at least two known cases where the prefix scheme will be useful. + +First, consider that many Linux distributions put Python in :file:`/usr`, rather +than the more traditional :file:`/usr/local`. This is entirely appropriate, +since in those cases Python is part of "the system" rather than a local add-on. +However, if you are installing Python modules from source, you probably want +them to go in :file:`/usr/local/lib/python2.{X}` rather than +:file:`/usr/lib/python2.{X}`. This can be done with :: + + /usr/bin/python setup.py install --prefix=/usr/local + +Another possibility is a network filesystem where the name used to write to a +remote directory is different from the name used to read it: for example, the +Python interpreter accessed as :file:`/usr/local/bin/python` might search for +modules in :file:`/usr/local/lib/python2.{X}`, but those modules would have to +be installed to, say, :file:`/mnt/{@server}/export/lib/python2.{X}`. This could +be done with :: + + /usr/local/bin/python setup.py install --prefix=/mnt/@server/export + +In either case, the :option:`--prefix` option defines the installation base, and +the :option:`--exec-prefix` option defines the platform-specific installation +base, which is used for platform-specific files. (Currently, this just means +non-pure module distributions, but could be expanded to C libraries, binary +executables, etc.) If :option:`--exec-prefix` is not supplied, it defaults to +:option:`--prefix`. Files are installed as follows: + ++------------------------------+-----------------------------------------------------+-----------------------------+ +| Type of file | Installation Directory | Override option | ++==============================+=====================================================+=============================+ +| pure module distribution | :file:`{prefix}/lib/python{X.Y}/site-packages` | :option:`--install-purelib` | ++------------------------------+-----------------------------------------------------+-----------------------------+ +| non-pure module distribution | :file:`{exec-prefix}/lib/python{X.Y}/site-packages` | :option:`--install-platlib` | ++------------------------------+-----------------------------------------------------+-----------------------------+ +| scripts | :file:`{prefix}/bin` | :option:`--install-scripts` | ++------------------------------+-----------------------------------------------------+-----------------------------+ +| data | :file:`{prefix}/share` | :option:`--install-data` | ++------------------------------+-----------------------------------------------------+-----------------------------+ + +There is no requirement that :option:`--prefix` or :option:`--exec-prefix` +actually point to an alternate Python installation; if the directories listed +above do not already exist, they are created at installation time. + +Incidentally, the real reason the prefix scheme is important is simply that a +standard Unix installation uses the prefix scheme, but with :option:`--prefix` +and :option:`--exec-prefix` supplied by Python itself as ``sys.prefix`` and +``sys.exec_prefix``. Thus, you might think you'll never use the prefix scheme, +but every time you run ``python setup.py install`` without any other options, +you're using it. + +Note that installing extensions to an alternate Python installation has no +effect on how those extensions are built: in particular, the Python header files +(:file:`Python.h` and friends) installed with the Python interpreter used to run +the setup script will be used in compiling extensions. It is your +responsibility to ensure that the interpreter used to run extensions installed +in this way is compatible with the interpreter used to build them. The best way +to do this is to ensure that the two interpreters are the same version of Python +(possibly different builds, or possibly copies of the same build). (Of course, +if your :option:`--prefix` and :option:`--exec-prefix` don't even point to an +alternate Python installation, this is immaterial.) + + +.. _inst-alt-install-windows: + +Alternate installation: Windows (the prefix scheme) +--------------------------------------------------- + +Windows has no concept of a user's home directory, and since the standard Python +installation under Windows is simpler than under Unix, the :option:`--prefix` +option has traditionally been used to install additional packages in separate +locations on Windows. :: + + python setup.py install --prefix="\Temp\Python" + +to install modules to the :file:`\\Temp\\Python` directory on the current drive. + +The installation base is defined by the :option:`--prefix` option; the +:option:`--exec-prefix` option is not supported under Windows. Files are +installed as follows: + ++------------------------------+---------------------------+-----------------------------+ +| Type of file | Installation Directory | Override option | ++==============================+===========================+=============================+ +| pure module distribution | :file:`{prefix}` | :option:`--install-purelib` | ++------------------------------+---------------------------+-----------------------------+ +| non-pure module distribution | :file:`{prefix}` | :option:`--install-platlib` | ++------------------------------+---------------------------+-----------------------------+ +| scripts | :file:`{prefix}\\Scripts` | :option:`--install-scripts` | ++------------------------------+---------------------------+-----------------------------+ +| data | :file:`{prefix}\\Data` | :option:`--install-data` | ++------------------------------+---------------------------+-----------------------------+ + + +.. _inst-custom-install: + +Custom Installation +=================== + +Sometimes, the alternate installation schemes described in section +:ref:`inst-alt-install` just don't do what you want. You might want to tweak just +one or two directories while keeping everything under the same base directory, +or you might want to completely redefine the installation scheme. In either +case, you're creating a *custom installation scheme*. + +You probably noticed the column of "override options" in the tables describing +the alternate installation schemes above. Those options are how you define a +custom installation scheme. These override options can be relative, absolute, +or explicitly defined in terms of one of the installation base directories. +(There are two installation base directories, and they are normally the same--- +they only differ when you use the Unix "prefix scheme" and supply different +:option:`--prefix` and :option:`--exec-prefix` options.) + +For example, say you're installing a module distribution to your home directory +under Unix---but you want scripts to go in :file:`~/scripts` rather than +:file:`~/bin`. As you might expect, you can override this directory with the +:option:`--install-scripts` option; in this case, it makes most sense to supply +a relative path, which will be interpreted relative to the installation base +directory (your home directory, in this case):: + + python setup.py install --home=~ --install-scripts=scripts + +Another Unix example: suppose your Python installation was built and installed +with a prefix of :file:`/usr/local/python`, so under a standard installation +scripts will wind up in :file:`/usr/local/python/bin`. If you want them in +:file:`/usr/local/bin` instead, you would supply this absolute directory for the +:option:`--install-scripts` option:: + + python setup.py install --install-scripts=/usr/local/bin + +(This performs an installation using the "prefix scheme," where the prefix is +whatever your Python interpreter was installed with--- :file:`/usr/local/python` +in this case.) + +If you maintain Python on Windows, you might want third-party modules to live in +a subdirectory of :file:`{prefix}`, rather than right in :file:`{prefix}` +itself. This is almost as easy as customizing the script installation directory +---you just have to remember that there are two types of modules to worry about, +pure modules and non-pure modules (i.e., modules from a non-pure distribution). +For example:: + + python setup.py install --install-purelib=Site --install-platlib=Site + +The specified installation directories are relative to :file:`{prefix}`. Of +course, you also have to ensure that these directories are in Python's module +search path, such as by putting a :file:`.pth` file in :file:`{prefix}`. See +section :ref:`inst-search-path` to find out how to modify Python's search path. + +If you want to define an entire installation scheme, you just have to supply all +of the installation directory options. The recommended way to do this is to +supply relative paths; for example, if you want to maintain all Python +module-related files under :file:`python` in your home directory, and you want a +separate directory for each platform that you use your home directory from, you +might define the following installation scheme:: + + python setup.py install --home=~ \ + --install-purelib=python/lib \ + --install-platlib=python/lib.$PLAT \ + --install-scripts=python/scripts + --install-data=python/data + +or, equivalently, + +.. % $ % -- bow to font-lock + +:: + + python setup.py install --home=~/python \ + --install-purelib=lib \ + --install-platlib='lib.$PLAT' \ + --install-scripts=scripts + --install-data=data + +``$PLAT`` is not (necessarily) an environment variable---it will be expanded by +the Distutils as it parses your command line options, just as it does when +parsing your configuration file(s). + +.. % $ % -- bow to font-lock + +Obviously, specifying the entire installation scheme every time you install a +new module distribution would be very tedious. Thus, you can put these options +into your Distutils config file (see section :ref:`inst-config-files`):: + + [install] + install-base=$HOME + install-purelib=python/lib + install-platlib=python/lib.$PLAT + install-scripts=python/scripts + install-data=python/data + +or, equivalently, :: + + [install] + install-base=$HOME/python + install-purelib=lib + install-platlib=lib.$PLAT + install-scripts=scripts + install-data=data + +Note that these two are *not* equivalent if you supply a different installation +base directory when you run the setup script. For example, :: + + python setup.py install --install-base=/tmp + +would install pure modules to :file:`{/tmp/python/lib}` in the first case, and +to :file:`{/tmp/lib}` in the second case. (For the second case, you probably +want to supply an installation base of :file:`/tmp/python`.) + +You probably noticed the use of ``$HOME`` and ``$PLAT`` in the sample +configuration file input. These are Distutils configuration variables, which +bear a strong resemblance to environment variables. In fact, you can use +environment variables in config files on platforms that have such a notion but +the Distutils additionally define a few extra variables that may not be in your +environment, such as ``$PLAT``. (And of course, on systems that don't have +environment variables, such as Mac OS 9, the configuration variables supplied by +the Distutils are the only ones you can use.) See section :ref:`inst-config-files` +for details. + +.. % XXX need some Windows examples---when would custom +.. % installation schemes be needed on those platforms? + +.. % XXX I'm not sure where this section should go. + + +.. _inst-search-path: + +Modifying Python's Search Path +------------------------------ + +When the Python interpreter executes an :keyword:`import` statement, it searches +for both Python code and extension modules along a search path. A default value +for the path is configured into the Python binary when the interpreter is built. +You can determine the path by importing the :mod:`sys` module and printing the +value of ``sys.path``. :: + + $ python + Python 2.2 (#11, Oct 3 2002, 13:31:27) + [GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-112)] on linux2 + Type ``help'', ``copyright'', ``credits'' or ``license'' for more information. + >>> import sys + >>> sys.path + ['', '/usr/local/lib/python2.3', '/usr/local/lib/python2.3/plat-linux2', + '/usr/local/lib/python2.3/lib-tk', '/usr/local/lib/python2.3/lib-dynload', + '/usr/local/lib/python2.3/site-packages'] + >>> + +The null string in ``sys.path`` represents the current working directory. + +.. % $ <-- bow to font-lock + +The expected convention for locally installed packages is to put them in the +:file:`{...}/site-packages/` directory, but you may want to install Python +modules into some arbitrary directory. For example, your site may have a +convention of keeping all software related to the web server under :file:`/www`. +Add-on Python modules might then belong in :file:`/www/python`, and in order to +import them, this directory must be added to ``sys.path``. There are several +different ways to add the directory. + +The most convenient way is to add a path configuration file to a directory +that's already on Python's path, usually to the :file:`.../site-packages/` +directory. Path configuration files have an extension of :file:`.pth`, and each +line must contain a single path that will be appended to ``sys.path``. (Because +the new paths are appended to ``sys.path``, modules in the added directories +will not override standard modules. This means you can't use this mechanism for +installing fixed versions of standard modules.) + +Paths can be absolute or relative, in which case they're relative to the +directory containing the :file:`.pth` file. Any directories added to the search +path will be scanned in turn for :file:`.pth` files. See `site module +documentation `_ for +more information. + +A slightly less convenient way is to edit the :file:`site.py` file in Python's +standard library, and modify ``sys.path``. :file:`site.py` is automatically +imported when the Python interpreter is executed, unless the :option:`-S` switch +is supplied to suppress this behaviour. So you could simply edit +:file:`site.py` and add two lines to it:: + + import sys + sys.path.append('/www/python/') + +However, if you reinstall the same major version of Python (perhaps when +upgrading from 2.2 to 2.2.2, for example) :file:`site.py` will be overwritten by +the stock version. You'd have to remember that it was modified and save a copy +before doing the installation. + +There are two environment variables that can modify ``sys.path``. +:envvar:`PYTHONHOME` sets an alternate value for the prefix of the Python +installation. For example, if :envvar:`PYTHONHOME` is set to ``/www/python``, +the search path will be set to ``['', '/www/python/lib/pythonX.Y/', +'/www/python/lib/pythonX.Y/plat-linux2', ...]``. + +The :envvar:`PYTHONPATH` variable can be set to a list of paths that will be +added to the beginning of ``sys.path``. For example, if :envvar:`PYTHONPATH` is +set to ``/www/python:/opt/py``, the search path will begin with +``['/www/python', '/opt/py']``. (Note that directories must exist in order to +be added to ``sys.path``; the :mod:`site` module removes paths that don't +exist.) + +Finally, ``sys.path`` is just a regular Python list, so any Python application +can modify it by adding or removing entries. + + +.. _inst-config-files: + +Distutils Configuration Files +============================= + +As mentioned above, you can use Distutils configuration files to record personal +or site preferences for any Distutils options. That is, any option to any +command can be stored in one of two or three (depending on your platform) +configuration files, which will be consulted before the command-line is parsed. +This means that configuration files will override default values, and the +command-line will in turn override configuration files. Furthermore, if +multiple configuration files apply, values from "earlier" files are overridden +by "later" files. + + +.. _inst-config-filenames: + +Location and names of config files +---------------------------------- + +The names and locations of the configuration files vary slightly across +platforms. On Unix and Mac OS X, the three configuration files (in the order +they are processed) are: + ++--------------+----------------------------------------------------------+-------+ +| Type of file | Location and filename | Notes | ++==============+==========================================================+=======+ +| system | :file:`{prefix}/lib/python{ver}/distutils/distutils.cfg` | \(1) | ++--------------+----------------------------------------------------------+-------+ +| personal | :file:`$HOME/.pydistutils.cfg` | \(2) | ++--------------+----------------------------------------------------------+-------+ +| local | :file:`setup.cfg` | \(3) | ++--------------+----------------------------------------------------------+-------+ + +And on Windows, the configuration files are: + ++--------------+-------------------------------------------------+-------+ +| Type of file | Location and filename | Notes | ++==============+=================================================+=======+ +| system | :file:`{prefix}\\Lib\\distutils\\distutils.cfg` | \(4) | ++--------------+-------------------------------------------------+-------+ +| personal | :file:`%HOME%\\pydistutils.cfg` | \(5) | ++--------------+-------------------------------------------------+-------+ +| local | :file:`setup.cfg` | \(3) | ++--------------+-------------------------------------------------+-------+ + +Notes: + +(1) + Strictly speaking, the system-wide configuration file lives in the directory + where the Distutils are installed; under Python 1.6 and later on Unix, this is + as shown. For Python 1.5.2, the Distutils will normally be installed to + :file:`{prefix}/lib/python1.5/site-packages/distutils`, so the system + configuration file should be put there under Python 1.5.2. + +(2) + On Unix, if the :envvar:`HOME` environment variable is not defined, the user's + home directory will be determined with the :func:`getpwuid` function from the + standard :mod:`pwd` module. + +(3) + I.e., in the current directory (usually the location of the setup script). + +(4) + (See also note (1).) Under Python 1.6 and later, Python's default "installation + prefix" is :file:`C:\\Python`, so the system configuration file is normally + :file:`C:\\Python\\Lib\\distutils\\distutils.cfg`. Under Python 1.5.2, the + default prefix was :file:`C:\\Program Files\\Python`, and the Distutils were not + part of the standard library---so the system configuration file would be + :file:`C:\\Program Files\\Python\\distutils\\distutils.cfg` in a standard Python + 1.5.2 installation under Windows. + +(5) + On Windows, if the :envvar:`HOME` environment variable is not defined, no + personal configuration file will be found or used. (In other words, the + Distutils make no attempt to guess your home directory on Windows.) + + +.. _inst-config-syntax: + +Syntax of config files +---------------------- + +The Distutils configuration files all have the same syntax. The config files +are grouped into sections. There is one section for each Distutils command, +plus a ``global`` section for global options that affect every command. Each +section consists of one option per line, specified as ``option=value``. + +For example, the following is a complete config file that just forces all +commands to run quietly by default:: + + [global] + verbose=0 + +If this is installed as the system config file, it will affect all processing of +any Python module distribution by any user on the current system. If it is +installed as your personal config file (on systems that support them), it will +affect only module distributions processed by you. And if it is used as the +:file:`setup.cfg` for a particular module distribution, it affects only that +distribution. + +You could override the default "build base" directory and make the +:command:`build\*` commands always forcibly rebuild all files with the +following:: + + [build] + build-base=blib + force=1 + +which corresponds to the command-line arguments :: + + python setup.py build --build-base=blib --force + +except that including the :command:`build` command on the command-line means +that command will be run. Including a particular command in config files has no +such implication; it only means that if the command is run, the options in the +config file will apply. (Or if other commands that derive values from it are +run, they will use the values in the config file.) + +You can find out the complete list of options for any command using the +:option:`--help` option, e.g.:: + + python setup.py build --help + +and you can find out the complete list of global options by using +:option:`--help` without a command:: + + python setup.py --help + +See also the "Reference" section of the "Distributing Python Modules" manual. + + +.. _inst-building-ext: + +Building Extensions: Tips and Tricks +==================================== + +Whenever possible, the Distutils try to use the configuration information made +available by the Python interpreter used to run the :file:`setup.py` script. +For example, the same compiler and linker flags used to compile Python will also +be used for compiling extensions. Usually this will work well, but in +complicated situations this might be inappropriate. This section discusses how +to override the usual Distutils behaviour. + + +.. _inst-tweak-flags: + +Tweaking compiler/linker flags +------------------------------ + +Compiling a Python extension written in C or C++ will sometimes require +specifying custom flags for the compiler and linker in order to use a particular +library or produce a special kind of object code. This is especially true if the +extension hasn't been tested on your platform, or if you're trying to +cross-compile Python. + +In the most general case, the extension author might have foreseen that +compiling the extensions would be complicated, and provided a :file:`Setup` file +for you to edit. This will likely only be done if the module distribution +contains many separate extension modules, or if they often require elaborate +sets of compiler flags in order to work. + +A :file:`Setup` file, if present, is parsed in order to get a list of extensions +to build. Each line in a :file:`Setup` describes a single module. Lines have +the following structure:: + + module ... [sourcefile ...] [cpparg ...] [library ...] + + +Let's examine each of the fields in turn. + +* *module* is the name of the extension module to be built, and should be a + valid Python identifier. You can't just change this in order to rename a module + (edits to the source code would also be needed), so this should be left alone. + +* *sourcefile* is anything that's likely to be a source code file, at least + judging by the filename. Filenames ending in :file:`.c` are assumed to be + written in C, filenames ending in :file:`.C`, :file:`.cc`, and :file:`.c++` are + assumed to be C++, and filenames ending in :file:`.m` or :file:`.mm` are assumed + to be in Objective C. + +* *cpparg* is an argument for the C preprocessor, and is anything starting with + :option:`-I`, :option:`-D`, :option:`-U` or :option:`-C`. + +* *library* is anything ending in :file:`.a` or beginning with :option:`-l` or + :option:`-L`. + +If a particular platform requires a special library on your platform, you can +add it by editing the :file:`Setup` file and running ``python setup.py build``. +For example, if the module defined by the line :: + + foo foomodule.c + +must be linked with the math library :file:`libm.a` on your platform, simply add +:option:`-lm` to the line:: + + foo foomodule.c -lm + +Arbitrary switches intended for the compiler or the linker can be supplied with +the :option:`-Xcompiler` *arg* and :option:`-Xlinker` *arg* options:: + + foo foomodule.c -Xcompiler -o32 -Xlinker -shared -lm + +The next option after :option:`-Xcompiler` and :option:`-Xlinker` will be +appended to the proper command line, so in the above example the compiler will +be passed the :option:`-o32` option, and the linker will be passed +:option:`-shared`. If a compiler option requires an argument, you'll have to +supply multiple :option:`-Xcompiler` options; for example, to pass ``-x c++`` +the :file:`Setup` file would have to contain ``-Xcompiler -x -Xcompiler c++``. + +Compiler flags can also be supplied through setting the :envvar:`CFLAGS` +environment variable. If set, the contents of :envvar:`CFLAGS` will be added to +the compiler flags specified in the :file:`Setup` file. + + +.. _inst-non-ms-compilers: + +Using non-Microsoft compilers on Windows +---------------------------------------- + +.. sectionauthor:: Rene Liebscher + + + +Borland C++ +^^^^^^^^^^^ + +This subsection describes the necessary steps to use Distutils with the Borland +C++ compiler version 5.5. First you have to know that Borland's object file +format (OMF) is different from the format used by the Python version you can +download from the Python or ActiveState Web site. (Python is built with +Microsoft Visual C++, which uses COFF as the object file format.) For this +reason you have to convert Python's library :file:`python25.lib` into the +Borland format. You can do this as follows: + +.. % Should we mention that users have to create cfg-files for the compiler? +.. % see also http://community.borland.com/article/0,1410,21205,00.html + +:: + + coff2omf python25.lib python25_bcpp.lib + +The :file:`coff2omf` program comes with the Borland compiler. The file +:file:`python25.lib` is in the :file:`Libs` directory of your Python +installation. If your extension uses other libraries (zlib, ...) you have to +convert them too. + +The converted files have to reside in the same directories as the normal +libraries. + +How does Distutils manage to use these libraries with their changed names? If +the extension needs a library (eg. :file:`foo`) Distutils checks first if it +finds a library with suffix :file:`_bcpp` (eg. :file:`foo_bcpp.lib`) and then +uses this library. In the case it doesn't find such a special library it uses +the default name (:file:`foo.lib`.) [#]_ + +To let Distutils compile your extension with Borland C++ you now have to type:: + + python setup.py build --compiler=bcpp + +If you want to use the Borland C++ compiler as the default, you could specify +this in your personal or system-wide configuration file for Distutils (see +section :ref:`inst-config-files`.) + + +.. seealso:: + + `C++Builder Compiler `_ + Information about the free C++ compiler from Borland, including links to the + download pages. + + `Creating Python Extensions Using Borland's Free Compiler `_ + Document describing how to use Borland's free command-line C++ compiler to build + Python. + + +GNU C / Cygwin / MinGW +^^^^^^^^^^^^^^^^^^^^^^ + +These instructions only apply if you're using a version of Python prior to +2.4.1 with a MinGW prior to 3.0.0 (with binutils-2.13.90-20030111-1). + +This section describes the necessary steps to use Distutils with the GNU C/C++ +compilers in their Cygwin and MinGW distributions. [#]_ For a Python interpreter +that was built with Cygwin, everything should work without any of these +following steps. + +These compilers require some special libraries. This task is more complex than +for Borland's C++, because there is no program to convert the library. First +you have to create a list of symbols which the Python DLL exports. (You can find +a good program for this task at +http://starship.python.net/crew/kernr/mingw32/Notes.html, see at PExports 0.42h +there.) + +.. % I don't understand what the next line means. --amk +.. % (inclusive the references on data structures.) + +:: + + pexports python25.dll >python25.def + +The location of an installed :file:`python25.dll` will depend on the +installation options and the version and language of Windows. In a "just for +me" installation, it will appear in the root of the installation directory. In +a shared installation, it will be located in the system directory. + +Then you can create from these information an import library for gcc. :: + + /cygwin/bin/dlltool --dllname python25.dll --def python25.def --output-lib libpython25.a + +The resulting library has to be placed in the same directory as +:file:`python25.lib`. (Should be the :file:`libs` directory under your Python +installation directory.) + +If your extension uses other libraries (zlib,...) you might have to convert +them too. The converted files have to reside in the same directories as the +normal libraries do. + +To let Distutils compile your extension with Cygwin you now have to type :: + + python setup.py build --compiler=cygwin + +and for Cygwin in no-cygwin mode [#]_ or for MinGW type:: + + python setup.py build --compiler=mingw32 + +If you want to use any of these options/compilers as default, you should +consider to write it in your personal or system-wide configuration file for +Distutils (see section :ref:`inst-config-files`.) + + +.. seealso:: + + `Building Python modules on MS Windows platform with MinGW `_ + Information about building the required libraries for the MinGW environment. + + http://pyopengl.sourceforge.net/ftp/win32-stuff/ + Converted import libraries in Cygwin/MinGW and Borland format, and a script to + create the registry entries needed for Distutils to locate the built Python. + +.. rubric:: Footnotes + +.. [#] This also means you could replace all existing COFF-libraries with OMF-libraries + of the same name. + +.. [#] Check http://sources.redhat.com/cygwin/ and http://www.mingw.org/ for more + information + +.. [#] Then you have no POSIX emulation available, but you also don't need + :file:`cygwin1.dll`. diff --git a/Doc/library/__builtin__.rst b/Doc/library/__builtin__.rst new file mode 100644 index 0000000..b3e1e11 --- /dev/null +++ b/Doc/library/__builtin__.rst @@ -0,0 +1,41 @@ + +:mod:`__builtin__` --- Built-in objects +======================================= + +.. module:: __builtin__ + :synopsis: The module that provides the built-in namespace. + + +This module provides direct access to all 'built-in' identifiers of Python; for +example, ``__builtin__.open`` is the full name for the built-in function +:func:`open`. See chapter :ref:`builtin`. + +This module is not normally accessed explicitly by most applications, but can be +useful in modules that provide objects with the same name as a built-in value, +but in which the built-in of that name is also needed. For example, in a module +that wants to implement an :func:`open` function that wraps the built-in +:func:`open`, this module can be used directly:: + + import __builtin__ + + def open(path): + f = __builtin__.open(path, 'r') + return UpperCaser(f) + + class UpperCaser: + '''Wrapper around a file that converts output to upper-case.''' + + def __init__(self, f): + self._f = f + + def read(self, count=-1): + return self._f.read(count).upper() + + # ... + +As an implementation detail, most modules have the name ``__builtins__`` (note +the ``'s'``) made available as part of their globals. The value of +``__builtins__`` is normally either this module or the value of this modules's +:attr:`__dict__` attribute. Since this is an implementation detail, it may not +be used by alternate implementations of Python. + diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst new file mode 100644 index 0000000..6bf2830 --- /dev/null +++ b/Doc/library/__future__.rst @@ -0,0 +1,61 @@ + +:mod:`__future__` --- Future statement definitions +================================================== + +.. module:: __future__ + :synopsis: Future statement definitions + + +:mod:`__future__` is a real module, and serves three purposes: + +* To avoid confusing existing tools that analyze import statements and expect to + find the modules they're importing. + +* To ensure that future_statements run under releases prior to 2.1 at least + yield runtime exceptions (the import of :mod:`__future__` will fail, because + there was no module of that name prior to 2.1). + +* To document when incompatible changes were introduced, and when they will be + --- or were --- made mandatory. This is a form of executable documentation, and + can be inspected programatically via importing :mod:`__future__` and examining + its contents. + +Each statement in :file:`__future__.py` is of the form:: + + FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease "," + CompilerFlag ")" + + +where, normally, *OptionalRelease* is less than *MandatoryRelease*, and both are +5-tuples of the same form as ``sys.version_info``:: + + (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int + PY_MINOR_VERSION, # the 1; an int + PY_MICRO_VERSION, # the 0; an int + PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string + PY_RELEASE_SERIAL # the 3; an int + ) + +*OptionalRelease* records the first release in which the feature was accepted. + +In the case of a *MandatoryRelease* that has not yet occurred, +*MandatoryRelease* predicts the release in which the feature will become part of +the language. + +Else *MandatoryRelease* records when the feature became part of the language; in +releases at or after that, modules no longer need a future statement to use the +feature in question, but may continue to use such imports. + +*MandatoryRelease* may also be ``None``, meaning that a planned feature got +dropped. + +Instances of class :class:`_Feature` have two corresponding methods, +:meth:`getOptionalRelease` and :meth:`getMandatoryRelease`. + +*CompilerFlag* is the (bitfield) flag that should be passed in the fourth +argument to the builtin function :func:`compile` to enable the feature in +dynamically compiled code. This flag is stored in the :attr:`compiler_flag` +attribute on :class:`_Feature` instances. + +No feature description will ever be deleted from :mod:`__future__`. + diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst new file mode 100644 index 0000000..a1d3c24 --- /dev/null +++ b/Doc/library/__main__.rst @@ -0,0 +1,17 @@ + +:mod:`__main__` --- Top-level script environment +================================================ + +.. module:: __main__ + :synopsis: The environment where the top-level script is run. + + +This module represents the (otherwise anonymous) scope in which the +interpreter's main program executes --- commands read either from standard +input, from a script file, or from an interactive prompt. It is this +environment in which the idiomatic "conditional script" stanza causes a script +to run:: + + if __name__ == "__main__": + main() + diff --git a/Doc/library/_ast.rst b/Doc/library/_ast.rst new file mode 100644 index 0000000..9b195be --- /dev/null +++ b/Doc/library/_ast.rst @@ -0,0 +1,59 @@ +.. _ast: + +Abstract Syntax Trees +===================== + +.. module:: _ast + :synopsis: Abstract Syntax Tree classes. + +.. sectionauthor:: Martin v. Löwis + + +.. versionadded:: 2.5 + +The ``_ast`` module helps Python applications to process trees of the Python +abstract syntax grammar. The Python compiler currently provides read-only access +to such trees, meaning that applications can only create a tree for a given +piece of Python source code; generating byte code from a (potentially modified) +tree is not supported. The abstract syntax itself might change with each Python +release; this module helps to find out programmatically what the current grammar +looks like. + +An abstract syntax tree can be generated by passing ``_ast.PyCF_ONLY_AST`` as a +flag to the :func:`compile` builtin function. The result will be a tree of +objects whose classes all inherit from ``_ast.AST``. + +The actual classes are derived from the ``Parser/Python.asdl`` file, which is +reproduced below. There is one class defined for each left-hand side symbol in +the abstract grammar (for example, ``_ast.stmt`` or ``_ast.expr``). In addition, +there is one class defined for each constructor on the right-hand side; these +classes inherit from the classes for the left-hand side trees. For example, +``_ast.BinOp`` inherits from ``_ast.expr``. For production rules with +alternatives (aka "sums"), the left-hand side class is abstract: only instances +of specific constructor nodes are ever created. + +Each concrete class has an attribute ``_fields`` which gives the names of all +child nodes. + +Each instance of a concrete class has one attribute for each child node, of the +type as defined in the grammar. For example, ``_ast.BinOp`` instances have an +attribute ``left`` of type ``_ast.expr``. Instances of ``_ast.expr`` and +``_ast.stmt`` subclasses also have lineno and col_offset attributes. The lineno +is the line number of source text (1 indexed so the first line is line 1) and +the col_offset is the utf8 byte offset of the first token that generated the +node. The utf8 offset is recorded because the parser uses utf8 internally. + +If these attributes are marked as optional in the grammar (using a question +mark), the value might be ``None``. If the attributes can have zero-or-more +values (marked with an asterisk), the values are represented as Python lists. + + +Abstract Grammar +---------------- + +The module defines a string constant ``__version__`` which is the decimal +subversion revision number of the file shown below. + +The abstract grammar is currently defined as follows: + +.. literalinclude:: ../../Parser/Python.asdl diff --git a/Doc/library/_winreg.rst b/Doc/library/_winreg.rst new file mode 100644 index 0000000..fddbfd1 --- /dev/null +++ b/Doc/library/_winreg.rst @@ -0,0 +1,420 @@ + +:mod:`_winreg` -- Windows registry access +========================================= + +.. module:: _winreg + :platform: Windows + :synopsis: Routines and objects for manipulating the Windows registry. +.. sectionauthor:: Mark Hammond + + +.. versionadded:: 2.0 + +These functions expose the Windows registry API to Python. Instead of using an +integer as the registry handle, a handle object is used to ensure that the +handles are closed correctly, even if the programmer neglects to explicitly +close them. + +This module exposes a very low-level interface to the Windows registry; it is +expected that in the future a new ``winreg`` module will be created offering a +higher-level interface to the registry API. + +This module offers the following functions: + + +.. function:: CloseKey(hkey) + + Closes a previously opened registry key. The hkey argument specifies a + previously opened key. + + Note that if *hkey* is not closed using this method (or via + :meth:`handle.Close`), it is closed when the *hkey* object is destroyed by + Python. + + +.. function:: ConnectRegistry(computer_name, key) + + Establishes a connection to a predefined registry handle on another computer, + and returns a :dfn:`handle object` + + *computer_name* is the name of the remote computer, of the form + ``r"\\computername"``. If ``None``, the local computer is used. + + *key* is the predefined handle to connect to. + + The return value is the handle of the opened key. If the function fails, an + :exc:`EnvironmentError` exception is raised. + + +.. function:: CreateKey(key, sub_key) + + Creates or opens the specified key, returning a :dfn:`handle object` + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that names the key this method opens or creates. + + If *key* is one of the predefined keys, *sub_key* may be ``None``. In that + case, the handle returned is the same key handle passed in to the function. + + If the key already exists, this function opens the existing key. + + The return value is the handle of the opened key. If the function fails, an + :exc:`EnvironmentError` exception is raised. + + +.. function:: DeleteKey(key, sub_key) + + Deletes the specified key. + + *key* is an already open key, or any one of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that must be a subkey of the key identified by the *key* + parameter. This value must not be ``None``, and the key may not have subkeys. + + *This method can not delete keys with subkeys.* + + If the method succeeds, the entire key, including all of its values, is removed. + If the method fails, an :exc:`EnvironmentError` exception is raised. + + +.. function:: DeleteValue(key, value) + + Removes a named value from a registry key. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *value* is a string that identifies the value to remove. + + +.. function:: EnumKey(key, index) + + Enumerates subkeys of an open registry key, returning a string. + + *key* is an already open key, or any one of the predefined :const:`HKEY_\*` + constants. + + *index* is an integer that identifies the index of the key to retrieve. + + The function retrieves the name of one subkey each time it is called. It is + typically called repeatedly until an :exc:`EnvironmentError` exception is + raised, indicating, no more values are available. + + +.. function:: EnumValue(key, index) + + Enumerates values of an open registry key, returning a tuple. + + *key* is an already open key, or any one of the predefined :const:`HKEY_\*` + constants. + + *index* is an integer that identifies the index of the value to retrieve. + + The function retrieves the name of one subkey each time it is called. It is + typically called repeatedly, until an :exc:`EnvironmentError` exception is + raised, indicating no more values. + + The result is a tuple of 3 items: + + +-------+--------------------------------------------+ + | Index | Meaning | + +=======+============================================+ + | ``0`` | A string that identifies the value name | + +-------+--------------------------------------------+ + | ``1`` | An object that holds the value data, and | + | | whose type depends on the underlying | + | | registry type | + +-------+--------------------------------------------+ + | ``2`` | An integer that identifies the type of the | + | | value data | + +-------+--------------------------------------------+ + + +.. function:: FlushKey(key) + + Writes all the attributes of a key to the registry. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + It is not necessary to call RegFlushKey to change a key. Registry changes are + flushed to disk by the registry using its lazy flusher. Registry changes are + also flushed to disk at system shutdown. Unlike :func:`CloseKey`, the + :func:`FlushKey` method returns only when all the data has been written to the + registry. An application should only call :func:`FlushKey` if it requires + absolute certainty that registry changes are on disk. + + .. note:: + + If you don't know whether a :func:`FlushKey` call is required, it probably + isn't. + + +.. function:: RegLoadKey(key, sub_key, file_name) + + Creates a subkey under the specified key and stores registration information + from a specified file into that subkey. + + *key* is an already open key, or any of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that identifies the sub_key to load. + + *file_name* is the name of the file to load registry data from. This file must + have been created with the :func:`SaveKey` function. Under the file allocation + table (FAT) file system, the filename may not have an extension. + + A call to LoadKey() fails if the calling process does not have the + :const:`SE_RESTORE_PRIVILEGE` privilege. Note that privileges are different than + permissions - see the Win32 documentation for more details. + + If *key* is a handle returned by :func:`ConnectRegistry`, then the path + specified in *fileName* is relative to the remote computer. + + The Win32 documentation implies *key* must be in the :const:`HKEY_USER` or + :const:`HKEY_LOCAL_MACHINE` tree. This may or may not be true. + + +.. function:: OpenKey(key, sub_key[, res=0][, sam=KEY_READ]) + + Opens the specified key, returning a :dfn:`handle object` + + *key* is an already open key, or any one of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that identifies the sub_key to open. + + *res* is a reserved integer, and must be zero. The default is zero. + + *sam* is an integer that specifies an access mask that describes the desired + security access for the key. Default is :const:`KEY_READ` + + The result is a new handle to the specified key. + + If the function fails, :exc:`EnvironmentError` is raised. + + +.. function:: OpenKeyEx() + + The functionality of :func:`OpenKeyEx` is provided via :func:`OpenKey`, by the + use of default arguments. + + +.. function:: QueryInfoKey(key) + + Returns information about a key, as a tuple. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + The result is a tuple of 3 items: + + +-------+---------------------------------------------+ + | Index | Meaning | + +=======+=============================================+ + | ``0`` | An integer giving the number of sub keys | + | | this key has. | + +-------+---------------------------------------------+ + | ``1`` | An integer giving the number of values this | + | | key has. | + +-------+---------------------------------------------+ + | ``2`` | A long integer giving when the key was last | + | | modified (if available) as 100's of | + | | nanoseconds since Jan 1, 1600. | + +-------+---------------------------------------------+ + + +.. function:: QueryValue(key, sub_key) + + Retrieves the unnamed value for a key, as a string + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that holds the name of the subkey with which the value is + associated. If this parameter is ``None`` or empty, the function retrieves the + value set by the :func:`SetValue` method for the key identified by *key*. + + Values in the registry have name, type, and data components. This method + retrieves the data for a key's first value that has a NULL name. But the + underlying API call doesn't return the type, Lame Lame Lame, DO NOT USE THIS!!! + + +.. function:: QueryValueEx(key, value_name) + + Retrieves the type and data for a specified value name associated with an open + registry key. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *value_name* is a string indicating the value to query. + + The result is a tuple of 2 items: + + +-------+-----------------------------------------+ + | Index | Meaning | + +=======+=========================================+ + | ``0`` | The value of the registry item. | + +-------+-----------------------------------------+ + | ``1`` | An integer giving the registry type for | + | | this value. | + +-------+-----------------------------------------+ + + +.. function:: SaveKey(key, file_name) + + Saves the specified key, and all its subkeys to the specified file. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *file_name* is the name of the file to save registry data to. This file cannot + already exist. If this filename includes an extension, it cannot be used on file + allocation table (FAT) file systems by the :meth:`LoadKey`, :meth:`ReplaceKey` + or :meth:`RestoreKey` methods. + + If *key* represents a key on a remote computer, the path described by + *file_name* is relative to the remote computer. The caller of this method must + possess the :const:`SeBackupPrivilege` security privilege. Note that + privileges are different than permissions - see the Win32 documentation for + more details. + + This function passes NULL for *security_attributes* to the API. + + +.. function:: SetValue(key, sub_key, type, value) + + Associates a value with a specified key. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *sub_key* is a string that names the subkey with which the value is associated. + + *type* is an integer that specifies the type of the data. Currently this must be + :const:`REG_SZ`, meaning only strings are supported. Use the :func:`SetValueEx` + function for support for other data types. + + *value* is a string that specifies the new value. + + If the key specified by the *sub_key* parameter does not exist, the SetValue + function creates it. + + Value lengths are limited by available memory. Long values (more than 2048 + bytes) should be stored as files with the filenames stored in the configuration + registry. This helps the registry perform efficiently. + + The key identified by the *key* parameter must have been opened with + :const:`KEY_SET_VALUE` access. + + +.. function:: SetValueEx(key, value_name, reserved, type, value) + + Stores data in the value field of an open registry key. + + *key* is an already open key, or one of the predefined :const:`HKEY_\*` + constants. + + *value_name* is a string that names the subkey with which the value is + associated. + + *type* is an integer that specifies the type of the data. This should be one + of the following constants defined in this module: + + +----------------------------------+---------------------------------------------+ + | Constant | Meaning | + +==================================+=============================================+ + | :const:`REG_BINARY` | Binary data in any form. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_DWORD` | A 32-bit number. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_DWORD_LITTLE_ENDIAN` | A 32-bit number in little-endian format. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_DWORD_BIG_ENDIAN` | A 32-bit number in big-endian format. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_EXPAND_SZ` | Null-terminated string containing | + | | references to environment variables | + | | (``%PATH%``). | + +----------------------------------+---------------------------------------------+ + | :const:`REG_LINK` | A Unicode symbolic link. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_MULTI_SZ` | A sequence of null-terminated strings, | + | | terminated by two null characters. (Python | + | | handles this termination automatically.) | + +----------------------------------+---------------------------------------------+ + | :const:`REG_NONE` | No defined value type. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_RESOURCE_LIST` | A device-driver resource list. | + +----------------------------------+---------------------------------------------+ + | :const:`REG_SZ` | A null-terminated string. | + +----------------------------------+---------------------------------------------+ + + *reserved* can be anything - zero is always passed to the API. + + *value* is a string that specifies the new value. + + This method can also set additional value and type information for the specified + key. The key identified by the key parameter must have been opened with + :const:`KEY_SET_VALUE` access. + + To open the key, use the :func:`CreateKeyEx` or :func:`OpenKey` methods. + + Value lengths are limited by available memory. Long values (more than 2048 + bytes) should be stored as files with the filenames stored in the configuration + registry. This helps the registry perform efficiently. + + +.. _handle-object: + +Registry Handle Objects +----------------------- + +This object wraps a Windows HKEY object, automatically closing it when the +object is destroyed. To guarantee cleanup, you can call either the +:meth:`Close` method on the object, or the :func:`CloseKey` function. + +All registry functions in this module return one of these objects. + +All registry functions in this module which accept a handle object also accept +an integer, however, use of the handle object is encouraged. + +Handle objects provide semantics for :meth:`__bool__` - thus :: + + if handle: + print "Yes" + +will print ``Yes`` if the handle is currently valid (has not been closed or +detached). + +The object also support comparison semantics, so handle objects will compare +true if they both reference the same underlying Windows handle value. + +Handle objects can be converted to an integer (e.g., using the builtin +:func:`int` function), in which case the underlying Windows handle value is +returned. You can also use the :meth:`Detach` method to return the integer +handle, and also disconnect the Windows handle from the handle object. + + +.. method:: PyHKEY.Close() + + Closes the underlying Windows handle. + + If the handle is already closed, no error is raised. + + +.. method:: PyHKEY.Detach() + + Detaches the Windows handle from the handle object. + + The result is an integer (or long on 64 bit Windows) that holds the value of the + handle before it is detached. If the handle is already detached or closed, this + will return zero. + + After calling this function, the handle is effectively invalidated, but the + handle is not closed. You would call this function when you need the + underlying Win32 handle to exist beyond the lifetime of the handle object. + diff --git a/Doc/library/aepack.rst b/Doc/library/aepack.rst new file mode 100644 index 0000000..7eaffd8 --- /dev/null +++ b/Doc/library/aepack.rst @@ -0,0 +1,92 @@ + +:mod:`aepack` --- Conversion between Python variables and AppleEvent data containers +==================================================================================== + +.. module:: aepack + :platform: Mac + :synopsis: Conversion between Python variables and AppleEvent data containers. +.. sectionauthor:: Vincent Marchetti + + +.. % \moduleauthor{Jack Jansen?}{email} + +The :mod:`aepack` module defines functions for converting (packing) Python +variables to AppleEvent descriptors and back (unpacking). Within Python the +AppleEvent descriptor is handled by Python objects of built-in type +:class:`AEDesc`, defined in module :mod:`Carbon.AE`. + +The :mod:`aepack` module defines the following functions: + + +.. function:: pack(x[, forcetype]) + + Returns an :class:`AEDesc` object containing a conversion of Python value x. If + *forcetype* is provided it specifies the descriptor type of the result. + Otherwise, a default mapping of Python types to Apple Event descriptor types is + used, as follows: + + +-----------------+-----------------------------------+ + | Python type | descriptor type | + +=================+===================================+ + | :class:`FSSpec` | typeFSS | + +-----------------+-----------------------------------+ + | :class:`FSRef` | typeFSRef | + +-----------------+-----------------------------------+ + | :class:`Alias` | typeAlias | + +-----------------+-----------------------------------+ + | integer | typeLong (32 bit integer) | + +-----------------+-----------------------------------+ + | float | typeFloat (64 bit floating point) | + +-----------------+-----------------------------------+ + | string | typeText | + +-----------------+-----------------------------------+ + | unicode | typeUnicodeText | + +-----------------+-----------------------------------+ + | list | typeAEList | + +-----------------+-----------------------------------+ + | dictionary | typeAERecord | + +-----------------+-----------------------------------+ + | instance | *see below* | + +-----------------+-----------------------------------+ + + If *x* is a Python instance then this function attempts to call an + :meth:`__aepack__` method. This method should return an :class:`AEDesc` object. + + If the conversion *x* is not defined above, this function returns the Python + string representation of a value (the repr() function) encoded as a text + descriptor. + + +.. function:: unpack(x[, formodulename]) + + *x* must be an object of type :class:`AEDesc`. This function returns a Python + object representation of the data in the Apple Event descriptor *x*. Simple + AppleEvent data types (integer, text, float) are returned as their obvious + Python counterparts. Apple Event lists are returned as Python lists, and the + list elements are recursively unpacked. Object references (ex. ``line 3 of + document 1``) are returned as instances of :class:`aetypes.ObjectSpecifier`, + unless ``formodulename`` is specified. AppleEvent descriptors with descriptor + type typeFSS are returned as :class:`FSSpec` objects. AppleEvent record + descriptors are returned as Python dictionaries, with 4-character string keys + and elements recursively unpacked. + + The optional ``formodulename`` argument is used by the stub packages generated + by :mod:`gensuitemodule`, and ensures that the OSA classes for object specifiers + are looked up in the correct module. This ensures that if, say, the Finder + returns an object specifier for a window you get an instance of + ``Finder.Window`` and not a generic ``aetypes.Window``. The former knows about + all the properties and elements a window has in the Finder, while the latter + knows no such things. + + +.. seealso:: + + Module :mod:`Carbon.AE` + Built-in access to Apple Event Manager routines. + + Module :mod:`aetypes` + Python definitions of codes for Apple Event descriptor types. + + ` Inside Macintosh: Interapplication Communication `_ + Information about inter-process communications on the Macintosh. + diff --git a/Doc/library/aetools.rst b/Doc/library/aetools.rst new file mode 100644 index 0000000..b5fd4ad --- /dev/null +++ b/Doc/library/aetools.rst @@ -0,0 +1,86 @@ + +:mod:`aetools` --- OSA client support +===================================== + +.. module:: aetools + :platform: Mac + :synopsis: Basic support for sending Apple Events +.. sectionauthor:: Jack Jansen + + +.. % \moduleauthor{Jack Jansen?}{email} + +The :mod:`aetools` module contains the basic functionality on which Python +AppleScript client support is built. It also imports and re-exports the core +functionality of the :mod:`aetypes` and :mod:`aepack` modules. The stub packages +generated by :mod:`gensuitemodule` import the relevant portions of +:mod:`aetools`, so usually you do not need to import it yourself. The exception +to this is when you cannot use a generated suite package and need lower-level +access to scripting. + +The :mod:`aetools` module itself uses the AppleEvent support provided by the +:mod:`Carbon.AE` module. This has one drawback: you need access to the window +manager, see section :ref:`osx-gui-scripts` for details. This restriction may be +lifted in future releases. + +The :mod:`aetools` module defines the following functions: + + +.. function:: packevent(ae, parameters, attributes) + + Stores parameters and attributes in a pre-created ``Carbon.AE.AEDesc`` object. + ``parameters`` and ``attributes`` are dictionaries mapping 4-character OSA + parameter keys to Python objects. The objects are packed using + ``aepack.pack()``. + + +.. function:: unpackevent(ae[, formodulename]) + + Recursively unpacks a ``Carbon.AE.AEDesc`` event to Python objects. The function + returns the parameter dictionary and the attribute dictionary. The + ``formodulename`` argument is used by generated stub packages to control where + AppleScript classes are looked up. + + +.. function:: keysubst(arguments, keydict) + + Converts a Python keyword argument dictionary ``arguments`` to the format + required by ``packevent`` by replacing the keys, which are Python identifiers, + by the four-character OSA keys according to the mapping specified in + ``keydict``. Used by the generated suite packages. + + +.. function:: enumsubst(arguments, key, edict) + + If the ``arguments`` dictionary contains an entry for ``key`` convert the value + for that entry according to dictionary ``edict``. This converts human-readable + Python enumeration names to the OSA 4-character codes. Used by the generated + suite packages. + +The :mod:`aetools` module defines the following class: + + +.. class:: TalkTo([signature=None, start=0, timeout=0]) + + Base class for the proxy used to talk to an application. ``signature`` overrides + the class attribute ``_signature`` (which is usually set by subclasses) and is + the 4-char creator code defining the application to talk to. ``start`` can be + set to true to enable running the application on class instantiation. + ``timeout`` can be specified to change the default timeout used while waiting + for an AppleEvent reply. + + +.. method:: TalkTo._start() + + Test whether the application is running, and attempt to start it if not. + + +.. method:: TalkTo.send(code, subcode[, parameters, attributes]) + + Create the AppleEvent ``Carbon.AE.AEDesc`` for the verb with the OSA designation + ``code, subcode`` (which are the usual 4-character strings), pack the + ``parameters`` and ``attributes`` into it, send it to the target application, + wait for the reply, unpack the reply with ``unpackevent`` and return the reply + appleevent, the unpacked return values as a dictionary and the return + attributes. + diff --git a/Doc/library/aetypes.rst b/Doc/library/aetypes.rst new file mode 100644 index 0000000..0dd0a88 --- /dev/null +++ b/Doc/library/aetypes.rst @@ -0,0 +1,150 @@ + +:mod:`aetypes` --- AppleEvent objects +===================================== + +.. module:: aetypes + :platform: Mac + :synopsis: Python representation of the Apple Event Object Model. +.. sectionauthor:: Vincent Marchetti + + +.. % \moduleauthor{Jack Jansen?}{email} + +The :mod:`aetypes` defines classes used to represent Apple Event data +descriptors and Apple Event object specifiers. + +Apple Event data is contained in descriptors, and these descriptors are typed. +For many descriptors the Python representation is simply the corresponding +Python type: ``typeText`` in OSA is a Python string, ``typeFloat`` is a float, +etc. For OSA types that have no direct Python counterpart this module declares +classes. Packing and unpacking instances of these classes is handled +automatically by :mod:`aepack`. + +An object specifier is essentially an address of an object implemented in a +Apple Event server. An Apple Event specifier is used as the direct object for an +Apple Event or as the argument of an optional parameter. The :mod:`aetypes` +module contains the base classes for OSA classes and properties, which are used +by the packages generated by :mod:`gensuitemodule` to populate the classes and +properties in a given suite. + +For reasons of backward compatibility, and for cases where you need to script an +application for which you have not generated the stub package this module also +contains object specifiers for a number of common OSA classes such as +``Document``, ``Window``, ``Character``, etc. + +The :mod:`AEObjects` module defines the following classes to represent Apple +Event descriptor data: + + +.. class:: Unknown(type, data) + + The representation of OSA descriptor data for which the :mod:`aepack` and + :mod:`aetypes` modules have no support, i.e. anything that is not represented by + the other classes here and that is not equivalent to a simple Python value. + + +.. class:: Enum(enum) + + An enumeration value with the given 4-character string value. + + +.. class:: InsertionLoc(of, pos) + + Position ``pos`` in object ``of``. + + +.. class:: Boolean(bool) + + A boolean. + + +.. class:: StyledText(style, text) + + Text with style information (font, face, etc) included. + + +.. class:: AEText(script, style, text) + + Text with script system and style information included. + + +.. class:: IntlText(script, language, text) + + Text with script system and language information included. + + +.. class:: IntlWritingCode(script, language) + + Script system and language information. + + +.. class:: QDPoint(v, h) + + A quickdraw point. + + +.. class:: QDRectangle(v0, h0, v1, h1) + + A quickdraw rectangle. + + +.. class:: RGBColor(r, g, b) + + A color. + + +.. class:: Type(type) + + An OSA type value with the given 4-character name. + + +.. class:: Keyword(name) + + An OSA keyword with the given 4-character name. + + +.. class:: Range(start, stop) + + A range. + + +.. class:: Ordinal(abso) + + Non-numeric absolute positions, such as ``"firs"``, first, or ``"midd"``, + middle. + + +.. class:: Logical(logc, term) + + The logical expression of applying operator ``logc`` to ``term``. + + +.. class:: Comparison(obj1, relo, obj2) + + The comparison ``relo`` of ``obj1`` to ``obj2``. + +The following classes are used as base classes by the generated stub packages to +represent AppleScript classes and properties in Python: + + +.. class:: ComponentItem(which[, fr]) + + Abstract baseclass for an OSA class. The subclass should set the class attribute + ``want`` to the 4-character OSA class code. Instances of subclasses of this + class are equivalent to AppleScript Object Specifiers. Upon instantiation you + should pass a selector in ``which``, and optionally a parent object in ``fr``. + + +.. class:: NProperty(fr) + + Abstract baseclass for an OSA property. The subclass should set the class + attributes ``want`` and ``which`` to designate which property we are talking + about. Instances of subclasses of this class are Object Specifiers. + + +.. class:: ObjectSpecifier(want, form, seld[, fr]) + + Base class of ``ComponentItem`` and ``NProperty``, a general OSA Object + Specifier. See the Apple Open Scripting Architecture documentation for the + parameters. Note that this class is not abstract. + diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst new file mode 100644 index 0000000..0cfcb52 --- /dev/null +++ b/Doc/library/aifc.rst @@ -0,0 +1,225 @@ + +:mod:`aifc` --- Read and write AIFF and AIFC files +================================================== + +.. module:: aifc + :synopsis: Read and write audio files in AIFF or AIFC format. + + +.. index:: + single: Audio Interchange File Format + single: AIFF + single: AIFF-C + +This module provides support for reading and writing AIFF and AIFF-C files. +AIFF is Audio Interchange File Format, a format for storing digital audio +samples in a file. AIFF-C is a newer version of the format that includes the +ability to compress the audio data. + +**Caveat:** Some operations may only work under IRIX; these will raise +:exc:`ImportError` when attempting to import the :mod:`cl` module, which is only +available on IRIX. + +Audio files have a number of parameters that describe the audio data. The +sampling rate or frame rate is the number of times per second the sound is +sampled. The number of channels indicate if the audio is mono, stereo, or +quadro. Each frame consists of one sample per channel. The sample size is the +size in bytes of each sample. Thus a frame consists of +*nchannels*\**samplesize* bytes, and a second's worth of audio consists of +*nchannels*\**samplesize*\**framerate* bytes. + +For example, CD quality audio has a sample size of two bytes (16 bits), uses two +channels (stereo) and has a frame rate of 44,100 frames/second. This gives a +frame size of 4 bytes (2\*2), and a second's worth occupies 2\*2\*44100 bytes +(176,400 bytes). + +Module :mod:`aifc` defines the following function: + + +.. function:: open(file[, mode]) + + Open an AIFF or AIFF-C file and return an object instance with methods that are + described below. The argument *file* is either a string naming a file or a file + object. *mode* must be ``'r'`` or ``'rb'`` when the file must be opened for + reading, or ``'w'`` or ``'wb'`` when the file must be opened for writing. If + omitted, ``file.mode`` is used if it exists, otherwise ``'rb'`` is used. When + used for writing, the file object should be seekable, unless you know ahead of + time how many samples you are going to write in total and use + :meth:`writeframesraw` and :meth:`setnframes`. + +Objects returned by :func:`open` when a file is opened for reading have the +following methods: + + +.. method:: aifc.getnchannels() + + Return the number of audio channels (1 for mono, 2 for stereo). + + +.. method:: aifc.getsampwidth() + + Return the size in bytes of individual samples. + + +.. method:: aifc.getframerate() + + Return the sampling rate (number of audio frames per second). + + +.. method:: aifc.getnframes() + + Return the number of audio frames in the file. + + +.. method:: aifc.getcomptype() + + Return a four-character string describing the type of compression used in the + audio file. For AIFF files, the returned value is ``'NONE'``. + + +.. method:: aifc.getcompname() + + Return a human-readable description of the type of compression used in the audio + file. For AIFF files, the returned value is ``'not compressed'``. + + +.. method:: aifc.getparams() + + Return a tuple consisting of all of the above values in the above order. + + +.. method:: aifc.getmarkers() + + Return a list of markers in the audio file. A marker consists of a tuple of + three elements. The first is the mark ID (an integer), the second is the mark + position in frames from the beginning of the data (an integer), the third is the + name of the mark (a string). + + +.. method:: aifc.getmark(id) + + Return the tuple as described in :meth:`getmarkers` for the mark with the given + *id*. + + +.. method:: aifc.readframes(nframes) + + Read and return the next *nframes* frames from the audio file. The returned + data is a string containing for each frame the uncompressed samples of all + channels. + + +.. method:: aifc.rewind() + + Rewind the read pointer. The next :meth:`readframes` will start from the + beginning. + + +.. method:: aifc.setpos(pos) + + Seek to the specified frame number. + + +.. method:: aifc.tell() + + Return the current frame number. + + +.. method:: aifc.close() + + Close the AIFF file. After calling this method, the object can no longer be + used. + +Objects returned by :func:`open` when a file is opened for writing have all the +above methods, except for :meth:`readframes` and :meth:`setpos`. In addition +the following methods exist. The :meth:`get\*` methods can only be called after +the corresponding :meth:`set\*` methods have been called. Before the first +:meth:`writeframes` or :meth:`writeframesraw`, all parameters except for the +number of frames must be filled in. + + +.. method:: aifc.aiff() + + Create an AIFF file. The default is that an AIFF-C file is created, unless the + name of the file ends in ``'.aiff'`` in which case the default is an AIFF file. + + +.. method:: aifc.aifc() + + Create an AIFF-C file. The default is that an AIFF-C file is created, unless + the name of the file ends in ``'.aiff'`` in which case the default is an AIFF + file. + + +.. method:: aifc.setnchannels(nchannels) + + Specify the number of channels in the audio file. + + +.. method:: aifc.setsampwidth(width) + + Specify the size in bytes of audio samples. + + +.. method:: aifc.setframerate(rate) + + Specify the sampling frequency in frames per second. + + +.. method:: aifc.setnframes(nframes) + + Specify the number of frames that are to be written to the audio file. If this + parameter is not set, or not set correctly, the file needs to support seeking. + + +.. method:: aifc.setcomptype(type, name) + + .. index:: + single: u-LAW + single: A-LAW + single: G.722 + + Specify the compression type. If not specified, the audio data will not be + compressed. In AIFF files, compression is not possible. The name parameter + should be a human-readable description of the compression type, the type + parameter should be a four-character string. Currently the following + compression types are supported: NONE, ULAW, ALAW, G722. + + +.. method:: aifc.setparams(nchannels, sampwidth, framerate, comptype, compname) + + Set all the above parameters at once. The argument is a tuple consisting of the + various parameters. This means that it is possible to use the result of a + :meth:`getparams` call as argument to :meth:`setparams`. + + +.. method:: aifc.setmark(id, pos, name) + + Add a mark with the given id (larger than 0), and the given name at the given + position. This method can be called at any time before :meth:`close`. + + +.. method:: aifc.tell() + + Return the current write position in the output file. Useful in combination + with :meth:`setmark`. + + +.. method:: aifc.writeframes(data) + + Write data to the output file. This method can only be called after the audio + file parameters have been set. + + +.. method:: aifc.writeframesraw(data) + + Like :meth:`writeframes`, except that the header of the audio file is not + updated. + + +.. method:: aifc.close() + + Close the AIFF file. The header of the file is updated to reflect the actual + size of the audio data. After calling this method, the object can no longer be + used. + diff --git a/Doc/library/allos.rst b/Doc/library/allos.rst new file mode 100644 index 0000000..900d6d3 --- /dev/null +++ b/Doc/library/allos.rst @@ -0,0 +1,27 @@ + +.. _allos: + +********************************* +Generic Operating System Services +********************************* + +The modules described in this chapter provide interfaces to operating system +features that are available on (almost) all operating systems, such as files and +a clock. The interfaces are generally modeled after the Unix or C interfaces, +but they are available on most other systems as well. Here's an overview: + + +.. toctree:: + + os.rst + time.rst + optparse.rst + getopt.rst + logging.rst + getpass.rst + curses.rst + curses.ascii.rst + curses.panel.rst + platform.rst + errno.rst + ctypes.rst diff --git a/Doc/library/anydbm.rst b/Doc/library/anydbm.rst new file mode 100644 index 0000000..413b7de --- /dev/null +++ b/Doc/library/anydbm.rst @@ -0,0 +1,96 @@ + +:mod:`anydbm` --- Generic access to DBM-style databases +======================================================= + +.. module:: anydbm + :synopsis: Generic interface to DBM-style database modules. + + +.. index:: + module: dbhash + module: bsddb + module: gdbm + module: dbm + module: dumbdbm + +:mod:`anydbm` is a generic interface to variants of the DBM database --- +:mod:`dbhash` (requires :mod:`bsddb`), :mod:`gdbm`, or :mod:`dbm`. If none of +these modules is installed, the slow-but-simple implementation in module +:mod:`dumbdbm` will be used. + + +.. function:: open(filename[, flag[, mode]]) + + Open the database file *filename* and return a corresponding object. + + If the database file already exists, the :mod:`whichdb` module is used to + determine its type and the appropriate module is used; if it does not exist, the + first module listed above that can be imported is used. + + The optional *flag* argument can be ``'r'`` to open an existing database for + reading only, ``'w'`` to open an existing database for reading and writing, + ``'c'`` to create the database if it doesn't exist, or ``'n'``, which will + always create a new empty database. If not specified, the default value is + ``'r'``. + + The optional *mode* argument is the Unix mode of the file, used only when the + database has to be created. It defaults to octal ``0666`` (and will be modified + by the prevailing umask). + + +.. exception:: error + + A tuple containing the exceptions that can be raised by each of the supported + modules, with a unique exception also named :exc:`anydbm.error` as the first + item --- the latter is used when :exc:`anydbm.error` is raised. + +The object returned by :func:`open` supports most of the same functionality as +dictionaries; keys and their corresponding values can be stored, retrieved, and +deleted, and the :meth:`has_key` and :meth:`keys` methods are available. Keys +and values must always be strings. + +The following example records some hostnames and a corresponding title, and +then prints out the contents of the database:: + + import anydbm + + # Open database, creating it if necessary. + db = anydbm.open('cache', 'c') + + # Record some values + db['www.python.org'] = 'Python Website' + db['www.cnn.com'] = 'Cable News Network' + + # Loop through contents. Other dictionary methods + # such as .keys(), .values() also work. + for k, v in db.iteritems(): + print k, '\t', v + + # Storing a non-string key or value will raise an exception (most + # likely a TypeError). + db['www.yahoo.com'] = 4 + + # Close when done. + db.close() + + +.. seealso:: + + Module :mod:`dbhash` + BSD ``db`` database interface. + + Module :mod:`dbm` + Standard Unix database interface. + + Module :mod:`dumbdbm` + Portable implementation of the ``dbm`` interface. + + Module :mod:`gdbm` + GNU database interface, based on the ``dbm`` interface. + + Module :mod:`shelve` + General object persistence built on top of the Python ``dbm`` interface. + + Module :mod:`whichdb` + Utility module used to determine the type of an existing database. + diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst new file mode 100644 index 0000000..7d0df5f --- /dev/null +++ b/Doc/library/archiving.rst @@ -0,0 +1,18 @@ + +.. _archiving: + +****************************** +Data Compression and Archiving +****************************** + +The modules described in this chapter support data compression with the zlib, +gzip, and bzip2 algorithms, and the creation of ZIP- and tar-format archives. + + +.. toctree:: + + zlib.rst + gzip.rst + bz2.rst + zipfile.rst + tarfile.rst diff --git a/Doc/library/array.rst b/Doc/library/array.rst new file mode 100644 index 0000000..5194edc --- /dev/null +++ b/Doc/library/array.rst @@ -0,0 +1,272 @@ + +:mod:`array` --- Efficient arrays of numeric values +=================================================== + +.. module:: array + :synopsis: Efficient arrays of uniformly typed numeric values. + + +.. index:: single: arrays + +This module defines an object type which can efficiently represent an array of +basic values: characters, integers, floating point numbers. Arrays are sequence +types and behave very much like lists, except that the type of objects stored in +them is constrained. The type is specified at object creation time by using a +:dfn:`type code`, which is a single character. The following type codes are +defined: + ++-----------+----------------+-------------------+-----------------------+ +| Type code | C Type | Python Type | Minimum size in bytes | ++===========+================+===================+=======================+ +| ``'c'`` | char | character | 1 | ++-----------+----------------+-------------------+-----------------------+ +| ``'b'`` | signed char | int | 1 | ++-----------+----------------+-------------------+-----------------------+ +| ``'B'`` | unsigned char | int | 1 | ++-----------+----------------+-------------------+-----------------------+ +| ``'u'`` | Py_UNICODE | Unicode character | 2 | ++-----------+----------------+-------------------+-----------------------+ +| ``'h'`` | signed short | int | 2 | ++-----------+----------------+-------------------+-----------------------+ +| ``'H'`` | unsigned short | int | 2 | ++-----------+----------------+-------------------+-----------------------+ +| ``'i'`` | signed int | int | 2 | ++-----------+----------------+-------------------+-----------------------+ +| ``'I'`` | unsigned int | long | 2 | ++-----------+----------------+-------------------+-----------------------+ +| ``'l'`` | signed long | int | 4 | ++-----------+----------------+-------------------+-----------------------+ +| ``'L'`` | unsigned long | long | 4 | ++-----------+----------------+-------------------+-----------------------+ +| ``'f'`` | float | float | 4 | ++-----------+----------------+-------------------+-----------------------+ +| ``'d'`` | double | float | 8 | ++-----------+----------------+-------------------+-----------------------+ + +The actual representation of values is determined by the machine architecture +(strictly speaking, by the C implementation). The actual size can be accessed +through the :attr:`itemsize` attribute. The values stored for ``'L'`` and +``'I'`` items will be represented as Python long integers when retrieved, +because Python's plain integer type cannot represent the full range of C's +unsigned (long) integers. + +The module defines the following type: + + +.. function:: array(typecode[, initializer]) + + Return a new array whose items are restricted by *typecode*, and initialized + from the optional *initializer* value, which must be a list, string, or iterable + over elements of the appropriate type. + + .. versionchanged:: 2.4 + Formerly, only lists or strings were accepted. + + If given a list or string, the initializer is passed to the new array's + :meth:`fromlist`, :meth:`fromstring`, or :meth:`fromunicode` method (see below) + to add initial items to the array. Otherwise, the iterable initializer is + passed to the :meth:`extend` method. + + +.. data:: ArrayType + + Obsolete alias for :func:`array`. + +Array objects support the ordinary sequence operations of indexing, slicing, +concatenation, and multiplication. When using slice assignment, the assigned +value must be an array object with the same type code; in all other cases, +:exc:`TypeError` is raised. Array objects also implement the buffer interface, +and may be used wherever buffer objects are supported. + +The following data items and methods are also supported: + + +.. attribute:: array.typecode + + The typecode character used to create the array. + + +.. attribute:: array.itemsize + + The length in bytes of one array item in the internal representation. + + +.. method:: array.append(x) + + Append a new item with value *x* to the end of the array. + + +.. method:: array.buffer_info() + + Return a tuple ``(address, length)`` giving the current memory address and the + length in elements of the buffer used to hold array's contents. The size of the + memory buffer in bytes can be computed as ``array.buffer_info()[1] * + array.itemsize``. This is occasionally useful when working with low-level (and + inherently unsafe) I/O interfaces that require memory addresses, such as certain + :cfunc:`ioctl` operations. The returned numbers are valid as long as the array + exists and no length-changing operations are applied to it. + + .. note:: + + When using array objects from code written in C or C++ (the only way to + effectively make use of this information), it makes more sense to use the buffer + interface supported by array objects. This method is maintained for backward + compatibility and should be avoided in new code. The buffer interface is + documented in :ref:`bufferobjects`. + + +.. method:: array.byteswap() + + "Byteswap" all items of the array. This is only supported for values which are + 1, 2, 4, or 8 bytes in size; for other types of values, :exc:`RuntimeError` is + raised. It is useful when reading data from a file written on a machine with a + different byte order. + + +.. method:: array.count(x) + + Return the number of occurrences of *x* in the array. + + +.. method:: array.extend(iterable) + + Append items from *iterable* to the end of the array. If *iterable* is another + array, it must have *exactly* the same type code; if not, :exc:`TypeError` will + be raised. If *iterable* is not an array, it must be iterable and its elements + must be the right type to be appended to the array. + + .. versionchanged:: 2.4 + Formerly, the argument could only be another array. + + +.. method:: array.fromfile(f, n) + + Read *n* items (as machine values) from the file object *f* and append them to + the end of the array. If less than *n* items are available, :exc:`EOFError` is + raised, but the items that were available are still inserted into the array. + *f* must be a real built-in file object; something else with a :meth:`read` + method won't do. + + +.. method:: array.fromlist(list) + + Append items from the list. This is equivalent to ``for x in list: + a.append(x)`` except that if there is a type error, the array is unchanged. + + +.. method:: array.fromstring(s) + + Appends items from the string, interpreting the string as an array of machine + values (as if it had been read from a file using the :meth:`fromfile` method). + + +.. method:: array.fromunicode(s) + + Extends this array with data from the given unicode string. The array must + be a type ``'u'`` array; otherwise a :exc:`ValueError` is raised. Use + ``array.fromstring(unicodestring.encode(enc))`` to append Unicode data to an + array of some other type. + + +.. method:: array.index(x) + + Return the smallest *i* such that *i* is the index of the first occurrence of + *x* in the array. + + +.. method:: array.insert(i, x) + + Insert a new item with value *x* in the array before position *i*. Negative + values are treated as being relative to the end of the array. + + +.. method:: array.pop([i]) + + Removes the item with the index *i* from the array and returns it. The optional + argument defaults to ``-1``, so that by default the last item is removed and + returned. + + +.. method:: array.read(f, n) + + .. deprecated:: 1.5.1 + Use the :meth:`fromfile` method. + + Read *n* items (as machine values) from the file object *f* and append them to + the end of the array. If less than *n* items are available, :exc:`EOFError` is + raised, but the items that were available are still inserted into the array. + *f* must be a real built-in file object; something else with a :meth:`read` + method won't do. + + +.. method:: array.remove(x) + + Remove the first occurrence of *x* from the array. + + +.. method:: array.reverse() + + Reverse the order of the items in the array. + + +.. method:: array.tofile(f) + + Write all items (as machine values) to the file object *f*. + + +.. method:: array.tolist() + + Convert the array to an ordinary list with the same items. + + +.. method:: array.tostring() + + Convert the array to an array of machine values and return the string + representation (the same sequence of bytes that would be written to a file by + the :meth:`tofile` method.) + + +.. method:: array.tounicode() + + Convert the array to a unicode string. The array must be a type ``'u'`` array; + otherwise a :exc:`ValueError` is raised. Use ``array.tostring().decode(enc)`` to + obtain a unicode string from an array of some other type. + + +.. method:: array.write(f) + + .. deprecated:: 1.5.1 + Use the :meth:`tofile` method. + + Write all items (as machine values) to the file object *f*. + +When an array object is printed or converted to a string, it is represented as +``array(typecode, initializer)``. The *initializer* is omitted if the array is +empty, otherwise it is a string if the *typecode* is ``'c'``, otherwise it is a +list of numbers. The string is guaranteed to be able to be converted back to an +array with the same type and value using :func:`eval`, so long as the +:func:`array` function has been imported using ``from array import array``. +Examples:: + + array('l') + array('c', 'hello world') + array('u', u'hello \u2641') + array('l', [1, 2, 3, 4, 5]) + array('d', [1.0, 2.0, 3.14]) + + +.. seealso:: + + Module :mod:`struct` + Packing and unpacking of heterogeneous binary data. + + Module :mod:`xdrlib` + Packing and unpacking of External Data Representation (XDR) data as used in some + remote procedure call systems. + + `The Numerical Python Manual `_ + The Numeric Python extension (NumPy) defines another array type; see + http://numpy.sourceforge.net/ for further information about Numerical Python. + (A PDF version of the NumPy manual is available at + http://numpy.sourceforge.net/numdoc/numdoc.pdf). + diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst new file mode 100644 index 0000000..b651c40 --- /dev/null +++ b/Doc/library/asynchat.rst @@ -0,0 +1,284 @@ + +:mod:`asynchat` --- Asynchronous socket command/response handler +================================================================ + +.. module:: asynchat + :synopsis: Support for asynchronous command/response protocols. +.. moduleauthor:: Sam Rushing +.. sectionauthor:: Steve Holden + + +This module builds on the :mod:`asyncore` infrastructure, simplifying +asynchronous clients and servers and making it easier to handle protocols whose +elements are terminated by arbitrary strings, or are of variable length. +:mod:`asynchat` defines the abstract class :class:`async_chat` that you +subclass, providing implementations of the :meth:`collect_incoming_data` and +:meth:`found_terminator` methods. It uses the same asynchronous loop as +:mod:`asyncore`, and the two types of channel, :class:`asyncore.dispatcher` and +:class:`asynchat.async_chat`, can freely be mixed in the channel map. Typically +an :class:`asyncore.dispatcher` server channel generates new +:class:`asynchat.async_chat` channel objects as it receives incoming connection +requests. + + +.. class:: async_chat() + + This class is an abstract subclass of :class:`asyncore.dispatcher`. To make + practical use of the code you must subclass :class:`async_chat`, providing + meaningful :meth:`collect_incoming_data` and :meth:`found_terminator` methods. + The :class:`asyncore.dispatcher` methods can be used, although not all make + sense in a message/response context. + + Like :class:`asyncore.dispatcher`, :class:`async_chat` defines a set of events + that are generated by an analysis of socket conditions after a :cfunc:`select` + call. Once the polling loop has been started the :class:`async_chat` object's + methods are called by the event-processing framework with no action on the part + of the programmer. + + Unlike :class:`asyncore.dispatcher`, :class:`async_chat` allows you to define a + first-in-first-out queue (fifo) of *producers*. A producer need have only one + method, :meth:`more`, which should return data to be transmitted on the channel. + The producer indicates exhaustion (*i.e.* that it contains no more data) by + having its :meth:`more` method return the empty string. At this point the + :class:`async_chat` object removes the producer from the fifo and starts using + the next producer, if any. When the producer fifo is empty the + :meth:`handle_write` method does nothing. You use the channel object's + :meth:`set_terminator` method to describe how to recognize the end of, or an + important breakpoint in, an incoming transmission from the remote endpoint. + + To build a functioning :class:`async_chat` subclass your input methods + :meth:`collect_incoming_data` and :meth:`found_terminator` must handle the data + that the channel receives asynchronously. The methods are described below. + + +.. method:: async_chat.close_when_done() + + Pushes a ``None`` on to the producer fifo. When this producer is popped off the + fifo it causes the channel to be closed. + + +.. method:: async_chat.collect_incoming_data(data) + + Called with *data* holding an arbitrary amount of received data. The default + method, which must be overridden, raises a :exc:`NotImplementedError` exception. + + +.. method:: async_chat.discard_buffers() + + In emergencies this method will discard any data held in the input and/or output + buffers and the producer fifo. + + +.. method:: async_chat.found_terminator() + + Called when the incoming data stream matches the termination condition set by + :meth:`set_terminator`. The default method, which must be overridden, raises a + :exc:`NotImplementedError` exception. The buffered input data should be + available via an instance attribute. + + +.. method:: async_chat.get_terminator() + + Returns the current terminator for the channel. + + +.. method:: async_chat.handle_close() + + Called when the channel is closed. The default method silently closes the + channel's socket. + + +.. method:: async_chat.handle_read() + + Called when a read event fires on the channel's socket in the asynchronous loop. + The default method checks for the termination condition established by + :meth:`set_terminator`, which can be either the appearance of a particular + string in the input stream or the receipt of a particular number of characters. + When the terminator is found, :meth:`handle_read` calls the + :meth:`found_terminator` method after calling :meth:`collect_incoming_data` with + any data preceding the terminating condition. + + +.. method:: async_chat.handle_write() + + Called when the application may write data to the channel. The default method + calls the :meth:`initiate_send` method, which in turn will call + :meth:`refill_buffer` to collect data from the producer fifo associated with the + channel. + + +.. method:: async_chat.push(data) + + Creates a :class:`simple_producer` object (*see below*) containing the data and + pushes it on to the channel's ``producer_fifo`` to ensure its transmission. This + is all you need to do to have the channel write the data out to the network, + although it is possible to use your own producers in more complex schemes to + implement encryption and chunking, for example. + + +.. method:: async_chat.push_with_producer(producer) + + Takes a producer object and adds it to the producer fifo associated with the + channel. When all currently-pushed producers have been exhausted the channel + will consume this producer's data by calling its :meth:`more` method and send + the data to the remote endpoint. + + +.. method:: async_chat.readable() + + Should return ``True`` for the channel to be included in the set of channels + tested by the :cfunc:`select` loop for readability. + + +.. method:: async_chat.refill_buffer() + + Refills the output buffer by calling the :meth:`more` method of the producer at + the head of the fifo. If it is exhausted then the producer is popped off the + fifo and the next producer is activated. If the current producer is, or becomes, + ``None`` then the channel is closed. + + +.. method:: async_chat.set_terminator(term) + + Sets the terminating condition to be recognised on the channel. ``term`` may be + any of three types of value, corresponding to three different ways to handle + incoming protocol data. + + +-----------+---------------------------------------------+ + | term | Description | + +===========+=============================================+ + | *string* | Will call :meth:`found_terminator` when the | + | | string is found in the input stream | + +-----------+---------------------------------------------+ + | *integer* | Will call :meth:`found_terminator` when the | + | | indicated number of characters have been | + | | received | + +-----------+---------------------------------------------+ + | ``None`` | The channel continues to collect data | + | | forever | + +-----------+---------------------------------------------+ + + Note that any data following the terminator will be available for reading by the + channel after :meth:`found_terminator` is called. + + +.. method:: async_chat.writable() + + Should return ``True`` as long as items remain on the producer fifo, or the + channel is connected and the channel's output buffer is non-empty. + + +asynchat - Auxiliary Classes and Functions +------------------------------------------ + + +.. class:: simple_producer(data[, buffer_size=512]) + + A :class:`simple_producer` takes a chunk of data and an optional buffer size. + Repeated calls to its :meth:`more` method yield successive chunks of the data no + larger than *buffer_size*. + + +.. method:: simple_producer.more() + + Produces the next chunk of information from the producer, or returns the empty + string. + + +.. class:: fifo([list=None]) + + Each channel maintains a :class:`fifo` holding data which has been pushed by the + application but not yet popped for writing to the channel. A :class:`fifo` is a + list used to hold data and/or producers until they are required. If the *list* + argument is provided then it should contain producers or data items to be + written to the channel. + + +.. method:: fifo.is_empty() + + Returns ``True`` iff the fifo is empty. + + +.. method:: fifo.first() + + Returns the least-recently :meth:`push`\ ed item from the fifo. + + +.. method:: fifo.push(data) + + Adds the given data (which may be a string or a producer object) to the producer + fifo. + + +.. method:: fifo.pop() + + If the fifo is not empty, returns ``True, first()``, deleting the popped item. + Returns ``False, None`` for an empty fifo. + +The :mod:`asynchat` module also defines one utility function, which may be of +use in network and textual analysis operations. + + +.. function:: find_prefix_at_end(haystack, needle) + + Returns ``True`` if string *haystack* ends with any non-empty prefix of string + *needle*. + + +.. _asynchat-example: + +asynchat Example +---------------- + +The following partial example shows how HTTP requests can be read with +:class:`async_chat`. A web server might create an :class:`http_request_handler` +object for each incoming client connection. Notice that initially the channel +terminator is set to match the blank line at the end of the HTTP headers, and a +flag indicates that the headers are being read. + +Once the headers have been read, if the request is of type POST (indicating that +further data are present in the input stream) then the ``Content-Length:`` +header is used to set a numeric terminator to read the right amount of data from +the channel. + +The :meth:`handle_request` method is called once all relevant input has been +marshalled, after setting the channel terminator to ``None`` to ensure that any +extraneous data sent by the web client are ignored. :: + + class http_request_handler(asynchat.async_chat): + + def __init__(self, conn, addr, sessions, log): + asynchat.async_chat.__init__(self, conn=conn) + self.addr = addr + self.sessions = sessions + self.ibuffer = [] + self.obuffer = "" + self.set_terminator("\r\n\r\n") + self.reading_headers = True + self.handling = False + self.cgi_data = None + self.log = log + + def collect_incoming_data(self, data): + """Buffer the data""" + self.ibuffer.append(data) + + def found_terminator(self): + if self.reading_headers: + self.reading_headers = False + self.parse_headers("".join(self.ibuffer)) + self.ibuffer = [] + if self.op.upper() == "POST": + clen = self.headers.getheader("content-length") + self.set_terminator(int(clen)) + else: + self.handling = True + self.set_terminator(None) + self.handle_request() + elif not self.handling: + self.set_terminator(None) # browsers sometimes over-send + self.cgi_data = parse(self.headers, "".join(self.ibuffer)) + self.handling = True + self.ibuffer = [] + self.handle_request() + diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst new file mode 100644 index 0000000..7f80dd3 --- /dev/null +++ b/Doc/library/asyncore.rst @@ -0,0 +1,269 @@ + +:mod:`asyncore` --- Asynchronous socket handler +=============================================== + +.. module:: asyncore + :synopsis: A base class for developing asynchronous socket handling services. +.. moduleauthor:: Sam Rushing +.. sectionauthor:: Christopher Petrilli +.. sectionauthor:: Steve Holden + + +This module provides the basic infrastructure for writing asynchronous socket +service clients and servers. + +.. % Heavily adapted from original documentation by Sam Rushing. + +There are only two ways to have a program on a single processor do "more than +one thing at a time." Multi-threaded programming is the simplest and most +popular way to do it, but there is another very different technique, that lets +you have nearly all the advantages of multi-threading, without actually using +multiple threads. It's really only practical if your program is largely I/O +bound. If your program is processor bound, then pre-emptive scheduled threads +are probably what you really need. Network servers are rarely processor bound, +however. + +If your operating system supports the :cfunc:`select` system call in its I/O +library (and nearly all do), then you can use it to juggle multiple +communication channels at once; doing other work while your I/O is taking place +in the "background." Although this strategy can seem strange and complex, +especially at first, it is in many ways easier to understand and control than +multi-threaded programming. The :mod:`asyncore` module solves many of the +difficult problems for you, making the task of building sophisticated +high-performance network servers and clients a snap. For "conversational" +applications and protocols the companion :mod:`asynchat` module is invaluable. + +The basic idea behind both modules is to create one or more network *channels*, +instances of class :class:`asyncore.dispatcher` and +:class:`asynchat.async_chat`. Creating the channels adds them to a global map, +used by the :func:`loop` function if you do not provide it with your own *map*. + +Once the initial channel(s) is(are) created, calling the :func:`loop` function +activates channel service, which continues until the last channel (including any +that have been added to the map during asynchronous service) is closed. + + +.. function:: loop([timeout[, use_poll[, map[,count]]]]) + + Enter a polling loop that terminates after count passes or all open channels + have been closed. All arguments are optional. The *count* parameter defaults + to None, resulting in the loop terminating only when all channels have been + closed. The *timeout* argument sets the timeout parameter for the appropriate + :func:`select` or :func:`poll` call, measured in seconds; the default is 30 + seconds. The *use_poll* parameter, if true, indicates that :func:`poll` should + be used in preference to :func:`select` (the default is ``False``). + + The *map* parameter is a dictionary whose items are the channels to watch. As + channels are closed they are deleted from their map. If *map* is omitted, a + global map is used. Channels (instances of :class:`asyncore.dispatcher`, + :class:`asynchat.async_chat` and subclasses thereof) can freely be mixed in the + map. + + +.. class:: dispatcher() + + The :class:`dispatcher` class is a thin wrapper around a low-level socket + object. To make it more useful, it has a few methods for event-handling which + are called from the asynchronous loop. Otherwise, it can be treated as a + normal non-blocking socket object. + + Two class attributes can be modified, to improve performance, or possibly even + to conserve memory. + + + .. data:: ac_in_buffer_size + + The asynchronous input buffer size (default ``4096``). + + + .. data:: ac_out_buffer_size + + The asynchronous output buffer size (default ``4096``). + + The firing of low-level events at certain times or in certain connection states + tells the asynchronous loop that certain higher-level events have taken place. + For example, if we have asked for a socket to connect to another host, we know + that the connection has been made when the socket becomes writable for the first + time (at this point you know that you may write to it with the expectation of + success). The implied higher-level events are: + + +----------------------+----------------------------------------+ + | Event | Description | + +======================+========================================+ + | ``handle_connect()`` | Implied by the first write event | + +----------------------+----------------------------------------+ + | ``handle_close()`` | Implied by a read event with no data | + | | available | + +----------------------+----------------------------------------+ + | ``handle_accept()`` | Implied by a read event on a listening | + | | socket | + +----------------------+----------------------------------------+ + + During asynchronous processing, each mapped channel's :meth:`readable` and + :meth:`writable` methods are used to determine whether the channel's socket + should be added to the list of channels :cfunc:`select`\ ed or :cfunc:`poll`\ ed + for read and write events. + +Thus, the set of channel events is larger than the basic socket events. The full +set of methods that can be overridden in your subclass follows: + + +.. method:: dispatcher.handle_read() + + Called when the asynchronous loop detects that a :meth:`read` call on the + channel's socket will succeed. + + +.. method:: dispatcher.handle_write() + + Called when the asynchronous loop detects that a writable socket can be written. + Often this method will implement the necessary buffering for performance. For + example:: + + def handle_write(self): + sent = self.send(self.buffer) + self.buffer = self.buffer[sent:] + + +.. method:: dispatcher.handle_expt() + + Called when there is out of band (OOB) data for a socket connection. This will + almost never happen, as OOB is tenuously supported and rarely used. + + +.. method:: dispatcher.handle_connect() + + Called when the active opener's socket actually makes a connection. Might send a + "welcome" banner, or initiate a protocol negotiation with the remote endpoint, + for example. + + +.. method:: dispatcher.handle_close() + + Called when the socket is closed. + + +.. method:: dispatcher.handle_error() + + Called when an exception is raised and not otherwise handled. The default + version prints a condensed traceback. + + +.. method:: dispatcher.handle_accept() + + Called on listening channels (passive openers) when a connection can be + established with a new remote endpoint that has issued a :meth:`connect` call + for the local endpoint. + + +.. method:: dispatcher.readable() + + Called each time around the asynchronous loop to determine whether a channel's + socket should be added to the list on which read events can occur. The default + method simply returns ``True``, indicating that by default, all channels will + be interested in read events. + + +.. method:: dispatcher.writable() + + Called each time around the asynchronous loop to determine whether a channel's + socket should be added to the list on which write events can occur. The default + method simply returns ``True``, indicating that by default, all channels will + be interested in write events. + +In addition, each channel delegates or extends many of the socket methods. Most +of these are nearly identical to their socket partners. + + +.. method:: dispatcher.create_socket(family, type) + + This is identical to the creation of a normal socket, and will use the same + options for creation. Refer to the :mod:`socket` documentation for information + on creating sockets. + + +.. method:: dispatcher.connect(address) + + As with the normal socket object, *address* is a tuple with the first element + the host to connect to, and the second the port number. + + +.. method:: dispatcher.send(data) + + Send *data* to the remote end-point of the socket. + + +.. method:: dispatcher.recv(buffer_size) + + Read at most *buffer_size* bytes from the socket's remote end-point. An empty + string implies that the channel has been closed from the other end. + + +.. method:: dispatcher.listen(backlog) + + Listen for connections made to the socket. The *backlog* argument specifies the + maximum number of queued connections and should be at least 1; the maximum value + is system-dependent (usually 5). + + +.. method:: dispatcher.bind(address) + + Bind the socket to *address*. The socket must not already be bound. (The + format of *address* depends on the address family --- see above.) To mark the + socket as re-usable (setting the :const:`SO_REUSEADDR` option), call the + :class:`dispatcher` object's :meth:`set_reuse_addr` method. + + +.. method:: dispatcher.accept() + + Accept a connection. The socket must be bound to an address and listening for + connections. The return value is a pair ``(conn, address)`` where *conn* is a + *new* socket object usable to send and receive data on the connection, and + *address* is the address bound to the socket on the other end of the connection. + + +.. method:: dispatcher.close() + + Close the socket. All future operations on the socket object will fail. The + remote end-point will receive no more data (after queued data is flushed). + Sockets are automatically closed when they are garbage-collected. + + +.. _asyncore-example: + +asyncore Example basic HTTP client +---------------------------------- + +Here is a very basic HTTP client that uses the :class:`dispatcher` class to +implement its socket handling:: + + import asyncore, socket + + class http_client(asyncore.dispatcher): + + def __init__(self, host, path): + asyncore.dispatcher.__init__(self) + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect( (host, 80) ) + self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path + + def handle_connect(self): + pass + + def handle_close(self): + self.close() + + def handle_read(self): + print self.recv(8192) + + def writable(self): + return (len(self.buffer) > 0) + + def handle_write(self): + sent = self.send(self.buffer) + self.buffer = self.buffer[sent:] + + c = http_client('www.python.org', '/') + + asyncore.loop() + diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst new file mode 100644 index 0000000..94d750b --- /dev/null +++ b/Doc/library/atexit.rst @@ -0,0 +1,105 @@ + +:mod:`atexit` --- Exit handlers +=============================== + +.. module:: atexit + :synopsis: Register and execute cleanup functions. +.. moduleauthor:: Skip Montanaro +.. sectionauthor:: Skip Montanaro + + +.. versionadded:: 2.0 + +The :mod:`atexit` module defines functions to register and unregister cleanup +functions. Functions thus registered are automatically executed upon normal +interpreter termination. + +Note: the functions registered via this module are not called when the program +is killed by a signal, when a Python fatal internal error is detected, or when +:func:`os._exit` is called. + + +.. function:: register(func[, *args[, **kargs]]) + + Register *func* as a function to be executed at termination. Any optional + arguments that are to be passed to *func* must be passed as arguments to + :func:`register`. + + At normal program termination (for instance, if :func:`sys.exit` is called or + the main module's execution completes), all functions registered are called in + last in, first out order. The assumption is that lower level modules will + normally be imported before higher level modules and thus must be cleaned up + later. + + If an exception is raised during execution of the exit handlers, a traceback is + printed (unless :exc:`SystemExit` is raised) and the exception information is + saved. After all exit handlers have had a chance to run the last exception to + be raised is re-raised. + + .. versionchanged:: 2.6 + This function now returns *func* which makes it possible to use it as a + decorator without binding the original name to ``None``. + + +.. function:: unregister(func) + + Remove a function *func* from the list of functions to be run at interpreter- + shutdown. After calling :func:`unregister`, *func* is guaranteed not to be + called when the interpreter shuts down. + + .. versionadded:: 3.0 + + +.. seealso:: + + Module :mod:`readline` + Useful example of :mod:`atexit` to read and write :mod:`readline` history files. + + +.. _atexit-example: + +:mod:`atexit` Example +--------------------- + +The following simple example demonstrates how a module can initialize a counter +from a file when it is imported and save the counter's updated value +automatically when the program terminates without relying on the application +making an explicit call into this module at termination. :: + + try: + _count = int(open("/tmp/counter").read()) + except IOError: + _count = 0 + + def incrcounter(n): + global _count + _count = _count + n + + def savecounter(): + open("/tmp/counter", "w").write("%d" % _count) + + import atexit + atexit.register(savecounter) + +Positional and keyword arguments may also be passed to :func:`register` to be +passed along to the registered function when it is called:: + + def goodbye(name, adjective): + print 'Goodbye, %s, it was %s to meet you.' % (name, adjective) + + import atexit + atexit.register(goodbye, 'Donny', 'nice') + + # or: + atexit.register(goodbye, adjective='nice', name='Donny') + +Usage as a decorator:: + + import atexit + + @atexit.register + def goodbye(): + print "You are now leaving the Python sector." + +This obviously only works with functions that don't take arguments. + diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst new file mode 100644 index 0000000..84a2690 --- /dev/null +++ b/Doc/library/audioop.rst @@ -0,0 +1,261 @@ + +:mod:`audioop` --- Manipulate raw audio data +============================================ + +.. module:: audioop + :synopsis: Manipulate raw audio data. + + +The :mod:`audioop` module contains some useful operations on sound fragments. +It operates on sound fragments consisting of signed integer samples 8, 16 or 32 +bits wide, stored in Python strings. All scalar items are integers, unless +specified otherwise. + +.. index:: + single: Intel/DVI ADPCM + single: ADPCM, Intel/DVI + single: a-LAW + single: u-LAW + +This module provides support for a-LAW, u-LAW and Intel/DVI ADPCM encodings. + +.. % This para is mostly here to provide an excuse for the index entries... + +A few of the more complicated operations only take 16-bit samples, otherwise the +sample size (in bytes) is always a parameter of the operation. + +The module defines the following variables and functions: + + +.. exception:: error + + This exception is raised on all errors, such as unknown number of bytes per + sample, etc. + + +.. function:: add(fragment1, fragment2, width) + + Return a fragment which is the addition of the two samples passed as parameters. + *width* is the sample width in bytes, either ``1``, ``2`` or ``4``. Both + fragments should have the same length. + + +.. function:: adpcm2lin(adpcmfragment, width, state) + + Decode an Intel/DVI ADPCM coded fragment to a linear fragment. See the + description of :func:`lin2adpcm` for details on ADPCM coding. Return a tuple + ``(sample, newstate)`` where the sample has the width specified in *width*. + + +.. function:: alaw2lin(fragment, width) + + Convert sound fragments in a-LAW encoding to linearly encoded sound fragments. + a-LAW encoding always uses 8 bits samples, so *width* refers only to the sample + width of the output fragment here. + + .. versionadded:: 2.5 + + +.. function:: avg(fragment, width) + + Return the average over all samples in the fragment. + + +.. function:: avgpp(fragment, width) + + Return the average peak-peak value over all samples in the fragment. No + filtering is done, so the usefulness of this routine is questionable. + + +.. function:: bias(fragment, width, bias) + + Return a fragment that is the original fragment with a bias added to each + sample. + + +.. function:: cross(fragment, width) + + Return the number of zero crossings in the fragment passed as an argument. + + +.. function:: findfactor(fragment, reference) + + Return a factor *F* such that ``rms(add(fragment, mul(reference, -F)))`` is + minimal, i.e., return the factor with which you should multiply *reference* to + make it match as well as possible to *fragment*. The fragments should both + contain 2-byte samples. + + The time taken by this routine is proportional to ``len(fragment)``. + + +.. function:: findfit(fragment, reference) + + Try to match *reference* as well as possible to a portion of *fragment* (which + should be the longer fragment). This is (conceptually) done by taking slices + out of *fragment*, using :func:`findfactor` to compute the best match, and + minimizing the result. The fragments should both contain 2-byte samples. + Return a tuple ``(offset, factor)`` where *offset* is the (integer) offset into + *fragment* where the optimal match started and *factor* is the (floating-point) + factor as per :func:`findfactor`. + + +.. function:: findmax(fragment, length) + + Search *fragment* for a slice of length *length* samples (not bytes!) with + maximum energy, i.e., return *i* for which ``rms(fragment[i*2:(i+length)*2])`` + is maximal. The fragments should both contain 2-byte samples. + + The routine takes time proportional to ``len(fragment)``. + + +.. function:: getsample(fragment, width, index) + + Return the value of sample *index* from the fragment. + + +.. function:: lin2adpcm(fragment, width, state) + + Convert samples to 4 bit Intel/DVI ADPCM encoding. ADPCM coding is an adaptive + coding scheme, whereby each 4 bit number is the difference between one sample + and the next, divided by a (varying) step. The Intel/DVI ADPCM algorithm has + been selected for use by the IMA, so it may well become a standard. + + *state* is a tuple containing the state of the coder. The coder returns a tuple + ``(adpcmfrag, newstate)``, and the *newstate* should be passed to the next call + of :func:`lin2adpcm`. In the initial call, ``None`` can be passed as the state. + *adpcmfrag* is the ADPCM coded fragment packed 2 4-bit values per byte. + + +.. function:: lin2alaw(fragment, width) + + Convert samples in the audio fragment to a-LAW encoding and return this as a + Python string. a-LAW is an audio encoding format whereby you get a dynamic + range of about 13 bits using only 8 bit samples. It is used by the Sun audio + hardware, among others. + + .. versionadded:: 2.5 + + +.. function:: lin2lin(fragment, width, newwidth) + + Convert samples between 1-, 2- and 4-byte formats. + + +.. function:: lin2ulaw(fragment, width) + + Convert samples in the audio fragment to u-LAW encoding and return this as a + Python string. u-LAW is an audio encoding format whereby you get a dynamic + range of about 14 bits using only 8 bit samples. It is used by the Sun audio + hardware, among others. + + +.. function:: minmax(fragment, width) + + Return a tuple consisting of the minimum and maximum values of all samples in + the sound fragment. + + +.. function:: max(fragment, width) + + Return the maximum of the *absolute value* of all samples in a fragment. + + +.. function:: maxpp(fragment, width) + + Return the maximum peak-peak value in the sound fragment. + + +.. function:: mul(fragment, width, factor) + + Return a fragment that has all samples in the original fragment multiplied by + the floating-point value *factor*. Overflow is silently ignored. + + +.. function:: ratecv(fragment, width, nchannels, inrate, outrate, state[, weightA[, weightB]]) + + Convert the frame rate of the input fragment. + + *state* is a tuple containing the state of the converter. The converter returns + a tuple ``(newfragment, newstate)``, and *newstate* should be passed to the next + call of :func:`ratecv`. The initial call should pass ``None`` as the state. + + The *weightA* and *weightB* arguments are parameters for a simple digital filter + and default to ``1`` and ``0`` respectively. + + +.. function:: reverse(fragment, width) + + Reverse the samples in a fragment and returns the modified fragment. + + +.. function:: rms(fragment, width) + + Return the root-mean-square of the fragment, i.e. ``sqrt(sum(S_i^2)/n)``. + + This is a measure of the power in an audio signal. + + +.. function:: tomono(fragment, width, lfactor, rfactor) + + Convert a stereo fragment to a mono fragment. The left channel is multiplied by + *lfactor* and the right channel by *rfactor* before adding the two channels to + give a mono signal. + + +.. function:: tostereo(fragment, width, lfactor, rfactor) + + Generate a stereo fragment from a mono fragment. Each pair of samples in the + stereo fragment are computed from the mono sample, whereby left channel samples + are multiplied by *lfactor* and right channel samples by *rfactor*. + + +.. function:: ulaw2lin(fragment, width) + + Convert sound fragments in u-LAW encoding to linearly encoded sound fragments. + u-LAW encoding always uses 8 bits samples, so *width* refers only to the sample + width of the output fragment here. + +Note that operations such as :func:`mul` or :func:`max` make no distinction +between mono and stereo fragments, i.e. all samples are treated equal. If this +is a problem the stereo fragment should be split into two mono fragments first +and recombined later. Here is an example of how to do that:: + + def mul_stereo(sample, width, lfactor, rfactor): + lsample = audioop.tomono(sample, width, 1, 0) + rsample = audioop.tomono(sample, width, 0, 1) + lsample = audioop.mul(sample, width, lfactor) + rsample = audioop.mul(sample, width, rfactor) + lsample = audioop.tostereo(lsample, width, 1, 0) + rsample = audioop.tostereo(rsample, width, 0, 1) + return audioop.add(lsample, rsample, width) + +If you use the ADPCM coder to build network packets and you want your protocol +to be stateless (i.e. to be able to tolerate packet loss) you should not only +transmit the data but also the state. Note that you should send the *initial* +state (the one you passed to :func:`lin2adpcm`) along to the decoder, not the +final state (as returned by the coder). If you want to use +:func:`struct.struct` to store the state in binary you can code the first +element (the predicted value) in 16 bits and the second (the delta index) in 8. + +The ADPCM coders have never been tried against other ADPCM coders, only against +themselves. It could well be that I misinterpreted the standards in which case +they will not be interoperable with the respective standards. + +The :func:`find\*` routines might look a bit funny at first sight. They are +primarily meant to do echo cancellation. A reasonably fast way to do this is to +pick the most energetic piece of the output sample, locate that in the input +sample and subtract the whole output sample from the input sample:: + + def echocancel(outputdata, inputdata): + pos = audioop.findmax(outputdata, 800) # one tenth second + out_test = outputdata[pos*2:] + in_test = inputdata[pos*2:] + ipos, factor = audioop.findfit(in_test, out_test) + # Optional (for better cancellation): + # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)], + # out_test) + prefill = '\0'*(pos+ipos)*2 + postfill = '\0'*(len(inputdata)-len(prefill)-len(outputdata)) + outputdata = prefill + audioop.mul(outputdata,2,-factor) + postfill + return audioop.add(inputdata, outputdata, 2) + diff --git a/Doc/library/autogil.rst b/Doc/library/autogil.rst new file mode 100644 index 0000000..93f0d04 --- /dev/null +++ b/Doc/library/autogil.rst @@ -0,0 +1,30 @@ + +:mod:`autoGIL` --- Global Interpreter Lock handling in event loops +================================================================== + +.. module:: autoGIL + :platform: Mac + :synopsis: Global Interpreter Lock handling in event loops. +.. moduleauthor:: Just van Rossum + + +The :mod:`autoGIL` module provides a function :func:`installAutoGIL` that +automatically locks and unlocks Python's Global Interpreter Lock when running an +event loop. + + +.. exception:: AutoGILError + + Raised if the observer callback cannot be installed, for example because the + current thread does not have a run loop. + + +.. function:: installAutoGIL() + + Install an observer callback in the event loop (CFRunLoop) for the current + thread, that will lock and unlock the Global Interpreter Lock (GIL) at + appropriate times, allowing other Python threads to run while the event loop is + idle. + + Availability: OSX 10.1 or later. + diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst new file mode 100644 index 0000000..daa8fd5 --- /dev/null +++ b/Doc/library/base64.rst @@ -0,0 +1,172 @@ + +:mod:`base64` --- RFC 3548: Base16, Base32, Base64 Data Encodings +================================================================= + +.. module:: base64 + :synopsis: RFC 3548: Base16, Base32, Base64 Data Encodings + + +.. index:: + pair: base64; encoding + single: MIME; base64 encoding + +This module provides data encoding and decoding as specified in :rfc:`3548`. +This standard defines the Base16, Base32, and Base64 algorithms for encoding and +decoding arbitrary binary strings into text strings that can be safely sent by +email, used as parts of URLs, or included as part of an HTTP POST request. The +encoding algorithm is not the same as the :program:`uuencode` program. + +There are two interfaces provided by this module. The modern interface supports +encoding and decoding string objects using all three alphabets. The legacy +interface provides for encoding and decoding to and from file-like objects as +well as strings, but only using the Base64 standard alphabet. + +The modern interface, which was introduced in Python 2.4, provides: + + +.. function:: b64encode(s[, altchars]) + + Encode a string use Base64. + + *s* is the string to encode. Optional *altchars* must be a string of at least + length 2 (additional characters are ignored) which specifies an alternative + alphabet for the ``+`` and ``/`` characters. This allows an application to e.g. + generate URL or filesystem safe Base64 strings. The default is ``None``, for + which the standard Base64 alphabet is used. + + The encoded string is returned. + + +.. function:: b64decode(s[, altchars]) + + Decode a Base64 encoded string. + + *s* is the string to decode. Optional *altchars* must be a string of at least + length 2 (additional characters are ignored) which specifies the alternative + alphabet used instead of the ``+`` and ``/`` characters. + + The decoded string is returned. A :exc:`TypeError` is raised if *s* were + incorrectly padded or if there are non-alphabet characters present in the + string. + + +.. function:: standard_b64encode(s) + + Encode string *s* using the standard Base64 alphabet. + + +.. function:: standard_b64decode(s) + + Decode string *s* using the standard Base64 alphabet. + + +.. function:: urlsafe_b64encode(s) + + Encode string *s* using a URL-safe alphabet, which substitutes ``-`` instead of + ``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet. + + +.. function:: urlsafe_b64decode(s) + + Decode string *s* using a URL-safe alphabet, which substitutes ``-`` instead of + ``+`` and ``_`` instead of ``/`` in the standard Base64 alphabet. + + +.. function:: b32encode(s) + + Encode a string using Base32. *s* is the string to encode. The encoded string + is returned. + + +.. function:: b32decode(s[, casefold[, map01]]) + + Decode a Base32 encoded string. + + *s* is the string to decode. Optional *casefold* is a flag specifying whether a + lowercase alphabet is acceptable as input. For security purposes, the default + is ``False``. + + :rfc:`3548` allows for optional mapping of the digit 0 (zero) to the letter O + (oh), and for optional mapping of the digit 1 (one) to either the letter I (eye) + or letter L (el). The optional argument *map01* when not ``None``, specifies + which letter the digit 1 should be mapped to (when *map01* is not ``None``, the + digit 0 is always mapped to the letter O). For security purposes the default is + ``None``, so that 0 and 1 are not allowed in the input. + + The decoded string is returned. A :exc:`TypeError` is raised if *s* were + incorrectly padded or if there are non-alphabet characters present in the + string. + + +.. function:: b16encode(s) + + Encode a string using Base16. + + *s* is the string to encode. The encoded string is returned. + + +.. function:: b16decode(s[, casefold]) + + Decode a Base16 encoded string. + + *s* is the string to decode. Optional *casefold* is a flag specifying whether a + lowercase alphabet is acceptable as input. For security purposes, the default + is ``False``. + + The decoded string is returned. A :exc:`TypeError` is raised if *s* were + incorrectly padded or if there are non-alphabet characters present in the + string. + +The legacy interface: + + +.. function:: decode(input, output) + + Decode the contents of the *input* file and write the resulting binary data to + the *output* file. *input* and *output* must either be file objects or objects + that mimic the file object interface. *input* will be read until + ``input.read()`` returns an empty string. + + +.. function:: decodestring(s) + + Decode the string *s*, which must contain one or more lines of base64 encoded + data, and return a string containing the resulting binary data. + + +.. function:: encode(input, output) + + Encode the contents of the *input* file and write the resulting base64 encoded + data to the *output* file. *input* and *output* must either be file objects or + objects that mimic the file object interface. *input* will be read until + ``input.read()`` returns an empty string. :func:`encode` returns the encoded + data plus a trailing newline character (``'\n'``). + + +.. function:: encodestring(s) + + Encode the string *s*, which can contain arbitrary binary data, and return a + string containing one or more lines of base64-encoded data. + :func:`encodestring` returns a string containing one or more lines of + base64-encoded data always including an extra trailing newline (``'\n'``). + +An example usage of the module:: + + >>> import base64 + >>> encoded = base64.b64encode('data to be encoded') + >>> encoded + 'ZGF0YSB0byBiZSBlbmNvZGVk' + >>> data = base64.b64decode(encoded) + >>> data + 'data to be encoded' + + +.. seealso:: + + Module :mod:`binascii` + Support module containing ASCII-to-binary and binary-to-ASCII conversions. + + :rfc:`1521` - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies + Section 5.2, "Base64 Content-Transfer-Encoding," provides the definition of the + base64 encoding. + diff --git a/Doc/library/basehttpserver.rst b/Doc/library/basehttpserver.rst new file mode 100644 index 0000000..2e8d6a3 --- /dev/null +++ b/Doc/library/basehttpserver.rst @@ -0,0 +1,254 @@ + +:mod:`BaseHTTPServer` --- Basic HTTP server +=========================================== + +.. module:: BaseHTTPServer + :synopsis: Basic HTTP server (base class for SimpleHTTPServer and CGIHTTPServer). + + +.. index:: + pair: WWW; server + pair: HTTP; protocol + single: URL + single: httpd + +.. index:: + module: SimpleHTTPServer + module: CGIHTTPServer + +This module defines two classes for implementing HTTP servers (Web servers). +Usually, this module isn't used directly, but is used as a basis for building +functioning Web servers. See the :mod:`SimpleHTTPServer` and +:mod:`CGIHTTPServer` modules. + +The first class, :class:`HTTPServer`, is a :class:`SocketServer.TCPServer` +subclass. It creates and listens at the HTTP socket, dispatching the requests +to a handler. Code to create and run the server looks like this:: + + def run(server_class=BaseHTTPServer.HTTPServer, + handler_class=BaseHTTPServer.BaseHTTPRequestHandler): + server_address = ('', 8000) + httpd = server_class(server_address, handler_class) + httpd.serve_forever() + + +.. class:: HTTPServer(server_address, RequestHandlerClass) + + This class builds on the :class:`TCPServer` class by storing the server address + as instance variables named :attr:`server_name` and :attr:`server_port`. The + server is accessible by the handler, typically through the handler's + :attr:`server` instance variable. + + +.. class:: BaseHTTPRequestHandler(request, client_address, server) + + This class is used to handle the HTTP requests that arrive at the server. By + itself, it cannot respond to any actual HTTP requests; it must be subclassed to + handle each request method (e.g. GET or POST). :class:`BaseHTTPRequestHandler` + provides a number of class and instance variables, and methods for use by + subclasses. + + The handler will parse the request and the headers, then call a method specific + to the request type. The method name is constructed from the request. For + example, for the request method ``SPAM``, the :meth:`do_SPAM` method will be + called with no arguments. All of the relevant information is stored in instance + variables of the handler. Subclasses should not need to override or extend the + :meth:`__init__` method. + +:class:`BaseHTTPRequestHandler` has the following instance variables: + + +.. attribute:: BaseHTTPRequestHandler.client_address + + Contains a tuple of the form ``(host, port)`` referring to the client's address. + + +.. attribute:: BaseHTTPRequestHandler.command + + Contains the command (request type). For example, ``'GET'``. + + +.. attribute:: BaseHTTPRequestHandler.path + + Contains the request path. + + +.. attribute:: BaseHTTPRequestHandler.request_version + + Contains the version string from the request. For example, ``'HTTP/1.0'``. + + +.. attribute:: BaseHTTPRequestHandler.headers + + Holds an instance of the class specified by the :attr:`MessageClass` class + variable. This instance parses and manages the headers in the HTTP request. + + +.. attribute:: BaseHTTPRequestHandler.rfile + + Contains an input stream, positioned at the start of the optional input data. + + +.. attribute:: BaseHTTPRequestHandler.wfile + + Contains the output stream for writing a response back to the client. Proper + adherence to the HTTP protocol must be used when writing to this stream. + +:class:`BaseHTTPRequestHandler` has the following class variables: + + +.. attribute:: BaseHTTPRequestHandler.server_version + + Specifies the server software version. You may want to override this. The + format is multiple whitespace-separated strings, where each string is of the + form name[/version]. For example, ``'BaseHTTP/0.2'``. + + +.. attribute:: BaseHTTPRequestHandler.sys_version + + Contains the Python system version, in a form usable by the + :attr:`version_string` method and the :attr:`server_version` class variable. For + example, ``'Python/1.4'``. + + +.. attribute:: BaseHTTPRequestHandler.error_message_format + + Specifies a format string for building an error response to the client. It uses + parenthesized, keyed format specifiers, so the format operand must be a + dictionary. The *code* key should be an integer, specifying the numeric HTTP + error code value. *message* should be a string containing a (detailed) error + message of what occurred, and *explain* should be an explanation of the error + code number. Default *message* and *explain* values can found in the *responses* + class variable. + + +.. attribute:: BaseHTTPRequestHandler.protocol_version + + This specifies the HTTP protocol version used in responses. If set to + ``'HTTP/1.1'``, the server will permit HTTP persistent connections; however, + your server *must* then include an accurate ``Content-Length`` header (using + :meth:`send_header`) in all of its responses to clients. For backwards + compatibility, the setting defaults to ``'HTTP/1.0'``. + + +.. attribute:: BaseHTTPRequestHandler.MessageClass + + .. index:: single: Message (in module mimetools) + + Specifies a :class:`rfc822.Message`\ -like class to parse HTTP headers. + Typically, this is not overridden, and it defaults to + :class:`mimetools.Message`. + + +.. attribute:: BaseHTTPRequestHandler.responses + + This variable contains a mapping of error code integers to two-element tuples + containing a short and long message. For example, ``{code: (shortmessage, + longmessage)}``. The *shortmessage* is usually used as the *message* key in an + error response, and *longmessage* as the *explain* key (see the + :attr:`error_message_format` class variable). + +A :class:`BaseHTTPRequestHandler` instance has the following methods: + + +.. method:: BaseHTTPRequestHandler.handle() + + Calls :meth:`handle_one_request` once (or, if persistent connections are + enabled, multiple times) to handle incoming HTTP requests. You should never need + to override it; instead, implement appropriate :meth:`do_\*` methods. + + +.. method:: BaseHTTPRequestHandler.handle_one_request() + + This method will parse and dispatch the request to the appropriate :meth:`do_\*` + method. You should never need to override it. + + +.. method:: BaseHTTPRequestHandler.send_error(code[, message]) + + Sends and logs a complete error reply to the client. The numeric *code* + specifies the HTTP error code, with *message* as optional, more specific text. A + complete set of headers is sent, followed by text composed using the + :attr:`error_message_format` class variable. + + +.. method:: BaseHTTPRequestHandler.send_response(code[, message]) + + Sends a response header and logs the accepted request. The HTTP response line is + sent, followed by *Server* and *Date* headers. The values for these two headers + are picked up from the :meth:`version_string` and :meth:`date_time_string` + methods, respectively. + + +.. method:: BaseHTTPRequestHandler.send_header(keyword, value) + + Writes a specific HTTP header to the output stream. *keyword* should specify the + header keyword, with *value* specifying its value. + + +.. method:: BaseHTTPRequestHandler.end_headers() + + Sends a blank line, indicating the end of the HTTP headers in the response. + + +.. method:: BaseHTTPRequestHandler.log_request([code[, size]]) + + Logs an accepted (successful) request. *code* should specify the numeric HTTP + code associated with the response. If a size of the response is available, then + it should be passed as the *size* parameter. + + +.. method:: BaseHTTPRequestHandler.log_error(...) + + Logs an error when a request cannot be fulfilled. By default, it passes the + message to :meth:`log_message`, so it takes the same arguments (*format* and + additional values). + + +.. method:: BaseHTTPRequestHandler.log_message(format, ...) + + Logs an arbitrary message to ``sys.stderr``. This is typically overridden to + create custom error logging mechanisms. The *format* argument is a standard + printf-style format string, where the additional arguments to + :meth:`log_message` are applied as inputs to the formatting. The client address + and current date and time are prefixed to every message logged. + + +.. method:: BaseHTTPRequestHandler.version_string() + + Returns the server software's version string. This is a combination of the + :attr:`server_version` and :attr:`sys_version` class variables. + + +.. method:: BaseHTTPRequestHandler.date_time_string([timestamp]) + + Returns the date and time given by *timestamp* (which must be in the format + returned by :func:`time.time`), formatted for a message header. If *timestamp* + is omitted, it uses the current date and time. + + The result looks like ``'Sun, 06 Nov 1994 08:49:37 GMT'``. + + .. versionadded:: 2.5 + The *timestamp* parameter. + + +.. method:: BaseHTTPRequestHandler.log_date_time_string() + + Returns the current date and time, formatted for logging. + + +.. method:: BaseHTTPRequestHandler.address_string() + + Returns the client address, formatted for logging. A name lookup is performed on + the client's IP address. + + +.. seealso:: + + Module :mod:`CGIHTTPServer` + Extended request handler that supports CGI scripts. + + Module :mod:`SimpleHTTPServer` + Basic request handler that limits response to files actually under the document + root. + diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst new file mode 100644 index 0000000..ffea232 --- /dev/null +++ b/Doc/library/binascii.rst @@ -0,0 +1,161 @@ + +:mod:`binascii` --- Convert between binary and ASCII +==================================================== + +.. module:: binascii + :synopsis: Tools for converting between binary and various ASCII-encoded binary + representations. + + +.. index:: + module: uu + module: base64 + module: binhex + +The :mod:`binascii` module contains a number of methods to convert between +binary and various ASCII-encoded binary representations. Normally, you will not +use these functions directly but use wrapper modules like :mod:`uu`, +:mod:`base64`, or :mod:`binhex` instead. The :mod:`binascii` module contains +low-level functions written in C for greater speed that are used by the +higher-level modules. + +The :mod:`binascii` module defines the following functions: + + +.. function:: a2b_uu(string) + + Convert a single line of uuencoded data back to binary and return the binary + data. Lines normally contain 45 (binary) bytes, except for the last line. Line + data may be followed by whitespace. + + +.. function:: b2a_uu(data) + + Convert binary data to a line of ASCII characters, the return value is the + converted line, including a newline char. The length of *data* should be at most + 45. + + +.. function:: a2b_base64(string) + + Convert a block of base64 data back to binary and return the binary data. More + than one line may be passed at a time. + + +.. function:: b2a_base64(data) + + Convert binary data to a line of ASCII characters in base64 coding. The return + value is the converted line, including a newline char. The length of *data* + should be at most 57 to adhere to the base64 standard. + + +.. function:: a2b_qp(string[, header]) + + Convert a block of quoted-printable data back to binary and return the binary + data. More than one line may be passed at a time. If the optional argument + *header* is present and true, underscores will be decoded as spaces. + + +.. function:: b2a_qp(data[, quotetabs, istext, header]) + + Convert binary data to a line(s) of ASCII characters in quoted-printable + encoding. The return value is the converted line(s). If the optional argument + *quotetabs* is present and true, all tabs and spaces will be encoded. If the + optional argument *istext* is present and true, newlines are not encoded but + trailing whitespace will be encoded. If the optional argument *header* is + present and true, spaces will be encoded as underscores per RFC1522. If the + optional argument *header* is present and false, newline characters will be + encoded as well; otherwise linefeed conversion might corrupt the binary data + stream. + + +.. function:: a2b_hqx(string) + + Convert binhex4 formatted ASCII data to binary, without doing RLE-decompression. + The string should contain a complete number of binary bytes, or (in case of the + last portion of the binhex4 data) have the remaining bits zero. + + +.. function:: rledecode_hqx(data) + + Perform RLE-decompression on the data, as per the binhex4 standard. The + algorithm uses ``0x90`` after a byte as a repeat indicator, followed by a count. + A count of ``0`` specifies a byte value of ``0x90``. The routine returns the + decompressed data, unless data input data ends in an orphaned repeat indicator, + in which case the :exc:`Incomplete` exception is raised. + + +.. function:: rlecode_hqx(data) + + Perform binhex4 style RLE-compression on *data* and return the result. + + +.. function:: b2a_hqx(data) + + Perform hexbin4 binary-to-ASCII translation and return the resulting string. The + argument should already be RLE-coded, and have a length divisible by 3 (except + possibly the last fragment). + + +.. function:: crc_hqx(data, crc) + + Compute the binhex4 crc value of *data*, starting with an initial *crc* and + returning the result. + + +.. function:: crc32(data[, crc]) + + Compute CRC-32, the 32-bit checksum of data, starting with an initial crc. This + is consistent with the ZIP file checksum. Since the algorithm is designed for + use as a checksum algorithm, it is not suitable for use as a general hash + algorithm. Use as follows:: + + print binascii.crc32("hello world") + # Or, in two pieces: + crc = binascii.crc32("hello") + crc = binascii.crc32(" world", crc) + print crc + + +.. function:: b2a_hex(data) + hexlify(data) + + Return the hexadecimal representation of the binary *data*. Every byte of + *data* is converted into the corresponding 2-digit hex representation. The + resulting string is therefore twice as long as the length of *data*. + + +.. function:: a2b_hex(hexstr) + unhexlify(hexstr) + + Return the binary data represented by the hexadecimal string *hexstr*. This + function is the inverse of :func:`b2a_hex`. *hexstr* must contain an even number + of hexadecimal digits (which can be upper or lower case), otherwise a + :exc:`TypeError` is raised. + + +.. exception:: Error + + Exception raised on errors. These are usually programming errors. + + +.. exception:: Incomplete + + Exception raised on incomplete data. These are usually not programming errors, + but may be handled by reading a little more data and trying again. + + +.. seealso:: + + Module :mod:`base64` + Support for base64 encoding used in MIME email messages. + + Module :mod:`binhex` + Support for the binhex format used on the Macintosh. + + Module :mod:`uu` + Support for UU encoding used on Unix. + + Module :mod:`quopri` + Support for quoted-printable encoding used in MIME email messages. + diff --git a/Doc/library/binhex.rst b/Doc/library/binhex.rst new file mode 100644 index 0000000..3b0485c --- /dev/null +++ b/Doc/library/binhex.rst @@ -0,0 +1,59 @@ + +:mod:`binhex` --- Encode and decode binhex4 files +================================================= + +.. module:: binhex + :synopsis: Encode and decode files in binhex4 format. + + +This module encodes and decodes files in binhex4 format, a format allowing +representation of Macintosh files in ASCII. On the Macintosh, both forks of a +file and the finder information are encoded (or decoded), on other platforms +only the data fork is handled. + +The :mod:`binhex` module defines the following functions: + + +.. function:: binhex(input, output) + + Convert a binary file with filename *input* to binhex file *output*. The + *output* parameter can either be a filename or a file-like object (any object + supporting a :meth:`write` and :meth:`close` method). + + +.. function:: hexbin(input[, output]) + + Decode a binhex file *input*. *input* may be a filename or a file-like object + supporting :meth:`read` and :meth:`close` methods. The resulting file is written + to a file named *output*, unless the argument is omitted in which case the + output filename is read from the binhex file. + +The following exception is also defined: + + +.. exception:: Error + + Exception raised when something can't be encoded using the binhex format (for + example, a filename is too long to fit in the filename field), or when input is + not properly encoded binhex data. + + +.. seealso:: + + Module :mod:`binascii` + Support module containing ASCII-to-binary and binary-to-ASCII conversions. + + +.. _binhex-notes: + +Notes +----- + +There is an alternative, more powerful interface to the coder and decoder, see +the source for details. + +If you code or decode textfiles on non-Macintosh platforms they will still use +the Macintosh newline convention (carriage-return as end of line). + +As of this writing, :func:`hexbin` appears to not work in all cases. + diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst new file mode 100644 index 0000000..b8eb348 --- /dev/null +++ b/Doc/library/bisect.rst @@ -0,0 +1,92 @@ + +:mod:`bisect` --- Array bisection algorithm +=========================================== + +.. module:: bisect + :synopsis: Array bisection algorithms for binary searching. +.. sectionauthor:: Fred L. Drake, Jr. + + +.. % LaTeX produced by Fred L. Drake, Jr. , with an +.. % example based on the PyModules FAQ entry by Aaron Watters +.. % . + +This module provides support for maintaining a list in sorted order without +having to sort the list after each insertion. For long lists of items with +expensive comparison operations, this can be an improvement over the more common +approach. The module is called :mod:`bisect` because it uses a basic bisection +algorithm to do its work. The source code may be most useful as a working +example of the algorithm (the boundary conditions are already right!). + +The following functions are provided: + + +.. function:: bisect_left(list, item[, lo[, hi]]) + + Locate the proper insertion point for *item* in *list* to maintain sorted order. + The parameters *lo* and *hi* may be used to specify a subset of the list which + should be considered; by default the entire list is used. If *item* is already + present in *list*, the insertion point will be before (to the left of) any + existing entries. The return value is suitable for use as the first parameter + to ``list.insert()``. This assumes that *list* is already sorted. + + .. versionadded:: 2.1 + + +.. function:: bisect_right(list, item[, lo[, hi]]) + + Similar to :func:`bisect_left`, but returns an insertion point which comes after + (to the right of) any existing entries of *item* in *list*. + + .. versionadded:: 2.1 + + +.. function:: bisect(...) + + Alias for :func:`bisect_right`. + + +.. function:: insort_left(list, item[, lo[, hi]]) + + Insert *item* in *list* in sorted order. This is equivalent to + ``list.insert(bisect.bisect_left(list, item, lo, hi), item)``. This assumes + that *list* is already sorted. + + .. versionadded:: 2.1 + + +.. function:: insort_right(list, item[, lo[, hi]]) + + Similar to :func:`insort_left`, but inserting *item* in *list* after any + existing entries of *item*. + + .. versionadded:: 2.1 + + +.. function:: insort(...) + + Alias for :func:`insort_right`. + + +Examples +-------- + +.. _bisect-example: + +The :func:`bisect` function is generally useful for categorizing numeric data. +This example uses :func:`bisect` to look up a letter grade for an exam total +(say) based on a set of ordered numeric breakpoints: 85 and up is an 'A', 75..84 +is a 'B', etc. :: + + >>> grades = "FEDCBA" + >>> breakpoints = [30, 44, 66, 75, 85] + >>> from bisect import bisect + >>> def grade(total): + ... return grades[bisect(breakpoints, total)] + ... + >>> grade(66) + 'C' + >>> map(grade, [33, 99, 77, 44, 12, 88]) + ['E', 'A', 'B', 'D', 'F', 'A'] + + diff --git a/Doc/library/bsddb.rst b/Doc/library/bsddb.rst new file mode 100644 index 0000000..55b7c7d --- /dev/null +++ b/Doc/library/bsddb.rst @@ -0,0 +1,211 @@ + +:mod:`bsddb` --- Interface to Berkeley DB library +================================================= + +.. module:: bsddb + :synopsis: Interface to Berkeley DB database library +.. sectionauthor:: Skip Montanaro + + +The :mod:`bsddb` module provides an interface to the Berkeley DB library. Users +can create hash, btree or record based library files using the appropriate open +call. Bsddb objects behave generally like dictionaries. Keys and values must be +strings, however, so to use other objects as keys or to store other kinds of +objects the user must serialize them somehow, typically using +:func:`marshal.dumps` or :func:`pickle.dumps`. + +The :mod:`bsddb` module requires a Berkeley DB library version from 3.3 thru +4.5. + + +.. seealso:: + + http://pybsddb.sourceforge.net/ + The website with documentation for the :mod:`bsddb.db` Python Berkeley DB + interface that closely mirrors the object oriented interface provided in + Berkeley DB 3 and 4. + + http://www.oracle.com/database/berkeley-db/ + The Berkeley DB library. + +A more modern DB, DBEnv and DBSequence object interface is available in the +:mod:`bsddb.db` module which closely matches the Berkeley DB C API documented at +the above URLs. Additional features provided by the :mod:`bsddb.db` API include +fine tuning, transactions, logging, and multiprocess concurrent database access. + +The following is a description of the legacy :mod:`bsddb` interface compatible +with the old Python bsddb module. Starting in Python 2.5 this interface should +be safe for multithreaded access. The :mod:`bsddb.db` API is recommended for +threading users as it provides better control. + +The :mod:`bsddb` module defines the following functions that create objects that +access the appropriate type of Berkeley DB file. The first two arguments of +each function are the same. For ease of portability, only the first two +arguments should be used in most instances. + + +.. function:: hashopen(filename[, flag[, mode[, pgsize[, ffactor[, nelem[, cachesize[, lorder[, hflags]]]]]]]]) + + Open the hash format file named *filename*. Files never intended to be + preserved on disk may be created by passing ``None`` as the *filename*. The + optional *flag* identifies the mode used to open the file. It may be ``'r'`` + (read only), ``'w'`` (read-write) , ``'c'`` (read-write - create if necessary; + the default) or ``'n'`` (read-write - truncate to zero length). The other + arguments are rarely used and are just passed to the low-level :cfunc:`dbopen` + function. Consult the Berkeley DB documentation for their use and + interpretation. + + +.. function:: btopen(filename[, flag[, mode[, btflags[, cachesize[, maxkeypage[, minkeypage[, pgsize[, lorder]]]]]]]]) + + Open the btree format file named *filename*. Files never intended to be + preserved on disk may be created by passing ``None`` as the *filename*. The + optional *flag* identifies the mode used to open the file. It may be ``'r'`` + (read only), ``'w'`` (read-write), ``'c'`` (read-write - create if necessary; + the default) or ``'n'`` (read-write - truncate to zero length). The other + arguments are rarely used and are just passed to the low-level dbopen function. + Consult the Berkeley DB documentation for their use and interpretation. + + +.. function:: rnopen(filename[, flag[, mode[, rnflags[, cachesize[, pgsize[, lorder[, rlen[, delim[, source[, pad]]]]]]]]]]) + + Open a DB record format file named *filename*. Files never intended to be + preserved on disk may be created by passing ``None`` as the *filename*. The + optional *flag* identifies the mode used to open the file. It may be ``'r'`` + (read only), ``'w'`` (read-write), ``'c'`` (read-write - create if necessary; + the default) or ``'n'`` (read-write - truncate to zero length). The other + arguments are rarely used and are just passed to the low-level dbopen function. + Consult the Berkeley DB documentation for their use and interpretation. + + +.. class:: StringKeys(db) + + Wrapper class around a DB object that supports string keys (rather than bytes). + All keys are encoded as UTF-8, then passed to the underlying object. + + .. versionadded:: 3.0 + + +.. class:: StringValues(db) + + Wrapper class around a DB object that supports string values (rather than bytes). + All values are encoded as UTF-8, then passed to the underlying object. + + .. versionadded:: 3.0 + + +.. seealso:: + + Module :mod:`dbhash` + DBM-style interface to the :mod:`bsddb` + + +.. _bsddb-objects: + +Hash, BTree and Record Objects +------------------------------ + +Once instantiated, hash, btree and record objects support the same methods as +dictionaries. In addition, they support the methods listed below. + +.. versionchanged:: 2.3.1 + Added dictionary methods. + + +.. method:: bsddbobject.close() + + Close the underlying file. The object can no longer be accessed. Since there + is no open :meth:`open` method for these objects, to open the file again a new + :mod:`bsddb` module open function must be called. + + +.. method:: bsddbobject.keys() + + Return the list of keys contained in the DB file. The order of the list is + unspecified and should not be relied on. In particular, the order of the list + returned is different for different file formats. + + +.. method:: bsddbobject.has_key(key) + + Return ``1`` if the DB file contains the argument as a key. + + +.. method:: bsddbobject.set_location(key) + + Set the cursor to the item indicated by *key* and return a tuple containing the + key and its value. For binary tree databases (opened using :func:`btopen`), if + *key* does not actually exist in the database, the cursor will point to the next + item in sorted order and return that key and value. For other databases, + :exc:`KeyError` will be raised if *key* is not found in the database. + + +.. method:: bsddbobject.first() + + Set the cursor to the first item in the DB file and return it. The order of + keys in the file is unspecified, except in the case of B-Tree databases. This + method raises :exc:`bsddb.error` if the database is empty. + + +.. method:: bsddbobject.next() + + Set the cursor to the next item in the DB file and return it. The order of + keys in the file is unspecified, except in the case of B-Tree databases. + + +.. method:: bsddbobject.previous() + + Set the cursor to the previous item in the DB file and return it. The order of + keys in the file is unspecified, except in the case of B-Tree databases. This + is not supported on hashtable databases (those opened with :func:`hashopen`). + + +.. method:: bsddbobject.last() + + Set the cursor to the last item in the DB file and return it. The order of keys + in the file is unspecified. This is not supported on hashtable databases (those + opened with :func:`hashopen`). This method raises :exc:`bsddb.error` if the + database is empty. + + +.. method:: bsddbobject.sync() + + Synchronize the database on disk. + +Example:: + + >>> import bsddb + >>> db = bsddb.btopen('/tmp/spam.db', 'c') + >>> for i in range(10): db['%d'%i] = '%d'% (i*i) + ... + >>> db['3'] + '9' + >>> db.keys() + ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] + >>> db.first() + ('0', '0') + >>> db.next() + ('1', '1') + >>> db.last() + ('9', '81') + >>> db.set_location('2') + ('2', '4') + >>> db.previous() + ('1', '1') + >>> for k, v in db.iteritems(): + ... print k, v + 0 0 + 1 1 + 2 4 + 3 9 + 4 16 + 5 25 + 6 36 + 7 49 + 8 64 + 9 81 + >>> '8' in db + True + >>> db.sync() + 0 + diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst new file mode 100644 index 0000000..a8c0911 --- /dev/null +++ b/Doc/library/bz2.rst @@ -0,0 +1,181 @@ + +:mod:`bz2` --- Compression compatible with :program:`bzip2` +=========================================================== + +.. module:: bz2 + :synopsis: Interface to compression and decompression routines compatible with bzip2. +.. moduleauthor:: Gustavo Niemeyer +.. sectionauthor:: Gustavo Niemeyer + + +.. versionadded:: 2.3 + +This module provides a comprehensive interface for the bz2 compression library. +It implements a complete file interface, one-shot (de)compression functions, and +types for sequential (de)compression. + +Here is a resume of the features offered by the bz2 module: + +* :class:`BZ2File` class implements a complete file interface, including + :meth:`readline`, :meth:`readlines`, :meth:`writelines`, :meth:`seek`, etc; + +* :class:`BZ2File` class implements emulated :meth:`seek` support; + +* :class:`BZ2File` class implements universal newline support; + +* :class:`BZ2File` class offers an optimized line iteration using the readahead + algorithm borrowed from file objects; + +* Sequential (de)compression supported by :class:`BZ2Compressor` and + :class:`BZ2Decompressor` classes; + +* One-shot (de)compression supported by :func:`compress` and :func:`decompress` + functions; + +* Thread safety uses individual locking mechanism; + +* Complete inline documentation; + + +(De)compression of files +------------------------ + +Handling of compressed files is offered by the :class:`BZ2File` class. + + +.. class:: BZ2File(filename[, mode[, buffering[, compresslevel]]]) + + Open a bz2 file. Mode can be either ``'r'`` or ``'w'``, for reading (default) + or writing. When opened for writing, the file will be created if it doesn't + exist, and truncated otherwise. If *buffering* is given, ``0`` means unbuffered, + and larger numbers specify the buffer size; the default is ``0``. If + *compresslevel* is given, it must be a number between ``1`` and ``9``; the + default is ``9``. Add a ``'U'`` to mode to open the file for input with + universal newline support. Any line ending in the input file will be seen as a + ``'\n'`` in Python. Also, a file so opened gains the attribute + :attr:`newlines`; the value for this attribute is one of ``None`` (no newline + read yet), ``'\r'``, ``'\n'``, ``'\r\n'`` or a tuple containing all the newline + types seen. Universal newlines are available only when reading. Instances + support iteration in the same way as normal :class:`file` instances. + + +.. method:: BZ2File.close() + + Close the file. Sets data attribute :attr:`closed` to true. A closed file cannot + be used for further I/O operations. :meth:`close` may be called more than once + without error. + + +.. method:: BZ2File.read([size]) + + Read at most *size* uncompressed bytes, returned as a string. If the *size* + argument is negative or omitted, read until EOF is reached. + + +.. method:: BZ2File.readline([size]) + + Return the next line from the file, as a string, retaining newline. A + non-negative *size* argument limits the maximum number of bytes to return (an + incomplete line may be returned then). Return an empty string at EOF. + + +.. method:: BZ2File.readlines([size]) + + Return a list of lines read. The optional *size* argument, if given, is an + approximate bound on the total number of bytes in the lines returned. + + +.. method:: BZ2File.seek(offset[, whence]) + + Move to new file position. Argument *offset* is a byte count. Optional argument + *whence* defaults to ``os.SEEK_SET`` or ``0`` (offset from start of file; offset + should be ``>= 0``); other values are ``os.SEEK_CUR`` or ``1`` (move relative to + current position; offset can be positive or negative), and ``os.SEEK_END`` or + ``2`` (move relative to end of file; offset is usually negative, although many + platforms allow seeking beyond the end of a file). + + Note that seeking of bz2 files is emulated, and depending on the parameters the + operation may be extremely slow. + + +.. method:: BZ2File.tell() + + Return the current file position, an integer (may be a long integer). + + +.. method:: BZ2File.write(data) + + Write string *data* to file. Note that due to buffering, :meth:`close` may be + needed before the file on disk reflects the data written. + + +.. method:: BZ2File.writelines(sequence_of_strings) + + Write the sequence of strings to the file. Note that newlines are not added. The + sequence can be any iterable object producing strings. This is equivalent to + calling write() for each string. + + +Sequential (de)compression +-------------------------- + +Sequential compression and decompression is done using the classes +:class:`BZ2Compressor` and :class:`BZ2Decompressor`. + + +.. class:: BZ2Compressor([compresslevel]) + + Create a new compressor object. This object may be used to compress data + sequentially. If you want to compress data in one shot, use the :func:`compress` + function instead. The *compresslevel* parameter, if given, must be a number + between ``1`` and ``9``; the default is ``9``. + + +.. method:: BZ2Compressor.compress(data) + + Provide more data to the compressor object. It will return chunks of compressed + data whenever possible. When you've finished providing data to compress, call + the :meth:`flush` method to finish the compression process, and return what is + left in internal buffers. + + +.. method:: BZ2Compressor.flush() + + Finish the compression process and return what is left in internal buffers. You + must not use the compressor object after calling this method. + + +.. class:: BZ2Decompressor() + + Create a new decompressor object. This object may be used to decompress data + sequentially. If you want to decompress data in one shot, use the + :func:`decompress` function instead. + + +.. method:: BZ2Decompressor.decompress(data) + + Provide more data to the decompressor object. It will return chunks of + decompressed data whenever possible. If you try to decompress data after the end + of stream is found, :exc:`EOFError` will be raised. If any data was found after + the end of stream, it'll be ignored and saved in :attr:`unused_data` attribute. + + +One-shot (de)compression +------------------------ + +One-shot compression and decompression is provided through the :func:`compress` +and :func:`decompress` functions. + + +.. function:: compress(data[, compresslevel]) + + Compress *data* in one shot. If you want to compress data sequentially, use an + instance of :class:`BZ2Compressor` instead. The *compresslevel* parameter, if + given, must be a number between ``1`` and ``9``; the default is ``9``. + + +.. function:: decompress(data) + + Decompress *data* in one shot. If you want to decompress data sequentially, use + an instance of :class:`BZ2Decompressor` instead. + diff --git a/Doc/library/calendar.rst b/Doc/library/calendar.rst new file mode 100644 index 0000000..68cbeb6 --- /dev/null +++ b/Doc/library/calendar.rst @@ -0,0 +1,326 @@ + +:mod:`calendar` --- General calendar-related functions +====================================================== + +.. module:: calendar + :synopsis: Functions for working with calendars, including some emulation of the Unix cal + program. +.. sectionauthor:: Drew Csillag + + +This module allows you to output calendars like the Unix :program:`cal` program, +and provides additional useful functions related to the calendar. By default, +these calendars have Monday as the first day of the week, and Sunday as the last +(the European convention). Use :func:`setfirstweekday` to set the first day of +the week to Sunday (6) or to any other weekday. Parameters that specify dates +are given as integers. For related +functionality, see also the :mod:`datetime` and :mod:`time` modules. + +Most of these functions and classses rely on the :mod:`datetime` module which +uses an idealized calendar, the current Gregorian calendar indefinitely extended +in both directions. This matches the definition of the "proleptic Gregorian" +calendar in Dershowitz and Reingold's book "Calendrical Calculations", where +it's the base calendar for all computations. + + +.. class:: Calendar([firstweekday]) + + Creates a :class:`Calendar` object. *firstweekday* is an integer specifying the + first day of the week. ``0`` is Monday (the default), ``6`` is Sunday. + + A :class:`Calendar` object provides several methods that can be used for + preparing the calendar data for formatting. This class doesn't do any formatting + itself. This is the job of subclasses. + + .. versionadded:: 2.5 + +:class:`Calendar` instances have the following methods: + + +.. method:: Calendar.iterweekdays(weekday) + + Return an iterator for the week day numbers that will be used for one week. The + first number from the iterator will be the same as the number returned by + :meth:`firstweekday`. + + +.. method:: Calendar.itermonthdates(year, month) + + Return an iterator for the month *month* (1-12) in the year *year*. This + iterator will return all days (as :class:`datetime.date` objects) for the month + and all days before the start of the month or after the end of the month that + are required to get a complete week. + + +.. method:: Calendar.itermonthdays2(year, month) + + Return an iterator for the month *month* in the year *year* similar to + :meth:`itermonthdates`. Days returned will be tuples consisting of a day number + and a week day number. + + +.. method:: Calendar.itermonthdays(year, month) + + Return an iterator for the month *month* in the year *year* similar to + :meth:`itermonthdates`. Days returned will simply be day numbers. + + +.. method:: Calendar.monthdatescalendar(year, month) + + Return a list of the weeks in the month *month* of the *year* as full weeks. + Weeks are lists of seven :class:`datetime.date` objects. + + +.. method:: Calendar.monthdays2calendar(year, month) + + Return a list of the weeks in the month *month* of the *year* as full weeks. + Weeks are lists of seven tuples of day numbers and weekday numbers. + + +.. method:: Calendar.monthdayscalendar(year, month) + + Return a list of the weeks in the month *month* of the *year* as full weeks. + Weeks are lists of seven day numbers. + + +.. method:: Calendar.yeardatescalendar(year, month[, width]) + + Return the data for the specified year ready for formatting. The return value is + a list of month rows. Each month row contains up to *width* months (defaulting + to 3). Each month contains between 4 and 6 weeks and each week contains 1--7 + days. Days are :class:`datetime.date` objects. + + +.. method:: Calendar.yeardays2calendar(year, month[, width]) + + Return the data for the specified year ready for formatting (similar to + :meth:`yeardatescalendar`). Entries in the week lists are tuples of day numbers + and weekday numbers. Day numbers outside this month are zero. + + +.. method:: Calendar.yeardayscalendar(year, month[, width]) + + Return the data for the specified year ready for formatting (similar to + :meth:`yeardatescalendar`). Entries in the week lists are day numbers. Day + numbers outside this month are zero. + + +.. class:: TextCalendar([firstweekday]) + + This class can be used to generate plain text calendars. + + .. versionadded:: 2.5 + +:class:`TextCalendar` instances have the following methods: + + +.. method:: TextCalendar.formatmonth(theyear, themonth[, w[, l]]) + + Return a month's calendar in a multi-line string. If *w* is provided, it + specifies the width of the date columns, which are centered. If *l* is given, it + specifies the number of lines that each week will use. Depends on the first + weekday as set by :func:`setfirstweekday`. + + +.. method:: TextCalendar.prmonth(theyear, themonth[, w[, l]]) + + Print a month's calendar as returned by :meth:`formatmonth`. + + +.. method:: TextCalendar.formatyear(theyear, themonth[, w[, l[, c[, m]]]]) + + Return a *m*-column calendar for an entire year as a multi-line string. Optional + parameters *w*, *l*, and *c* are for date column width, lines per week, and + number of spaces between month columns, respectively. Depends on the first + weekday as set by :meth:`setfirstweekday`. The earliest year for which a + calendar can be generated is platform-dependent. + + +.. method:: TextCalendar.pryear(theyear[, w[, l[, c[, m]]]]) + + Print the calendar for an entire year as returned by :meth:`formatyear`. + + +.. class:: HTMLCalendar([firstweekday]) + + This class can be used to generate HTML calendars. + + .. versionadded:: 2.5 + +:class:`HTMLCalendar` instances have the following methods: + + +.. method:: HTMLCalendar.formatmonth(theyear, themonth[, withyear]) + + Return a month's calendar as an HTML table. If *withyear* is true the year will + be included in the header, otherwise just the month name will be used. + + +.. method:: HTMLCalendar.formatyear(theyear, themonth[, width]) + + Return a year's calendar as an HTML table. *width* (defaulting to 3) specifies + the number of months per row. + + +.. method:: HTMLCalendar.formatyearpage(theyear, themonth[, width[, css[, encoding]]]) + + Return a year's calendar as a complete HTML page. *width* (defaulting to 3) + specifies the number of months per row. *css* is the name for the cascading + style sheet to be used. :const:`None` can be passed if no style sheet should be + used. *encoding* specifies the encoding to be used for the output (defaulting to + the system default encoding). + + +.. class:: LocaleTextCalendar([firstweekday[, locale]]) + + This subclass of :class:`TextCalendar` can be passed a locale name in the + constructor and will return month and weekday names in the specified locale. If + this locale includes an encoding all strings containing month and weekday names + will be returned as unicode. + + .. versionadded:: 2.5 + + +.. class:: LocaleHTMLCalendar([firstweekday[, locale]]) + + This subclass of :class:`HTMLCalendar` can be passed a locale name in the + constructor and will return month and weekday names in the specified locale. If + this locale includes an encoding all strings containing month and weekday names + will be returned as unicode. + + .. versionadded:: 2.5 + +For simple text calendars this module provides the following functions. + + +.. function:: setfirstweekday(weekday) + + Sets the weekday (``0`` is Monday, ``6`` is Sunday) to start each week. The + values :const:`MONDAY`, :const:`TUESDAY`, :const:`WEDNESDAY`, :const:`THURSDAY`, + :const:`FRIDAY`, :const:`SATURDAY`, and :const:`SUNDAY` are provided for + convenience. For example, to set the first weekday to Sunday:: + + import calendar + calendar.setfirstweekday(calendar.SUNDAY) + + .. versionadded:: 2.0 + + +.. function:: firstweekday() + + Returns the current setting for the weekday to start each week. + + .. versionadded:: 2.0 + + +.. function:: isleap(year) + + Returns :const:`True` if *year* is a leap year, otherwise :const:`False`. + + +.. function:: leapdays(y1, y2) + + Returns the number of leap years in the range from *y1* to *y2* (exclusive), + where *y1* and *y2* are years. + + .. versionchanged:: 2.0 + This function didn't work for ranges spanning a century change in Python + 1.5.2. + + +.. function:: weekday(year, month, day) + + Returns the day of the week (``0`` is Monday) for *year* (``1970``--...), + *month* (``1``--``12``), *day* (``1``--``31``). + + +.. function:: weekheader(n) + + Return a header containing abbreviated weekday names. *n* specifies the width in + characters for one weekday. + + +.. function:: monthrange(year, month) + + Returns weekday of first day of the month and number of days in month, for the + specified *year* and *month*. + + +.. function:: monthcalendar(year, month) + + Returns a matrix representing a month's calendar. Each row represents a week; + days outside of the month a represented by zeros. Each week begins with Monday + unless set by :func:`setfirstweekday`. + + +.. function:: prmonth(theyear, themonth[, w[, l]]) + + Prints a month's calendar as returned by :func:`month`. + + +.. function:: month(theyear, themonth[, w[, l]]) + + Returns a month's calendar in a multi-line string using the :meth:`formatmonth` + of the :class:`TextCalendar` class. + + .. versionadded:: 2.0 + + +.. function:: prcal(year[, w[, l[c]]]) + + Prints the calendar for an entire year as returned by :func:`calendar`. + + +.. function:: calendar(year[, w[, l[c]]]) + + Returns a 3-column calendar for an entire year as a multi-line string using the + :meth:`formatyear` of the :class:`TextCalendar` class. + + .. versionadded:: 2.0 + + +.. function:: timegm(tuple) + + An unrelated but handy function that takes a time tuple such as returned by the + :func:`gmtime` function in the :mod:`time` module, and returns the corresponding + Unix timestamp value, assuming an epoch of 1970, and the POSIX encoding. In + fact, :func:`time.gmtime` and :func:`timegm` are each others' inverse. + + .. versionadded:: 2.0 + +The :mod:`calendar` module exports the following data attributes: + + +.. data:: day_name + + An array that represents the days of the week in the current locale. + + +.. data:: day_abbr + + An array that represents the abbreviated days of the week in the current locale. + + +.. data:: month_name + + An array that represents the months of the year in the current locale. This + follows normal convention of January being month number 1, so it has a length of + 13 and ``month_name[0]`` is the empty string. + + +.. data:: month_abbr + + An array that represents the abbreviated months of the year in the current + locale. This follows normal convention of January being month number 1, so it + has a length of 13 and ``month_abbr[0]`` is the empty string. + + +.. seealso:: + + Module :mod:`datetime` + Object-oriented interface to dates and times with similar functionality to the + :mod:`time` module. + + Module :mod:`time` + Low-level time related functions. + diff --git a/Doc/library/carbon.rst b/Doc/library/carbon.rst new file mode 100644 index 0000000..ecaf3bb --- /dev/null +++ b/Doc/library/carbon.rst @@ -0,0 +1,288 @@ + +.. _toolbox: + +********************* +MacOS Toolbox Modules +********************* + +There are a set of modules that provide interfaces to various MacOS toolboxes. +If applicable the module will define a number of Python objects for the various +structures declared by the toolbox, and operations will be implemented as +methods of the object. Other operations will be implemented as functions in the +module. Not all operations possible in C will also be possible in Python +(callbacks are often a problem), and parameters will occasionally be different +in Python (input and output buffers, especially). All methods and functions +have a :attr:`__doc__` string describing their arguments and return values, and +for additional description you are referred to `Inside Macintosh +`_ or similar works. + +These modules all live in a package called :mod:`Carbon`. Despite that name they +are not all part of the Carbon framework: CF is really in the CoreFoundation +framework and Qt is in the QuickTime framework. The normal use pattern is :: + + from Carbon import AE + +**Warning!** These modules are not yet documented. If you wish to contribute +documentation of any of these modules, please get in touch with docs@python.org. + + +:mod:`Carbon.AE` --- Apple Events +================================= + +.. module:: Carbon.AE + :platform: Mac + :synopsis: Interface to the Apple Events toolbox. + + + +:mod:`Carbon.AH` --- Apple Help +=============================== + +.. module:: Carbon.AH + :platform: Mac + :synopsis: Interface to the Apple Help manager. + + + +:mod:`Carbon.App` --- Appearance Manager +======================================== + +.. module:: Carbon.App + :platform: Mac + :synopsis: Interface to the Appearance Manager. + + + +:mod:`Carbon.CF` --- Core Foundation +==================================== + +.. module:: Carbon.CF + :platform: Mac + :synopsis: Interface to the Core Foundation. + + +The ``CFBase``, ``CFArray``, ``CFData``, ``CFDictionary``, ``CFString`` and +``CFURL`` objects are supported, some only partially. + + +:mod:`Carbon.CG` --- Core Graphics +================================== + +.. module:: Carbon.CG + :platform: Mac + :synopsis: Interface to the Component Manager. + + + +:mod:`Carbon.CarbonEvt` --- Carbon Event Manager +================================================ + +.. module:: Carbon.CarbonEvt + :platform: Mac + :synopsis: Interface to the Carbon Event Manager. + + + +:mod:`Carbon.Cm` --- Component Manager +====================================== + +.. module:: Carbon.Cm + :platform: Mac + :synopsis: Interface to the Component Manager. + + + +:mod:`Carbon.Ctl` --- Control Manager +===================================== + +.. module:: Carbon.Ctl + :platform: Mac + :synopsis: Interface to the Control Manager. + + + +:mod:`Carbon.Dlg` --- Dialog Manager +==================================== + +.. module:: Carbon.Dlg + :platform: Mac + :synopsis: Interface to the Dialog Manager. + + + +:mod:`Carbon.Evt` --- Event Manager +=================================== + +.. module:: Carbon.Evt + :platform: Mac + :synopsis: Interface to the classic Event Manager. + + + +:mod:`Carbon.Fm` --- Font Manager +================================= + +.. module:: Carbon.Fm + :platform: Mac + :synopsis: Interface to the Font Manager. + + + +:mod:`Carbon.Folder` --- Folder Manager +======================================= + +.. module:: Carbon.Folder + :platform: Mac + :synopsis: Interface to the Folder Manager. + + + +:mod:`Carbon.Help` --- Help Manager +=================================== + +.. module:: Carbon.Help + :platform: Mac + :synopsis: Interface to the Carbon Help Manager. + + + +:mod:`Carbon.List` --- List Manager +=================================== + +.. module:: Carbon.List + :platform: Mac + :synopsis: Interface to the List Manager. + + + +:mod:`Carbon.Menu` --- Menu Manager +=================================== + +.. module:: Carbon.Menu + :platform: Mac + :synopsis: Interface to the Menu Manager. + + + +:mod:`Carbon.Mlte` --- MultiLingual Text Editor +=============================================== + +.. module:: Carbon.Mlte + :platform: Mac + :synopsis: Interface to the MultiLingual Text Editor. + + + +:mod:`Carbon.Qd` --- QuickDraw +============================== + +.. module:: Carbon.Qd + :platform: Mac + :synopsis: Interface to the QuickDraw toolbox. + + + +:mod:`Carbon.Qdoffs` --- QuickDraw Offscreen +============================================ + +.. module:: Carbon.Qdoffs + :platform: Mac + :synopsis: Interface to the QuickDraw Offscreen APIs. + + + +:mod:`Carbon.Qt` --- QuickTime +============================== + +.. module:: Carbon.Qt + :platform: Mac + :synopsis: Interface to the QuickTime toolbox. + + + +:mod:`Carbon.Res` --- Resource Manager and Handles +================================================== + +.. module:: Carbon.Res + :platform: Mac + :synopsis: Interface to the Resource Manager and Handles. + + + +:mod:`Carbon.Scrap` --- Scrap Manager +===================================== + +.. module:: Carbon.Scrap + :platform: Mac + :synopsis: The Scrap Manager provides basic services for implementing cut & paste and + clipboard operations. + + +This module is only fully available on MacOS9 and earlier under classic PPC +MacPython. Very limited functionality is available under Carbon MacPython. + +.. index:: single: Scrap Manager + +The Scrap Manager supports the simplest form of cut & paste operations on the +Macintosh. It can be use for both inter- and intra-application clipboard +operations. + +The :mod:`Scrap` module provides low-level access to the functions of the Scrap +Manager. It contains the following functions: + + +.. function:: InfoScrap() + + Return current information about the scrap. The information is encoded as a + tuple containing the fields ``(size, handle, count, state, path)``. + + +----------+---------------------------------------------+ + | Field | Meaning | + +==========+=============================================+ + | *size* | Size of the scrap in bytes. | + +----------+---------------------------------------------+ + | *handle* | Resource object representing the scrap. | + +----------+---------------------------------------------+ + | *count* | Serial number of the scrap contents. | + +----------+---------------------------------------------+ + | *state* | Integer; positive if in memory, ``0`` if on | + | | disk, negative if uninitialized. | + +----------+---------------------------------------------+ + | *path* | Filename of the scrap when stored on disk. | + +----------+---------------------------------------------+ + + +.. seealso:: + + `Scrap Manager `_ + Apple's documentation for the Scrap Manager gives a lot of useful information + about using the Scrap Manager in applications. + + + +:mod:`Carbon.Snd` --- Sound Manager +=================================== + +.. module:: Carbon.Snd + :platform: Mac + :synopsis: Interface to the Sound Manager. + + + +:mod:`Carbon.TE` --- TextEdit +============================= + +.. module:: Carbon.TE + :platform: Mac + :synopsis: Interface to TextEdit. + + + +:mod:`Carbon.Win` --- Window Manager +==================================== + +.. module:: Carbon.Win + :platform: Mac + :synopsis: Interface to the Window Manager. + + diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst new file mode 100644 index 0000000..29ed545 --- /dev/null +++ b/Doc/library/cgi.rst @@ -0,0 +1,558 @@ + +:mod:`cgi` --- Common Gateway Interface support. +================================================ + +.. module:: cgi + :synopsis: Helpers for running Python scripts via the Common Gateway Interface. + + +.. index:: + pair: WWW; server + pair: CGI; protocol + pair: HTTP; protocol + pair: MIME; headers + single: URL + single: Common Gateway Interface + +Support module for Common Gateway Interface (CGI) scripts. + +This module defines a number of utilities for use by CGI scripts written in +Python. + + +Introduction +------------ + +.. _cgi-intro: + +A CGI script is invoked by an HTTP server, usually to process user input +submitted through an HTML ``
    `` or ```` element. + +Most often, CGI scripts live in the server's special :file:`cgi-bin` directory. +The HTTP server places all sorts of information about the request (such as the +client's hostname, the requested URL, the query string, and lots of other +goodies) in the script's shell environment, executes the script, and sends the +script's output back to the client. + +The script's input is connected to the client too, and sometimes the form data +is read this way; at other times the form data is passed via the "query string" +part of the URL. This module is intended to take care of the different cases +and provide a simpler interface to the Python script. It also provides a number +of utilities that help in debugging scripts, and the latest addition is support +for file uploads from a form (if your browser supports it). + +The output of a CGI script should consist of two sections, separated by a blank +line. The first section contains a number of headers, telling the client what +kind of data is following. Python code to generate a minimal header section +looks like this:: + + print "Content-Type: text/html" # HTML is following + print # blank line, end of headers + +The second section is usually HTML, which allows the client software to display +nicely formatted text with header, in-line images, etc. Here's Python code that +prints a simple piece of HTML:: + + print "CGI script output" + print "

    This is my first CGI script

    " + print "Hello, world!" + + +.. _using-the-cgi-module: + +Using the cgi module +-------------------- + +Begin by writing ``import cgi``. Do not use ``from cgi import *`` --- the +module defines all sorts of names for its own use or for backward compatibility +that you don't want in your namespace. + +When you write a new script, consider adding the line:: + + import cgitb; cgitb.enable() + +This activates a special exception handler that will display detailed reports in +the Web browser if any errors occur. If you'd rather not show the guts of your +program to users of your script, you can have the reports saved to files +instead, with a line like this:: + + import cgitb; cgitb.enable(display=0, logdir="/tmp") + +It's very helpful to use this feature during script development. The reports +produced by :mod:`cgitb` provide information that can save you a lot of time in +tracking down bugs. You can always remove the ``cgitb`` line later when you +have tested your script and are confident that it works correctly. + +To get at submitted form data, it's best to use the :class:`FieldStorage` class. +The other classes defined in this module are provided mostly for backward +compatibility. Instantiate it exactly once, without arguments. This reads the +form contents from standard input or the environment (depending on the value of +various environment variables set according to the CGI standard). Since it may +consume standard input, it should be instantiated only once. + +The :class:`FieldStorage` instance can be indexed like a Python dictionary, and +also supports the standard dictionary methods :meth:`has_key` and :meth:`keys`. +The built-in :func:`len` is also supported. Form fields containing empty +strings are ignored and do not appear in the dictionary; to keep such values, +provide a true value for the optional *keep_blank_values* keyword parameter when +creating the :class:`FieldStorage` instance. + +For instance, the following code (which assumes that the +:mailheader:`Content-Type` header and blank line have already been printed) +checks that the fields ``name`` and ``addr`` are both set to a non-empty +string:: + + form = cgi.FieldStorage() + if not (form.has_key("name") and form.has_key("addr")): + print "

    Error

    " + print "Please fill in the name and addr fields." + return + print "

    name:", form["name"].value + print "

    addr:", form["addr"].value + ...further form processing here... + +Here the fields, accessed through ``form[key]``, are themselves instances of +:class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form +encoding). The :attr:`value` attribute of the instance yields the string value +of the field. The :meth:`getvalue` method returns this string value directly; +it also accepts an optional second argument as a default to return if the +requested key is not present. + +If the submitted form data contains more than one field with the same name, the +object retrieved by ``form[key]`` is not a :class:`FieldStorage` or +:class:`MiniFieldStorage` instance but a list of such instances. Similarly, in +this situation, ``form.getvalue(key)`` would return a list of strings. If you +expect this possibility (when your HTML form contains multiple fields with the +same name), use the :func:`getlist` function, which always returns a list of +values (so that you do not need to special-case the single item case). For +example, this code concatenates any number of username fields, separated by +commas:: + + value = form.getlist("username") + usernames = ",".join(value) + +If a field represents an uploaded file, accessing the value via the +:attr:`value` attribute or the :func:`getvalue` method reads the entire file in +memory as a string. This may not be what you want. You can test for an uploaded +file by testing either the :attr:`filename` attribute or the :attr:`file` +attribute. You can then read the data at leisure from the :attr:`file` +attribute:: + + fileitem = form["userfile"] + if fileitem.file: + # It's an uploaded file; count lines + linecount = 0 + while 1: + line = fileitem.file.readline() + if not line: break + linecount = linecount + 1 + +The file upload draft standard entertains the possibility of uploading multiple +files from one field (using a recursive :mimetype:`multipart/\*` encoding). +When this occurs, the item will be a dictionary-like :class:`FieldStorage` item. +This can be determined by testing its :attr:`type` attribute, which should be +:mimetype:`multipart/form-data` (or perhaps another MIME type matching +:mimetype:`multipart/\*`). In this case, it can be iterated over recursively +just like the top-level form object. + +When a form is submitted in the "old" format (as the query string or as a single +data part of type :mimetype:`application/x-www-form-urlencoded`), the items will +actually be instances of the class :class:`MiniFieldStorage`. In this case, the +:attr:`list`, :attr:`file`, and :attr:`filename` attributes are always ``None``. + + +Higher Level Interface +---------------------- + +.. versionadded:: 2.2 + +The previous section explains how to read CGI form data using the +:class:`FieldStorage` class. This section describes a higher level interface +which was added to this class to allow one to do it in a more readable and +intuitive way. The interface doesn't make the techniques described in previous +sections obsolete --- they are still useful to process file uploads efficiently, +for example. + +.. % XXX: Is this true ? + +The interface consists of two simple methods. Using the methods you can process +form data in a generic way, without the need to worry whether only one or more +values were posted under one name. + +In the previous section, you learned to write following code anytime you +expected a user to post more than one value under one name:: + + item = form.getvalue("item") + if isinstance(item, list): + # The user is requesting more than one item. + else: + # The user is requesting only one item. + +This situation is common for example when a form contains a group of multiple +checkboxes with the same name:: + + + + +In most situations, however, there's only one form control with a particular +name in a form and then you expect and need only one value associated with this +name. So you write a script containing for example this code:: + + user = form.getvalue("user").upper() + +The problem with the code is that you should never expect that a client will +provide valid input to your scripts. For example, if a curious user appends +another ``user=foo`` pair to the query string, then the script would crash, +because in this situation the ``getvalue("user")`` method call returns a list +instead of a string. Calling the :meth:`toupper` method on a list is not valid +(since lists do not have a method of this name) and results in an +:exc:`AttributeError` exception. + +Therefore, the appropriate way to read form data values was to always use the +code which checks whether the obtained value is a single value or a list of +values. That's annoying and leads to less readable scripts. + +A more convenient approach is to use the methods :meth:`getfirst` and +:meth:`getlist` provided by this higher level interface. + + +.. method:: FieldStorage.getfirst(name[, default]) + + This method always returns only one value associated with form field *name*. + The method returns only the first value in case that more values were posted + under such name. Please note that the order in which the values are received + may vary from browser to browser and should not be counted on. [#]_ If no such + form field or value exists then the method returns the value specified by the + optional parameter *default*. This parameter defaults to ``None`` if not + specified. + + +.. method:: FieldStorage.getlist(name) + + This method always returns a list of values associated with form field *name*. + The method returns an empty list if no such form field or value exists for + *name*. It returns a list consisting of one item if only one such value exists. + +Using these methods you can write nice compact code:: + + import cgi + form = cgi.FieldStorage() + user = form.getfirst("user", "").upper() # This way it's safe. + for item in form.getlist("item"): + do_something(item) + + +Old classes +----------- + +These classes, present in earlier versions of the :mod:`cgi` module, are still +supported for backward compatibility. New applications should use the +:class:`FieldStorage` class. + +:class:`SvFormContentDict` stores single value form content as dictionary; it +assumes each field name occurs in the form only once. + +:class:`FormContentDict` stores multiple value form content as a dictionary (the +form items are lists of values). Useful if your form contains multiple fields +with the same name. + +Other classes (:class:`FormContent`, :class:`InterpFormContentDict`) are present +for backwards compatibility with really old applications only. If you still use +these and would be inconvenienced when they disappeared from a next version of +this module, drop me a note. + + +.. _functions-in-cgi-module: + +Functions +--------- + +These are useful if you want more control, or if you want to employ some of the +algorithms implemented in this module in other circumstances. + + +.. function:: parse(fp[, keep_blank_values[, strict_parsing]]) + + Parse a query in the environment or from a file (the file defaults to + ``sys.stdin``). The *keep_blank_values* and *strict_parsing* parameters are + passed to :func:`parse_qs` unchanged. + + +.. function:: parse_qs(qs[, keep_blank_values[, strict_parsing]]) + + Parse a query string given as a string argument (data of type + :mimetype:`application/x-www-form-urlencoded`). Data are returned as a + dictionary. The dictionary keys are the unique query variable names and the + values are lists of values for each name. + + The optional argument *keep_blank_values* is a flag indicating whether blank + values in URL encoded queries should be treated as blank strings. A true value + indicates that blanks should be retained as blank strings. The default false + value indicates that blank values are to be ignored and treated as if they were + not included. + + The optional argument *strict_parsing* is a flag indicating what to do with + parsing errors. If false (the default), errors are silently ignored. If true, + errors raise a :exc:`ValueError` exception. + + Use the :func:`urllib.urlencode` function to convert such dictionaries into + query strings. + + +.. function:: parse_qsl(qs[, keep_blank_values[, strict_parsing]]) + + Parse a query string given as a string argument (data of type + :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of + name, value pairs. + + The optional argument *keep_blank_values* is a flag indicating whether blank + values in URL encoded queries should be treated as blank strings. A true value + indicates that blanks should be retained as blank strings. The default false + value indicates that blank values are to be ignored and treated as if they were + not included. + + The optional argument *strict_parsing* is a flag indicating what to do with + parsing errors. If false (the default), errors are silently ignored. If true, + errors raise a :exc:`ValueError` exception. + + Use the :func:`urllib.urlencode` function to convert such lists of pairs into + query strings. + + +.. function:: parse_multipart(fp, pdict) + + Parse input of type :mimetype:`multipart/form-data` (for file uploads). + Arguments are *fp* for the input file and *pdict* for a dictionary containing + other parameters in the :mailheader:`Content-Type` header. + + Returns a dictionary just like :func:`parse_qs` keys are the field names, each + value is a list of values for that field. This is easy to use but not much good + if you are expecting megabytes to be uploaded --- in that case, use the + :class:`FieldStorage` class instead which is much more flexible. + + Note that this does not parse nested multipart parts --- use + :class:`FieldStorage` for that. + + +.. function:: parse_header(string) + + Parse a MIME header (such as :mailheader:`Content-Type`) into a main value and a + dictionary of parameters. + + +.. function:: test() + + Robust test CGI script, usable as main program. Writes minimal HTTP headers and + formats all information provided to the script in HTML form. + + +.. function:: print_environ() + + Format the shell environment in HTML. + + +.. function:: print_form(form) + + Format a form in HTML. + + +.. function:: print_directory() + + Format the current directory in HTML. + + +.. function:: print_environ_usage() + + Print a list of useful (used by CGI) environment variables in HTML. + + +.. function:: escape(s[, quote]) + + Convert the characters ``'&'``, ``'<'`` and ``'>'`` in string *s* to HTML-safe + sequences. Use this if you need to display text that might contain such + characters in HTML. If the optional flag *quote* is true, the quotation mark + character (``'"'``) is also translated; this helps for inclusion in an HTML + attribute value, as in ````. If the value to be quoted might + include single- or double-quote characters, or both, consider using the + :func:`quoteattr` function in the :mod:`xml.sax.saxutils` module instead. + + +.. _cgi-security: + +Caring about security +--------------------- + +.. index:: pair: CGI; security + +There's one important rule: if you invoke an external program (via the +:func:`os.system` or :func:`os.popen` functions. or others with similar +functionality), make very sure you don't pass arbitrary strings received from +the client to the shell. This is a well-known security hole whereby clever +hackers anywhere on the Web can exploit a gullible CGI script to invoke +arbitrary shell commands. Even parts of the URL or field names cannot be +trusted, since the request doesn't have to come from your form! + +To be on the safe side, if you must pass a string gotten from a form to a shell +command, you should make sure the string contains only alphanumeric characters, +dashes, underscores, and periods. + + +Installing your CGI script on a Unix system +------------------------------------------- + +Read the documentation for your HTTP server and check with your local system +administrator to find the directory where CGI scripts should be installed; +usually this is in a directory :file:`cgi-bin` in the server tree. + +Make sure that your script is readable and executable by "others"; the Unix file +mode should be ``0755`` octal (use ``chmod 0755 filename``). Make sure that the +first line of the script contains ``#!`` starting in column 1 followed by the +pathname of the Python interpreter, for instance:: + + #!/usr/local/bin/python + +Make sure the Python interpreter exists and is executable by "others". + +Make sure that any files your script needs to read or write are readable or +writable, respectively, by "others" --- their mode should be ``0644`` for +readable and ``0666`` for writable. This is because, for security reasons, the +HTTP server executes your script as user "nobody", without any special +privileges. It can only read (write, execute) files that everybody can read +(write, execute). The current directory at execution time is also different (it +is usually the server's cgi-bin directory) and the set of environment variables +is also different from what you get when you log in. In particular, don't count +on the shell's search path for executables (:envvar:`PATH`) or the Python module +search path (:envvar:`PYTHONPATH`) to be set to anything interesting. + +If you need to load modules from a directory which is not on Python's default +module search path, you can change the path in your script, before importing +other modules. For example:: + + import sys + sys.path.insert(0, "/usr/home/joe/lib/python") + sys.path.insert(0, "/usr/local/lib/python") + +(This way, the directory inserted last will be searched first!) + +Instructions for non-Unix systems will vary; check your HTTP server's +documentation (it will usually have a section on CGI scripts). + + +Testing your CGI script +----------------------- + +Unfortunately, a CGI script will generally not run when you try it from the +command line, and a script that works perfectly from the command line may fail +mysteriously when run from the server. There's one reason why you should still +test your script from the command line: if it contains a syntax error, the +Python interpreter won't execute it at all, and the HTTP server will most likely +send a cryptic error to the client. + +Assuming your script has no syntax errors, yet it does not work, you have no +choice but to read the next section. + + +Debugging CGI scripts +--------------------- + +.. index:: pair: CGI; debugging + +First of all, check for trivial installation errors --- reading the section +above on installing your CGI script carefully can save you a lot of time. If +you wonder whether you have understood the installation procedure correctly, try +installing a copy of this module file (:file:`cgi.py`) as a CGI script. When +invoked as a script, the file will dump its environment and the contents of the +form in HTML form. Give it the right mode etc, and send it a request. If it's +installed in the standard :file:`cgi-bin` directory, it should be possible to +send it a request by entering a URL into your browser of the form:: + + http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home + +If this gives an error of type 404, the server cannot find the script -- perhaps +you need to install it in a different directory. If it gives another error, +there's an installation problem that you should fix before trying to go any +further. If you get a nicely formatted listing of the environment and form +content (in this example, the fields should be listed as "addr" with value "At +Home" and "name" with value "Joe Blow"), the :file:`cgi.py` script has been +installed correctly. If you follow the same procedure for your own script, you +should now be able to debug it. + +The next step could be to call the :mod:`cgi` module's :func:`test` function +from your script: replace its main code with the single statement :: + + cgi.test() + +This should produce the same results as those gotten from installing the +:file:`cgi.py` file itself. + +When an ordinary Python script raises an unhandled exception (for whatever +reason: of a typo in a module name, a file that can't be opened, etc.), the +Python interpreter prints a nice traceback and exits. While the Python +interpreter will still do this when your CGI script raises an exception, most +likely the traceback will end up in one of the HTTP server's log files, or be +discarded altogether. + +Fortunately, once you have managed to get your script to execute *some* code, +you can easily send tracebacks to the Web browser using the :mod:`cgitb` module. +If you haven't done so already, just add the line:: + + import cgitb; cgitb.enable() + +to the top of your script. Then try running it again; when a problem occurs, +you should see a detailed report that will likely make apparent the cause of the +crash. + +If you suspect that there may be a problem in importing the :mod:`cgitb` module, +you can use an even more robust approach (which only uses built-in modules):: + + import sys + sys.stderr = sys.stdout + print "Content-Type: text/plain" + print + ...your code here... + +This relies on the Python interpreter to print the traceback. The content type +of the output is set to plain text, which disables all HTML processing. If your +script works, the raw HTML will be displayed by your client. If it raises an +exception, most likely after the first two lines have been printed, a traceback +will be displayed. Because no HTML interpretation is going on, the traceback +will be readable. + + +Common problems and solutions +----------------------------- + +* Most HTTP servers buffer the output from CGI scripts until the script is + completed. This means that it is not possible to display a progress report on + the client's display while the script is running. + +* Check the installation instructions above. + +* Check the HTTP server's log files. (``tail -f logfile`` in a separate window + may be useful!) + +* Always check a script for syntax errors first, by doing something like + ``python script.py``. + +* If your script does not have any syntax errors, try adding ``import cgitb; + cgitb.enable()`` to the top of the script. + +* When invoking external programs, make sure they can be found. Usually, this + means using absolute path names --- :envvar:`PATH` is usually not set to a very + useful value in a CGI script. + +* When reading or writing external files, make sure they can be read or written + by the userid under which your CGI script will be running: this is typically the + userid under which the web server is running, or some explicitly specified + userid for a web server's ``suexec`` feature. + +* Don't try to give a CGI script a set-uid mode. This doesn't work on most + systems, and is a security liability as well. + +.. rubric:: Footnotes + +.. [#] Note that some recent versions of the HTML specification do state what order the + field values should be supplied in, but knowing whether a request was + received from a conforming browser, or even from a browser at all, is tedious + and error-prone. + diff --git a/Doc/library/cgihttpserver.rst b/Doc/library/cgihttpserver.rst new file mode 100644 index 0000000..4f27627 --- /dev/null +++ b/Doc/library/cgihttpserver.rst @@ -0,0 +1,73 @@ + +:mod:`CGIHTTPServer` --- CGI-capable HTTP request handler +========================================================= + +.. module:: CGIHTTPServer + :synopsis: This module provides a request handler for HTTP servers which can run CGI + scripts. +.. sectionauthor:: Moshe Zadka + + +The :mod:`CGIHTTPServer` module defines a request-handler class, interface +compatible with :class:`BaseHTTPServer.BaseHTTPRequestHandler` and inherits +behavior from :class:`SimpleHTTPServer.SimpleHTTPRequestHandler` but can also +run CGI scripts. + +.. note:: + + This module can run CGI scripts on Unix and Windows systems; on Mac OS it will + only be able to run Python scripts within the same process as itself. + +.. note:: + + CGI scripts run by the :class:`CGIHTTPRequestHandler` class cannot execute + redirects (HTTP code 302), because code 200 (script output follows) is sent + prior to execution of the CGI script. This pre-empts the status code. + +The :mod:`CGIHTTPServer` module defines the following class: + + +.. class:: CGIHTTPRequestHandler(request, client_address, server) + + This class is used to serve either files or output of CGI scripts from the + current directory and below. Note that mapping HTTP hierarchic structure to + local directory structure is exactly as in + :class:`SimpleHTTPServer.SimpleHTTPRequestHandler`. + + The class will however, run the CGI script, instead of serving it as a file, if + it guesses it to be a CGI script. Only directory-based CGI are used --- the + other common server configuration is to treat special extensions as denoting CGI + scripts. + + The :func:`do_GET` and :func:`do_HEAD` functions are modified to run CGI scripts + and serve the output, instead of serving files, if the request leads to + somewhere below the ``cgi_directories`` path. + +The :class:`CGIHTTPRequestHandler` defines the following data member: + + +.. attribute:: CGIHTTPRequestHandler.cgi_directories + + This defaults to ``['/cgi-bin', '/htbin']`` and describes directories to treat + as containing CGI scripts. + +The :class:`CGIHTTPRequestHandler` defines the following methods: + + +.. method:: CGIHTTPRequestHandler.do_POST() + + This method serves the ``'POST'`` request type, only allowed for CGI scripts. + Error 501, "Can only POST to CGI scripts", is output when trying to POST to a + non-CGI url. + +Note that CGI scripts will be run with UID of user nobody, for security reasons. +Problems with the CGI script will be translated to error 403. + +For example usage, see the implementation of the :func:`test` function. + + +.. seealso:: + + Module :mod:`BaseHTTPServer` + Base class implementation for Web server and request handler. + diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst new file mode 100644 index 0000000..327cd17 --- /dev/null +++ b/Doc/library/cgitb.rst @@ -0,0 +1,64 @@ + +:mod:`cgitb` --- Traceback manager for CGI scripts +================================================== + +.. module:: cgitb + :synopsis: Configurable traceback handler for CGI scripts. +.. moduleauthor:: Ka-Ping Yee +.. sectionauthor:: Fred L. Drake, Jr. + + +.. versionadded:: 2.2 + +.. index:: + single: CGI; exceptions + single: CGI; tracebacks + single: exceptions; in CGI scripts + single: tracebacks; in CGI scripts + +The :mod:`cgitb` module provides a special exception handler for Python scripts. +(Its name is a bit misleading. It was originally designed to display extensive +traceback information in HTML for CGI scripts. It was later generalized to also +display this information in plain text.) After this module is activated, if an +uncaught exception occurs, a detailed, formatted report will be displayed. The +report includes a traceback showing excerpts of the source code for each level, +as well as the values of the arguments and local variables to currently running +functions, to help you debug the problem. Optionally, you can save this +information to a file instead of sending it to the browser. + +To enable this feature, simply add one line to the top of your CGI script:: + + import cgitb; cgitb.enable() + +The options to the :func:`enable` function control whether the report is +displayed in the browser and whether the report is logged to a file for later +analysis. + + +.. function:: enable([display[, logdir[, context[, format]]]]) + + .. index:: single: excepthook() (in module sys) + + This function causes the :mod:`cgitb` module to take over the interpreter's + default handling for exceptions by setting the value of :attr:`sys.excepthook`. + + The optional argument *display* defaults to ``1`` and can be set to ``0`` to + suppress sending the traceback to the browser. If the argument *logdir* is + present, the traceback reports are written to files. The value of *logdir* + should be a directory where these files will be placed. The optional argument + *context* is the number of lines of context to display around the current line + of source code in the traceback; this defaults to ``5``. If the optional + argument *format* is ``"html"``, the output is formatted as HTML. Any other + value forces plain text output. The default value is ``"html"``. + + +.. function:: handler([info]) + + This function handles an exception using the default settings (that is, show a + report in the browser, but don't log to a file). This can be used when you've + caught an exception and want to report it using :mod:`cgitb`. The optional + *info* argument should be a 3-tuple containing an exception type, exception + value, and traceback object, exactly like the tuple returned by + :func:`sys.exc_info`. If the *info* argument is not supplied, the current + exception is obtained from :func:`sys.exc_info`. + diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst new file mode 100644 index 0000000..2e1798d --- /dev/null +++ b/Doc/library/chunk.rst @@ -0,0 +1,130 @@ + +:mod:`chunk` --- Read IFF chunked data +====================================== + +.. module:: chunk + :synopsis: Module to read IFF chunks. +.. moduleauthor:: Sjoerd Mullender +.. sectionauthor:: Sjoerd Mullender + + +.. index:: + single: Audio Interchange File Format + single: AIFF + single: AIFF-C + single: Real Media File Format + single: RMFF + +This module provides an interface for reading files that use EA IFF 85 chunks. +[#]_ This format is used in at least the Audio Interchange File Format +(AIFF/AIFF-C) and the Real Media File Format (RMFF). The WAVE audio file format +is closely related and can also be read using this module. + +A chunk has the following structure: + ++---------+--------+-------------------------------+ +| Offset | Length | Contents | ++=========+========+===============================+ +| 0 | 4 | Chunk ID | ++---------+--------+-------------------------------+ +| 4 | 4 | Size of chunk in big-endian | +| | | byte order, not including the | +| | | header | ++---------+--------+-------------------------------+ +| 8 | *n* | Data bytes, where *n* is the | +| | | size given in the preceding | +| | | field | ++---------+--------+-------------------------------+ +| 8 + *n* | 0 or 1 | Pad byte needed if *n* is odd | +| | | and chunk alignment is used | ++---------+--------+-------------------------------+ + +The ID is a 4-byte string which identifies the type of chunk. + +The size field (a 32-bit value, encoded using big-endian byte order) gives the +size of the chunk data, not including the 8-byte header. + +Usually an IFF-type file consists of one or more chunks. The proposed usage of +the :class:`Chunk` class defined here is to instantiate an instance at the start +of each chunk and read from the instance until it reaches the end, after which a +new instance can be instantiated. At the end of the file, creating a new +instance will fail with a :exc:`EOFError` exception. + + +.. class:: Chunk(file[, align, bigendian, inclheader]) + + Class which represents a chunk. The *file* argument is expected to be a + file-like object. An instance of this class is specifically allowed. The + only method that is needed is :meth:`read`. If the methods :meth:`seek` and + :meth:`tell` are present and don't raise an exception, they are also used. + If these methods are present and raise an exception, they are expected to not + have altered the object. If the optional argument *align* is true, chunks + are assumed to be aligned on 2-byte boundaries. If *align* is false, no + alignment is assumed. The default value is true. If the optional argument + *bigendian* is false, the chunk size is assumed to be in little-endian order. + This is needed for WAVE audio files. The default value is true. If the + optional argument *inclheader* is true, the size given in the chunk header + includes the size of the header. The default value is false. + +A :class:`Chunk` object supports the following methods: + + +.. method:: Chunk.getname() + + Returns the name (ID) of the chunk. This is the first 4 bytes of the chunk. + + +.. method:: Chunk.getsize() + + Returns the size of the chunk. + + +.. method:: Chunk.close() + + Close and skip to the end of the chunk. This does not close the underlying + file. + +The remaining methods will raise :exc:`IOError` if called after the +:meth:`close` method has been called. + + +.. method:: Chunk.isatty() + + Returns ``False``. + + +.. method:: Chunk.seek(pos[, whence]) + + Set the chunk's current position. The *whence* argument is optional and + defaults to ``0`` (absolute file positioning); other values are ``1`` (seek + relative to the current position) and ``2`` (seek relative to the file's end). + There is no return value. If the underlying file does not allow seek, only + forward seeks are allowed. + + +.. method:: Chunk.tell() + + Return the current position into the chunk. + + +.. method:: Chunk.read([size]) + + Read at most *size* bytes from the chunk (less if the read hits the end of the + chunk before obtaining *size* bytes). If the *size* argument is negative or + omitted, read all data until the end of the chunk. The bytes are returned as a + string object. An empty string is returned when the end of the chunk is + encountered immediately. + + +.. method:: Chunk.skip() + + Skip to the end of the chunk. All further calls to :meth:`read` for the chunk + will return ``''``. If you are not interested in the contents of the chunk, + this method should be called so that the file points to the start of the next + chunk. + +.. rubric:: Footnotes + +.. [#] "EA IFF 85" Standard for Interchange Format Files, Jerry Morrison, Electronic + Arts, January 1985. + diff --git a/Doc/library/cmath.rst b/Doc/library/cmath.rst new file mode 100644 index 0000000..2bc162c --- /dev/null +++ b/Doc/library/cmath.rst @@ -0,0 +1,156 @@ + +:mod:`cmath` --- Mathematical functions for complex numbers +=========================================================== + +.. module:: cmath + :synopsis: Mathematical functions for complex numbers. + + +This module is always available. It provides access to mathematical functions +for complex numbers. The functions in this module accept integers, +floating-point numbers or complex numbers as arguments. They will also accept +any Python object that has either a :meth:`__complex__` or a :meth:`__float__` +method: these methods are used to convert the object to a complex or +floating-point number, respectively, and the function is then applied to the +result of the conversion. + +The functions are: + + +.. function:: acos(x) + + Return the arc cosine of *x*. There are two branch cuts: One extends right from + 1 along the real axis to ∞, continuous from below. The other extends left from + -1 along the real axis to -∞, continuous from above. + + +.. function:: acosh(x) + + Return the hyperbolic arc cosine of *x*. There is one branch cut, extending left + from 1 along the real axis to -∞, continuous from above. + + +.. function:: asin(x) + + Return the arc sine of *x*. This has the same branch cuts as :func:`acos`. + + +.. function:: asinh(x) + + Return the hyperbolic arc sine of *x*. There are two branch cuts, extending + left from ``±1j`` to ``±∞j``, both continuous from above. These branch cuts + should be considered a bug to be corrected in a future release. The correct + branch cuts should extend along the imaginary axis, one from ``1j`` up to + ``∞j`` and continuous from the right, and one from ``-1j`` down to ``-∞j`` + and continuous from the left. + + +.. function:: atan(x) + + Return the arc tangent of *x*. There are two branch cuts: One extends from + ``1j`` along the imaginary axis to ``∞j``, continuous from the left. The + other extends from ``-1j`` along the imaginary axis to ``-∞j``, continuous + from the left. (This should probably be changed so the upper cut becomes + continuous from the other side.) + + +.. function:: atanh(x) + + Return the hyperbolic arc tangent of *x*. There are two branch cuts: One + extends from ``1`` along the real axis to ``∞``, continuous from above. The + other extends from ``-1`` along the real axis to ``-∞``, continuous from + above. (This should probably be changed so the right cut becomes continuous + from the other side.) + + +.. function:: cos(x) + + Return the cosine of *x*. + + +.. function:: cosh(x) + + Return the hyperbolic cosine of *x*. + + +.. function:: exp(x) + + Return the exponential value ``e**x``. + + +.. function:: log(x[, base]) + + Returns the logarithm of *x* to the given *base*. If the *base* is not + specified, returns the natural logarithm of *x*. There is one branch cut, from 0 + along the negative real axis to -∞, continuous from above. + + .. versionchanged:: 2.4 + *base* argument added. + + +.. function:: log10(x) + + Return the base-10 logarithm of *x*. This has the same branch cut as + :func:`log`. + + +.. function:: sin(x) + + Return the sine of *x*. + + +.. function:: sinh(x) + + Return the hyperbolic sine of *x*. + + +.. function:: sqrt(x) + + Return the square root of *x*. This has the same branch cut as :func:`log`. + + +.. function:: tan(x) + + Return the tangent of *x*. + + +.. function:: tanh(x) + + Return the hyperbolic tangent of *x*. + +The module also defines two mathematical constants: + + +.. data:: pi + + The mathematical constant *pi*, as a float. + + +.. data:: e + + The mathematical constant *e*, as a float. + +.. index:: module: math + +Note that the selection of functions is similar, but not identical, to that in +module :mod:`math`. The reason for having two modules is that some users aren't +interested in complex numbers, and perhaps don't even know what they are. They +would rather have ``math.sqrt(-1)`` raise an exception than return a complex +number. Also note that the functions defined in :mod:`cmath` always return a +complex number, even if the answer can be expressed as a real number (in which +case the complex number has an imaginary part of zero). + +A note on branch cuts: They are curves along which the given function fails to +be continuous. They are a necessary feature of many complex functions. It is +assumed that if you need to compute with complex functions, you will understand +about branch cuts. Consult almost any (not too elementary) book on complex +variables for enlightenment. For information of the proper choice of branch +cuts for numerical purposes, a good reference should be the following: + + +.. seealso:: + + Kahan, W: Branch cuts for complex elementary functions; or, Much ado about + nothing's sign bit. In Iserles, A., and Powell, M. (eds.), The state of the art + in numerical analysis. Clarendon Press (1987) pp165-211. + diff --git a/Doc/library/cmd.rst b/Doc/library/cmd.rst new file mode 100644 index 0000000..9af08e2 --- /dev/null +++ b/Doc/library/cmd.rst @@ -0,0 +1,202 @@ + +:mod:`cmd` --- Support for line-oriented command interpreters +============================================================= + +.. module:: cmd + :synopsis: Build line-oriented command interpreters. +.. sectionauthor:: Eric S. Raymond + + +The :class:`Cmd` class provides a simple framework for writing line-oriented +command interpreters. These are often useful for test harnesses, administrative +tools, and prototypes that will later be wrapped in a more sophisticated +interface. + + +.. class:: Cmd([completekey[, stdin[, stdout]]]) + + A :class:`Cmd` instance or subclass instance is a line-oriented interpreter + framework. There is no good reason to instantiate :class:`Cmd` itself; rather, + it's useful as a superclass of an interpreter class you define yourself in order + to inherit :class:`Cmd`'s methods and encapsulate action methods. + + The optional argument *completekey* is the :mod:`readline` name of a completion + key; it defaults to :kbd:`Tab`. If *completekey* is not :const:`None` and + :mod:`readline` is available, command completion is done automatically. + + The optional arguments *stdin* and *stdout* specify the input and output file + objects that the Cmd instance or subclass instance will use for input and + output. If not specified, they will default to *sys.stdin* and *sys.stdout*. + + .. versionchanged:: 2.3 + The *stdin* and *stdout* parameters were added. + + +.. _cmd-objects: + +Cmd Objects +----------- + +A :class:`Cmd` instance has the following methods: + + +.. method:: Cmd.cmdloop([intro]) + + Repeatedly issue a prompt, accept input, parse an initial prefix off the + received input, and dispatch to action methods, passing them the remainder of + the line as argument. + + The optional argument is a banner or intro string to be issued before the first + prompt (this overrides the :attr:`intro` class member). + + If the :mod:`readline` module is loaded, input will automatically inherit + :program:`bash`\ -like history-list editing (e.g. :kbd:`Control-P` scrolls back + to the last command, :kbd:`Control-N` forward to the next one, :kbd:`Control-F` + moves the cursor to the right non-destructively, :kbd:`Control-B` moves the + cursor to the left non-destructively, etc.). + + An end-of-file on input is passed back as the string ``'EOF'``. + + An interpreter instance will recognize a command name ``foo`` if and only if it + has a method :meth:`do_foo`. As a special case, a line beginning with the + character ``'?'`` is dispatched to the method :meth:`do_help`. As another + special case, a line beginning with the character ``'!'`` is dispatched to the + method :meth:`do_shell` (if such a method is defined). + + This method will return when the :meth:`postcmd` method returns a true value. + The *stop* argument to :meth:`postcmd` is the return value from the command's + corresponding :meth:`do_\*` method. + + If completion is enabled, completing commands will be done automatically, and + completing of commands args is done by calling :meth:`complete_foo` with + arguments *text*, *line*, *begidx*, and *endidx*. *text* is the string prefix + we are attempting to match: all returned matches must begin with it. *line* is + the current input line with leading whitespace removed, *begidx* and *endidx* + are the beginning and ending indexes of the prefix text, which could be used to + provide different completion depending upon which position the argument is in. + + All subclasses of :class:`Cmd` inherit a predefined :meth:`do_help`. This + method, called with an argument ``'bar'``, invokes the corresponding method + :meth:`help_bar`. With no argument, :meth:`do_help` lists all available help + topics (that is, all commands with corresponding :meth:`help_\*` methods), and + also lists any undocumented commands. + + +.. method:: Cmd.onecmd(str) + + Interpret the argument as though it had been typed in response to the prompt. + This may be overridden, but should not normally need to be; see the + :meth:`precmd` and :meth:`postcmd` methods for useful execution hooks. The + return value is a flag indicating whether interpretation of commands by the + interpreter should stop. If there is a :meth:`do_\*` method for the command + *str*, the return value of that method is returned, otherwise the return value + from the :meth:`default` method is returned. + + +.. method:: Cmd.emptyline() + + Method called when an empty line is entered in response to the prompt. If this + method is not overridden, it repeats the last nonempty command entered. + + +.. method:: Cmd.default(line) + + Method called on an input line when the command prefix is not recognized. If + this method is not overridden, it prints an error message and returns. + + +.. method:: Cmd.completedefault(text, line, begidx, endidx) + + Method called to complete an input line when no command-specific + :meth:`complete_\*` method is available. By default, it returns an empty list. + + +.. method:: Cmd.precmd(line) + + Hook method executed just before the command line *line* is interpreted, but + after the input prompt is generated and issued. This method is a stub in + :class:`Cmd`; it exists to be overridden by subclasses. The return value is + used as the command which will be executed by the :meth:`onecmd` method; the + :meth:`precmd` implementation may re-write the command or simply return *line* + unchanged. + + +.. method:: Cmd.postcmd(stop, line) + + Hook method executed just after a command dispatch is finished. This method is + a stub in :class:`Cmd`; it exists to be overridden by subclasses. *line* is the + command line which was executed, and *stop* is a flag which indicates whether + execution will be terminated after the call to :meth:`postcmd`; this will be the + return value of the :meth:`onecmd` method. The return value of this method will + be used as the new value for the internal flag which corresponds to *stop*; + returning false will cause interpretation to continue. + + +.. method:: Cmd.preloop() + + Hook method executed once when :meth:`cmdloop` is called. This method is a stub + in :class:`Cmd`; it exists to be overridden by subclasses. + + +.. method:: Cmd.postloop() + + Hook method executed once when :meth:`cmdloop` is about to return. This method + is a stub in :class:`Cmd`; it exists to be overridden by subclasses. + +Instances of :class:`Cmd` subclasses have some public instance variables: + + +.. attribute:: Cmd.prompt + + The prompt issued to solicit input. + + +.. attribute:: Cmd.identchars + + The string of characters accepted for the command prefix. + + +.. attribute:: Cmd.lastcmd + + The last nonempty command prefix seen. + + +.. attribute:: Cmd.intro + + A string to issue as an intro or banner. May be overridden by giving the + :meth:`cmdloop` method an argument. + + +.. attribute:: Cmd.doc_header + + The header to issue if the help output has a section for documented commands. + + +.. attribute:: Cmd.misc_header + + The header to issue if the help output has a section for miscellaneous help + topics (that is, there are :meth:`help_\*` methods without corresponding + :meth:`do_\*` methods). + + +.. attribute:: Cmd.undoc_header + + The header to issue if the help output has a section for undocumented commands + (that is, there are :meth:`do_\*` methods without corresponding :meth:`help_\*` + methods). + + +.. attribute:: Cmd.ruler + + The character used to draw separator lines under the help-message headers. If + empty, no ruler line is drawn. It defaults to ``'='``. + + +.. attribute:: Cmd.use_rawinput + + A flag, defaulting to true. If true, :meth:`cmdloop` uses :func:`input` to + display a prompt and read the next command; if false, :meth:`sys.stdout.write` + and :meth:`sys.stdin.readline` are used. (This means that by importing + :mod:`readline`, on systems that support it, the interpreter will automatically + support :program:`Emacs`\ -like line editing and command-history keystrokes.) + diff --git a/Doc/library/code.rst b/Doc/library/code.rst new file mode 100644 index 0000000..4e00639 --- /dev/null +++ b/Doc/library/code.rst @@ -0,0 +1,167 @@ + +:mod:`code` --- Interpreter base classes +======================================== + +.. module:: code + :synopsis: Facilities to implement read-eval-print loops. + + + +The ``code`` module provides facilities to implement read-eval-print loops in +Python. Two classes and convenience functions are included which can be used to +build applications which provide an interactive interpreter prompt. + + +.. class:: InteractiveInterpreter([locals]) + + This class deals with parsing and interpreter state (the user's namespace); it + does not deal with input buffering or prompting or input file naming (the + filename is always passed in explicitly). The optional *locals* argument + specifies the dictionary in which code will be executed; it defaults to a newly + created dictionary with key ``'__name__'`` set to ``'__console__'`` and key + ``'__doc__'`` set to ``None``. + + +.. class:: InteractiveConsole([locals[, filename]]) + + Closely emulate the behavior of the interactive Python interpreter. This class + builds on :class:`InteractiveInterpreter` and adds prompting using the familiar + ``sys.ps1`` and ``sys.ps2``, and input buffering. + + +.. function:: interact([banner[, readfunc[, local]]]) + + Convenience function to run a read-eval-print loop. This creates a new instance + of :class:`InteractiveConsole` and sets *readfunc* to be used as the + :meth:`raw_input` method, if provided. If *local* is provided, it is passed to + the :class:`InteractiveConsole` constructor for use as the default namespace for + the interpreter loop. The :meth:`interact` method of the instance is then run + with *banner* passed as the banner to use, if provided. The console object is + discarded after use. + + +.. function:: compile_command(source[, filename[, symbol]]) + + This function is useful for programs that want to emulate Python's interpreter + main loop (a.k.a. the read-eval-print loop). The tricky part is to determine + when the user has entered an incomplete command that can be completed by + entering more text (as opposed to a complete command or a syntax error). This + function *almost* always makes the same decision as the real interpreter main + loop. + + *source* is the source string; *filename* is the optional filename from which + source was read, defaulting to ``''``; and *symbol* is the optional + grammar start symbol, which should be either ``'single'`` (the default) or + ``'eval'``. + + Returns a code object (the same as ``compile(source, filename, symbol)``) if the + command is complete and valid; ``None`` if the command is incomplete; raises + :exc:`SyntaxError` if the command is complete and contains a syntax error, or + raises :exc:`OverflowError` or :exc:`ValueError` if the command contains an + invalid literal. + + +.. _interpreter-objects: + +Interactive Interpreter Objects +------------------------------- + + +.. method:: InteractiveInterpreter.runsource(source[, filename[, symbol]]) + + Compile and run some source in the interpreter. Arguments are the same as for + :func:`compile_command`; the default for *filename* is ``''``, and for + *symbol* is ``'single'``. One several things can happen: + + * The input is incorrect; :func:`compile_command` raised an exception + (:exc:`SyntaxError` or :exc:`OverflowError`). A syntax traceback will be + printed by calling the :meth:`showsyntaxerror` method. :meth:`runsource` + returns ``False``. + + * The input is incomplete, and more input is required; :func:`compile_command` + returned ``None``. :meth:`runsource` returns ``True``. + + * The input is complete; :func:`compile_command` returned a code object. The + code is executed by calling the :meth:`runcode` (which also handles run-time + exceptions, except for :exc:`SystemExit`). :meth:`runsource` returns ``False``. + + The return value can be used to decide whether to use ``sys.ps1`` or ``sys.ps2`` + to prompt the next line. + + +.. method:: InteractiveInterpreter.runcode(code) + + Execute a code object. When an exception occurs, :meth:`showtraceback` is called + to display a traceback. All exceptions are caught except :exc:`SystemExit`, + which is allowed to propagate. + + A note about :exc:`KeyboardInterrupt`: this exception may occur elsewhere in + this code, and may not always be caught. The caller should be prepared to deal + with it. + + +.. method:: InteractiveInterpreter.showsyntaxerror([filename]) + + Display the syntax error that just occurred. This does not display a stack + trace because there isn't one for syntax errors. If *filename* is given, it is + stuffed into the exception instead of the default filename provided by Python's + parser, because it always uses ``''`` when reading from a string. The + output is written by the :meth:`write` method. + + +.. method:: InteractiveInterpreter.showtraceback() + + Display the exception that just occurred. We remove the first stack item + because it is within the interpreter object implementation. The output is + written by the :meth:`write` method. + + +.. method:: InteractiveInterpreter.write(data) + + Write a string to the standard error stream (``sys.stderr``). Derived classes + should override this to provide the appropriate output handling as needed. + + +.. _console-objects: + +Interactive Console Objects +--------------------------- + +The :class:`InteractiveConsole` class is a subclass of +:class:`InteractiveInterpreter`, and so offers all the methods of the +interpreter objects as well as the following additions. + + +.. method:: InteractiveConsole.interact([banner]) + + Closely emulate the interactive Python console. The optional banner argument + specify the banner to print before the first interaction; by default it prints a + banner similar to the one printed by the standard Python interpreter, followed + by the class name of the console object in parentheses (so as not to confuse + this with the real interpreter -- since it's so close!). + + +.. method:: InteractiveConsole.push(line) + + Push a line of source text to the interpreter. The line should not have a + trailing newline; it may have internal newlines. The line is appended to a + buffer and the interpreter's :meth:`runsource` method is called with the + concatenated contents of the buffer as source. If this indicates that the + command was executed or invalid, the buffer is reset; otherwise, the command is + incomplete, and the buffer is left as it was after the line was appended. The + return value is ``True`` if more input is required, ``False`` if the line was + dealt with in some way (this is the same as :meth:`runsource`). + + +.. method:: InteractiveConsole.resetbuffer() + + Remove any unhandled source text from the input buffer. + + +.. method:: InteractiveConsole.raw_input([prompt]) + + Write a prompt and read a line. The returned line does not include the trailing + newline. When the user enters the EOF key sequence, :exc:`EOFError` is raised. + The base implementation reads from ``sys.stdin``; a subclass may replace this + with a different implementation. + diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst new file mode 100644 index 0000000..38264df --- /dev/null +++ b/Doc/library/codecs.rst @@ -0,0 +1,1230 @@ + +:mod:`codecs` --- Codec registry and base classes +================================================= + +.. module:: codecs + :synopsis: Encode and decode data and streams. +.. moduleauthor:: Marc-Andre Lemburg +.. sectionauthor:: Marc-Andre Lemburg +.. sectionauthor:: Martin v. Löwis + + +.. index:: + single: Unicode + single: Codecs + pair: Codecs; encode + pair: Codecs; decode + single: streams + pair: stackable; streams + +This module defines base classes for standard Python codecs (encoders and +decoders) and provides access to the internal Python codec registry which +manages the codec and error handling lookup process. + +It defines the following functions: + + +.. function:: register(search_function) + + Register a codec search function. Search functions are expected to take one + argument, the encoding name in all lower case letters, and return a + :class:`CodecInfo` object having the following attributes: + + * ``name`` The name of the encoding; + + * ``encoder`` The stateless encoding function; + + * ``decoder`` The stateless decoding function; + + * ``incrementalencoder`` An incremental encoder class or factory function; + + * ``incrementaldecoder`` An incremental decoder class or factory function; + + * ``streamwriter`` A stream writer class or factory function; + + * ``streamreader`` A stream reader class or factory function. + + The various functions or classes take the following arguments: + + *encoder* and *decoder*: These must be functions or methods which have the same + interface as the :meth:`encode`/:meth:`decode` methods of Codec instances (see + Codec Interface). The functions/methods are expected to work in a stateless + mode. + + *incrementalencoder* and *incrementalencoder*: These have to be factory + functions providing the following interface: + + ``factory(errors='strict')`` + + The factory functions must return objects providing the interfaces defined by + the base classes :class:`IncrementalEncoder` and :class:`IncrementalEncoder`, + respectively. Incremental codecs can maintain state. + + *streamreader* and *streamwriter*: These have to be factory functions providing + the following interface: + + ``factory(stream, errors='strict')`` + + The factory functions must return objects providing the interfaces defined by + the base classes :class:`StreamWriter` and :class:`StreamReader`, respectively. + Stream codecs can maintain state. + + Possible values for errors are ``'strict'`` (raise an exception in case of an + encoding error), ``'replace'`` (replace malformed data with a suitable + replacement marker, such as ``'?'``), ``'ignore'`` (ignore malformed data and + continue without further notice), ``'xmlcharrefreplace'`` (replace with the + appropriate XML character reference (for encoding only)) and + ``'backslashreplace'`` (replace with backslashed escape sequences (for encoding + only)) as well as any other error handling name defined via + :func:`register_error`. + + In case a search function cannot find a given encoding, it should return + ``None``. + + +.. function:: lookup(encoding) + + Looks up the codec info in the Python codec registry and returns a + :class:`CodecInfo` object as defined above. + + Encodings are first looked up in the registry's cache. If not found, the list of + registered search functions is scanned. If no :class:`CodecInfo` object is + found, a :exc:`LookupError` is raised. Otherwise, the :class:`CodecInfo` object + is stored in the cache and returned to the caller. + +To simplify access to the various codecs, the module provides these additional +functions which use :func:`lookup` for the codec lookup: + + +.. function:: getencoder(encoding) + + Look up the codec for the given encoding and return its encoder function. + + Raises a :exc:`LookupError` in case the encoding cannot be found. + + +.. function:: getdecoder(encoding) + + Look up the codec for the given encoding and return its decoder function. + + Raises a :exc:`LookupError` in case the encoding cannot be found. + + +.. function:: getincrementalencoder(encoding) + + Look up the codec for the given encoding and return its incremental encoder + class or factory function. + + Raises a :exc:`LookupError` in case the encoding cannot be found or the codec + doesn't support an incremental encoder. + + .. versionadded:: 2.5 + + +.. function:: getincrementaldecoder(encoding) + + Look up the codec for the given encoding and return its incremental decoder + class or factory function. + + Raises a :exc:`LookupError` in case the encoding cannot be found or the codec + doesn't support an incremental decoder. + + .. versionadded:: 2.5 + + +.. function:: getreader(encoding) + + Look up the codec for the given encoding and return its StreamReader class or + factory function. + + Raises a :exc:`LookupError` in case the encoding cannot be found. + + +.. function:: getwriter(encoding) + + Look up the codec for the given encoding and return its StreamWriter class or + factory function. + + Raises a :exc:`LookupError` in case the encoding cannot be found. + + +.. function:: register_error(name, error_handler) + + Register the error handling function *error_handler* under the name *name*. + *error_handler* will be called during encoding and decoding in case of an error, + when *name* is specified as the errors parameter. + + For encoding *error_handler* will be called with a :exc:`UnicodeEncodeError` + instance, which contains information about the location of the error. The error + handler must either raise this or a different exception or return a tuple with a + replacement for the unencodable part of the input and a position where encoding + should continue. The encoder will encode the replacement and continue encoding + the original input at the specified position. Negative position values will be + treated as being relative to the end of the input string. If the resulting + position is out of bound an :exc:`IndexError` will be raised. + + Decoding and translating works similar, except :exc:`UnicodeDecodeError` or + :exc:`UnicodeTranslateError` will be passed to the handler and that the + replacement from the error handler will be put into the output directly. + + +.. function:: lookup_error(name) + + Return the error handler previously registered under the name *name*. + + Raises a :exc:`LookupError` in case the handler cannot be found. + + +.. function:: strict_errors(exception) + + Implements the ``strict`` error handling. + + +.. function:: replace_errors(exception) + + Implements the ``replace`` error handling. + + +.. function:: ignore_errors(exception) + + Implements the ``ignore`` error handling. + + +.. function:: xmlcharrefreplace_errors_errors(exception) + + Implements the ``xmlcharrefreplace`` error handling. + + +.. function:: backslashreplace_errors_errors(exception) + + Implements the ``backslashreplace`` error handling. + +To simplify working with encoded files or stream, the module also defines these +utility functions: + + +.. function:: open(filename, mode[, encoding[, errors[, buffering]]]) + + Open an encoded file using the given *mode* and return a wrapped version + providing transparent encoding/decoding. + + .. note:: + + The wrapped version will only accept the object format defined by the codecs, + i.e. Unicode objects for most built-in codecs. Output is also codec-dependent + and will usually be Unicode as well. + + *encoding* specifies the encoding which is to be used for the file. + + *errors* may be given to define the error handling. It defaults to ``'strict'`` + which causes a :exc:`ValueError` to be raised in case an encoding error occurs. + + *buffering* has the same meaning as for the built-in :func:`open` function. It + defaults to line buffered. + + +.. function:: EncodedFile(file, input[, output[, errors]]) + + Return a wrapped version of file which provides transparent encoding + translation. + + Strings written to the wrapped file are interpreted according to the given + *input* encoding and then written to the original file as strings using the + *output* encoding. The intermediate encoding will usually be Unicode but depends + on the specified codecs. + + If *output* is not given, it defaults to *input*. + + *errors* may be given to define the error handling. It defaults to ``'strict'``, + which causes :exc:`ValueError` to be raised in case an encoding error occurs. + + +.. function:: iterencode(iterable, encoding[, errors]) + + Uses an incremental encoder to iteratively encode the input provided by + *iterable*. This function is a generator. *errors* (as well as any other keyword + argument) is passed through to the incremental encoder. + + .. versionadded:: 2.5 + + +.. function:: iterdecode(iterable, encoding[, errors]) + + Uses an incremental decoder to iteratively decode the input provided by + *iterable*. This function is a generator. *errors* (as well as any other keyword + argument) is passed through to the incremental decoder. + + .. versionadded:: 2.5 + +The module also provides the following constants which are useful for reading +and writing to platform dependent files: + + +.. data:: BOM + BOM_BE + BOM_LE + BOM_UTF8 + BOM_UTF16 + BOM_UTF16_BE + BOM_UTF16_LE + BOM_UTF32 + BOM_UTF32_BE + BOM_UTF32_LE + + These constants define various encodings of the Unicode byte order mark (BOM) + used in UTF-16 and UTF-32 data streams to indicate the byte order used in the + stream or file and in UTF-8 as a Unicode signature. :const:`BOM_UTF16` is either + :const:`BOM_UTF16_BE` or :const:`BOM_UTF16_LE` depending on the platform's + native byte order, :const:`BOM` is an alias for :const:`BOM_UTF16`, + :const:`BOM_LE` for :const:`BOM_UTF16_LE` and :const:`BOM_BE` for + :const:`BOM_UTF16_BE`. The others represent the BOM in UTF-8 and UTF-32 + encodings. + + +.. _codec-base-classes: + +Codec Base Classes +------------------ + +The :mod:`codecs` module defines a set of base classes which define the +interface and can also be used to easily write you own codecs for use in Python. + +Each codec has to define four interfaces to make it usable as codec in Python: +stateless encoder, stateless decoder, stream reader and stream writer. The +stream reader and writers typically reuse the stateless encoder/decoder to +implement the file protocols. + +The :class:`Codec` class defines the interface for stateless encoders/decoders. + +To simplify and standardize error handling, the :meth:`encode` and +:meth:`decode` methods may implement different error handling schemes by +providing the *errors* string argument. The following string values are defined +and implemented by all standard Python codecs: + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | +| | this is the default. | ++-------------------------+-----------------------------------------------+ +| ``'ignore'`` | Ignore the character and continue with the | +| | next. | ++-------------------------+-----------------------------------------------+ +| ``'replace'`` | Replace with a suitable replacement | +| | character; Python will use the official | +| | U+FFFD REPLACEMENT CHARACTER for the built-in | +| | Unicode codecs on decoding and '?' on | +| | encoding. | ++-------------------------+-----------------------------------------------+ +| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | +| | reference (only for encoding). | ++-------------------------+-----------------------------------------------+ +| ``'backslashreplace'`` | Replace with backslashed escape sequences | +| | (only for encoding). | ++-------------------------+-----------------------------------------------+ + +The set of allowed values can be extended via :meth:`register_error`. + + +.. _codec-objects: + +Codec Objects +^^^^^^^^^^^^^ + +The :class:`Codec` class defines these methods which also define the function +interfaces of the stateless encoder and decoder: + + +.. method:: Codec.encode(input[, errors]) + + Encodes the object *input* and returns a tuple (output object, length consumed). + While codecs are not restricted to use with Unicode, in a Unicode context, + encoding converts a Unicode object to a plain string using a particular + character set encoding (e.g., ``cp1252`` or ``iso-8859-1``). + + *errors* defines the error handling to apply. It defaults to ``'strict'`` + handling. + + The method may not store state in the :class:`Codec` instance. Use + :class:`StreamCodec` for codecs which have to keep state in order to make + encoding/decoding efficient. + + The encoder must be able to handle zero length input and return an empty object + of the output object type in this situation. + + +.. method:: Codec.decode(input[, errors]) + + Decodes the object *input* and returns a tuple (output object, length consumed). + In a Unicode context, decoding converts a plain string encoded using a + particular character set encoding to a Unicode object. + + *input* must be an object which provides the ``bf_getreadbuf`` buffer slot. + Python strings, buffer objects and memory mapped files are examples of objects + providing this slot. + + *errors* defines the error handling to apply. It defaults to ``'strict'`` + handling. + + The method may not store state in the :class:`Codec` instance. Use + :class:`StreamCodec` for codecs which have to keep state in order to make + encoding/decoding efficient. + + The decoder must be able to handle zero length input and return an empty object + of the output object type in this situation. + +The :class:`IncrementalEncoder` and :class:`IncrementalDecoder` classes provide +the basic interface for incremental encoding and decoding. Encoding/decoding the +input isn't done with one call to the stateless encoder/decoder function, but +with multiple calls to the :meth:`encode`/:meth:`decode` method of the +incremental encoder/decoder. The incremental encoder/decoder keeps track of the +encoding/decoding process during method calls. + +The joined output of calls to the :meth:`encode`/:meth:`decode` method is the +same as if all the single inputs were joined into one, and this input was +encoded/decoded with the stateless encoder/decoder. + + +.. _incremental-encoder-objects: + +IncrementalEncoder Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. versionadded:: 2.5 + +The :class:`IncrementalEncoder` class is used for encoding an input in multiple +steps. It defines the following methods which every incremental encoder must +define in order to be compatible with the Python codec registry. + + +.. class:: IncrementalEncoder([errors]) + + Constructor for an :class:`IncrementalEncoder` instance. + + All incremental encoders must provide this constructor interface. They are free + to add additional keyword arguments, but only the ones defined here are used by + the Python codec registry. + + The :class:`IncrementalEncoder` may implement different error handling schemes + by providing the *errors* keyword argument. These parameters are predefined: + + * ``'strict'`` Raise :exc:`ValueError` (or a subclass); this is the default. + + * ``'ignore'`` Ignore the character and continue with the next. + + * ``'replace'`` Replace with a suitable replacement character + + * ``'xmlcharrefreplace'`` Replace with the appropriate XML character reference + + * ``'backslashreplace'`` Replace with backslashed escape sequences. + + The *errors* argument will be assigned to an attribute of the same name. + Assigning to this attribute makes it possible to switch between different error + handling strategies during the lifetime of the :class:`IncrementalEncoder` + object. + + The set of allowed values for the *errors* argument can be extended with + :func:`register_error`. + + +.. method:: IncrementalEncoder.encode(object[, final]) + + Encodes *object* (taking the current state of the encoder into account) and + returns the resulting encoded object. If this is the last call to :meth:`encode` + *final* must be true (the default is false). + + +.. method:: IncrementalEncoder.reset() + + Reset the encoder to the initial state. + + +.. method:: IncrementalEncoder.getstate() + + Return the current state of the encoder which must be an integer. The + implementation should make sure that ``0`` is the most common state. (States + that are more complicated than integers can be converted into an integer by + marshaling/pickling the state and encoding the bytes of the resulting string + into an integer). + + .. versionadded:: 3.0 + + +.. method:: IncrementalEncoder.setstate(state) + + Set the state of the encoder to *state*. *state* must be an encoder state + returned by :meth:`getstate`. + + .. versionadded:: 3.0 + + +.. _incremental-decoder-objects: + +IncrementalDecoder Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :class:`IncrementalDecoder` class is used for decoding an input in multiple +steps. It defines the following methods which every incremental decoder must +define in order to be compatible with the Python codec registry. + + +.. class:: IncrementalDecoder([errors]) + + Constructor for an :class:`IncrementalDecoder` instance. + + All incremental decoders must provide this constructor interface. They are free + to add additional keyword arguments, but only the ones defined here are used by + the Python codec registry. + + The :class:`IncrementalDecoder` may implement different error handling schemes + by providing the *errors* keyword argument. These parameters are predefined: + + * ``'strict'`` Raise :exc:`ValueError` (or a subclass); this is the default. + + * ``'ignore'`` Ignore the character and continue with the next. + + * ``'replace'`` Replace with a suitable replacement character. + + The *errors* argument will be assigned to an attribute of the same name. + Assigning to this attribute makes it possible to switch between different error + handling strategies during the lifetime of the :class:`IncrementalEncoder` + object. + + The set of allowed values for the *errors* argument can be extended with + :func:`register_error`. + + +.. method:: IncrementalDecoder.decode(object[, final]) + + Decodes *object* (taking the current state of the decoder into account) and + returns the resulting decoded object. If this is the last call to :meth:`decode` + *final* must be true (the default is false). If *final* is true the decoder must + decode the input completely and must flush all buffers. If this isn't possible + (e.g. because of incomplete byte sequences at the end of the input) it must + initiate error handling just like in the stateless case (which might raise an + exception). + + +.. method:: IncrementalDecoder.reset() + + Reset the decoder to the initial state. + + +.. method:: IncrementalDecoder.getstate() + + Return the current state of the decoder. This must be a tuple with two items, + the first must be the buffer containing the still undecoded input. The second + must be an integer and can be additional state info. (The implementation should + make sure that ``0`` is the most common additional state info.) If this + additional state info is ``0`` it must be possible to set the decoder to the + state which has no input buffered and ``0`` as the additional state info, so + that feeding the previously buffered input to the decoder returns it to the + previous state without producing any output. (Additional state info that is more + complicated than integers can be converted into an integer by + marshaling/pickling the info and encoding the bytes of the resulting string into + an integer.) + + .. versionadded:: 3.0 + + +.. method:: IncrementalDecoder.setstate(state) + + Set the state of the encoder to *state*. *state* must be a decoder state + returned by :meth:`getstate`. + + .. versionadded:: 3.0 + +The :class:`StreamWriter` and :class:`StreamReader` classes provide generic +working interfaces which can be used to implement new encoding submodules very +easily. See :mod:`encodings.utf_8` for an example of how this is done. + + +.. _stream-writer-objects: + +StreamWriter Objects +^^^^^^^^^^^^^^^^^^^^ + +The :class:`StreamWriter` class is a subclass of :class:`Codec` and defines the +following methods which every stream writer must define in order to be +compatible with the Python codec registry. + + +.. class:: StreamWriter(stream[, errors]) + + Constructor for a :class:`StreamWriter` instance. + + All stream writers must provide this constructor interface. They are free to add + additional keyword arguments, but only the ones defined here are used by the + Python codec registry. + + *stream* must be a file-like object open for writing binary data. + + The :class:`StreamWriter` may implement different error handling schemes by + providing the *errors* keyword argument. These parameters are predefined: + + * ``'strict'`` Raise :exc:`ValueError` (or a subclass); this is the default. + + * ``'ignore'`` Ignore the character and continue with the next. + + * ``'replace'`` Replace with a suitable replacement character + + * ``'xmlcharrefreplace'`` Replace with the appropriate XML character reference + + * ``'backslashreplace'`` Replace with backslashed escape sequences. + + The *errors* argument will be assigned to an attribute of the same name. + Assigning to this attribute makes it possible to switch between different error + handling strategies during the lifetime of the :class:`StreamWriter` object. + + The set of allowed values for the *errors* argument can be extended with + :func:`register_error`. + + +.. method:: StreamWriter.write(object) + + Writes the object's contents encoded to the stream. + + +.. method:: StreamWriter.writelines(list) + + Writes the concatenated list of strings to the stream (possibly by reusing the + :meth:`write` method). + + +.. method:: StreamWriter.reset() + + Flushes and resets the codec buffers used for keeping state. + + Calling this method should ensure that the data on the output is put into a + clean state that allows appending of new fresh data without having to rescan the + whole stream to recover state. + +In addition to the above methods, the :class:`StreamWriter` must also inherit +all other methods and attributes from the underlying stream. + + +.. _stream-reader-objects: + +StreamReader Objects +^^^^^^^^^^^^^^^^^^^^ + +The :class:`StreamReader` class is a subclass of :class:`Codec` and defines the +following methods which every stream reader must define in order to be +compatible with the Python codec registry. + + +.. class:: StreamReader(stream[, errors]) + + Constructor for a :class:`StreamReader` instance. + + All stream readers must provide this constructor interface. They are free to add + additional keyword arguments, but only the ones defined here are used by the + Python codec registry. + + *stream* must be a file-like object open for reading (binary) data. + + The :class:`StreamReader` may implement different error handling schemes by + providing the *errors* keyword argument. These parameters are defined: + + * ``'strict'`` Raise :exc:`ValueError` (or a subclass); this is the default. + + * ``'ignore'`` Ignore the character and continue with the next. + + * ``'replace'`` Replace with a suitable replacement character. + + The *errors* argument will be assigned to an attribute of the same name. + Assigning to this attribute makes it possible to switch between different error + handling strategies during the lifetime of the :class:`StreamReader` object. + + The set of allowed values for the *errors* argument can be extended with + :func:`register_error`. + + +.. method:: StreamReader.read([size[, chars, [firstline]]]) + + Decodes data from the stream and returns the resulting object. + + *chars* indicates the number of characters to read from the stream. :func:`read` + will never return more than *chars* characters, but it might return less, if + there are not enough characters available. + + *size* indicates the approximate maximum number of bytes to read from the stream + for decoding purposes. The decoder can modify this setting as appropriate. The + default value -1 indicates to read and decode as much as possible. *size* is + intended to prevent having to decode huge files in one step. + + *firstline* indicates that it would be sufficient to only return the first line, + if there are decoding errors on later lines. + + The method should use a greedy read strategy meaning that it should read as much + data as is allowed within the definition of the encoding and the given size, + e.g. if optional encoding endings or state markers are available on the stream, + these should be read too. + + .. versionchanged:: 2.4 + *chars* argument added. + + .. versionchanged:: 2.4.2 + *firstline* argument added. + + +.. method:: StreamReader.readline([size[, keepends]]) + + Read one line from the input stream and return the decoded data. + + *size*, if given, is passed as size argument to the stream's :meth:`readline` + method. + + If *keepends* is false line-endings will be stripped from the lines returned. + + .. versionchanged:: 2.4 + *keepends* argument added. + + +.. method:: StreamReader.readlines([sizehint[, keepends]]) + + Read all lines available on the input stream and return them as a list of lines. + + Line-endings are implemented using the codec's decoder method and are included + in the list entries if *keepends* is true. + + *sizehint*, if given, is passed as the *size* argument to the stream's + :meth:`read` method. + + +.. method:: StreamReader.reset() + + Resets the codec buffers used for keeping state. + + Note that no stream repositioning should take place. This method is primarily + intended to be able to recover from decoding errors. + +In addition to the above methods, the :class:`StreamReader` must also inherit +all other methods and attributes from the underlying stream. + +The next two base classes are included for convenience. They are not needed by +the codec registry, but may provide useful in practice. + + +.. _stream-reader-writer: + +StreamReaderWriter Objects +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :class:`StreamReaderWriter` allows wrapping streams which work in both read +and write modes. + +The design is such that one can use the factory functions returned by the +:func:`lookup` function to construct the instance. + + +.. class:: StreamReaderWriter(stream, Reader, Writer, errors) + + Creates a :class:`StreamReaderWriter` instance. *stream* must be a file-like + object. *Reader* and *Writer* must be factory functions or classes providing the + :class:`StreamReader` and :class:`StreamWriter` interface resp. Error handling + is done in the same way as defined for the stream readers and writers. + +:class:`StreamReaderWriter` instances define the combined interfaces of +:class:`StreamReader` and :class:`StreamWriter` classes. They inherit all other +methods and attributes from the underlying stream. + + +.. _stream-recoder-objects: + +StreamRecoder Objects +^^^^^^^^^^^^^^^^^^^^^ + +The :class:`StreamRecoder` provide a frontend - backend view of encoding data +which is sometimes useful when dealing with different encoding environments. + +The design is such that one can use the factory functions returned by the +:func:`lookup` function to construct the instance. + + +.. class:: StreamRecoder(stream, encode, decode, Reader, Writer, errors) + + Creates a :class:`StreamRecoder` instance which implements a two-way conversion: + *encode* and *decode* work on the frontend (the input to :meth:`read` and output + of :meth:`write`) while *Reader* and *Writer* work on the backend (reading and + writing to the stream). + + You can use these objects to do transparent direct recodings from e.g. Latin-1 + to UTF-8 and back. + + *stream* must be a file-like object. + + *encode*, *decode* must adhere to the :class:`Codec` interface. *Reader*, + *Writer* must be factory functions or classes providing objects of the + :class:`StreamReader` and :class:`StreamWriter` interface respectively. + + *encode* and *decode* are needed for the frontend translation, *Reader* and + *Writer* for the backend translation. The intermediate format used is + determined by the two sets of codecs, e.g. the Unicode codecs will use Unicode + as the intermediate encoding. + + Error handling is done in the same way as defined for the stream readers and + writers. + +:class:`StreamRecoder` instances define the combined interfaces of +:class:`StreamReader` and :class:`StreamWriter` classes. They inherit all other +methods and attributes from the underlying stream. + + +.. _encodings-overview: + +Encodings and Unicode +--------------------- + +Unicode strings are stored internally as sequences of codepoints (to be precise +as :ctype:`Py_UNICODE` arrays). Depending on the way Python is compiled (either +via :option:`--enable-unicode=ucs2` or :option:`--enable-unicode=ucs4`, with the +former being the default) :ctype:`Py_UNICODE` is either a 16-bit or 32-bit data +type. Once a Unicode object is used outside of CPU and memory, CPU endianness +and how these arrays are stored as bytes become an issue. Transforming a +unicode object into a sequence of bytes is called encoding and recreating the +unicode object from the sequence of bytes is known as decoding. There are many +different methods for how this transformation can be done (these methods are +also called encodings). The simplest method is to map the codepoints 0-255 to +the bytes ``0x0``-``0xff``. This means that a unicode object that contains +codepoints above ``U+00FF`` can't be encoded with this method (which is called +``'latin-1'`` or ``'iso-8859-1'``). :func:`unicode.encode` will raise a +:exc:`UnicodeEncodeError` that looks like this: ``UnicodeEncodeError: 'latin-1' +codec can't encode character u'\u1234' in position 3: ordinal not in +range(256)``. + +There's another group of encodings (the so called charmap encodings) that choose +a different subset of all unicode code points and how these codepoints are +mapped to the bytes ``0x0``-``0xff``. To see how this is done simply open +e.g. :file:`encodings/cp1252.py` (which is an encoding that is used primarily on +Windows). There's a string constant with 256 characters that shows you which +character is mapped to which byte value. + +All of these encodings can only encode 256 of the 65536 (or 1114111) codepoints +defined in unicode. A simple and straightforward way that can store each Unicode +code point, is to store each codepoint as two consecutive bytes. There are two +possibilities: Store the bytes in big endian or in little endian order. These +two encodings are called UTF-16-BE and UTF-16-LE respectively. Their +disadvantage is that if e.g. you use UTF-16-BE on a little endian machine you +will always have to swap bytes on encoding and decoding. UTF-16 avoids this +problem: Bytes will always be in natural endianness. When these bytes are read +by a CPU with a different endianness, then bytes have to be swapped though. To +be able to detect the endianness of a UTF-16 byte sequence, there's the so +called BOM (the "Byte Order Mark"). This is the Unicode character ``U+FEFF``. +This character will be prepended to every UTF-16 byte sequence. The byte swapped +version of this character (``0xFFFE``) is an illegal character that may not +appear in a Unicode text. So when the first character in an UTF-16 byte sequence +appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. +Unfortunately upto Unicode 4.0 the character ``U+FEFF`` had a second purpose as +a ``ZERO WIDTH NO-BREAK SPACE``: A character that has no width and doesn't allow +a word to be split. It can e.g. be used to give hints to a ligature algorithm. +With Unicode 4.0 using ``U+FEFF`` as a ``ZERO WIDTH NO-BREAK SPACE`` has been +deprecated (with ``U+2060`` (``WORD JOINER``) assuming this role). Nevertheless +Unicode software still must be able to handle ``U+FEFF`` in both roles: As a BOM +it's a device to determine the storage layout of the encoded bytes, and vanishes +once the byte sequence has been decoded into a Unicode string; as a ``ZERO WIDTH +NO-BREAK SPACE`` it's a normal character that will be decoded like any other. + +There's another encoding that is able to encoding the full range of Unicode +characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues +with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two +parts: Marker bits (the most significant bits) and payload bits. The marker bits +are a sequence of zero to six 1 bits followed by a 0 bit. Unicode characters are +encoded like this (with x being payload bits, which when concatenated give the +Unicode character): + ++-----------------------------------+----------------------------------------------+ +| Range | Encoding | ++===================================+==============================================+ +| ``U-00000000`` ... ``U-0000007F`` | 0xxxxxxx | ++-----------------------------------+----------------------------------------------+ +| ``U-00000080`` ... ``U-000007FF`` | 110xxxxx 10xxxxxx | ++-----------------------------------+----------------------------------------------+ +| ``U-00000800`` ... ``U-0000FFFF`` | 1110xxxx 10xxxxxx 10xxxxxx | ++-----------------------------------+----------------------------------------------+ +| ``U-00010000`` ... ``U-001FFFFF`` | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | ++-----------------------------------+----------------------------------------------+ +| ``U-00200000`` ... ``U-03FFFFFF`` | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | ++-----------------------------------+----------------------------------------------+ +| ``U-04000000`` ... ``U-7FFFFFFF`` | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | +| | 10xxxxxx | ++-----------------------------------+----------------------------------------------+ + +The least significant bit of the Unicode character is the rightmost x bit. + +As UTF-8 is an 8-bit encoding no BOM is required and any ``U+FEFF`` character in +the decoded Unicode string (even if it's the first character) is treated as a +``ZERO WIDTH NO-BREAK SPACE``. + +Without external information it's impossible to reliably determine which +encoding was used for encoding a Unicode string. Each charmap encoding can +decode any random byte sequence. However that's not possible with UTF-8, as +UTF-8 byte sequences have a structure that doesn't allow arbitrary byte +sequence. To increase the reliability with which a UTF-8 encoding can be +detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls +``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters +is written to the file, a UTF-8 encoded BOM (which looks like this as a byte +sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable +that any charmap encoded file starts with these byte values (which would e.g. +map to + + | LATIN SMALL LETTER I WITH DIAERESIS + | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + | INVERTED QUESTION MARK + +in iso-8859-1), this increases the probability that a utf-8-sig encoding can be +correctly guessed from the byte sequence. So here the BOM is not used to be able +to determine the byte order used for generating the byte sequence, but as a +signature that helps in guessing the encoding. On encoding the utf-8-sig codec +will write ``0xef``, ``0xbb``, ``0xbf`` as the first three bytes to the file. On +decoding utf-8-sig will skip those three bytes if they appear as the first three +bytes in the file. + + +.. _standard-encodings: + +Standard Encodings +------------------ + +Python comes with a number of codecs built-in, either implemented as C functions +or with dictionaries as mapping tables. The following table lists the codecs by +name, together with a few common aliases, and the languages for which the +encoding is likely used. Neither the list of aliases nor the list of languages +is meant to be exhaustive. Notice that spelling alternatives that only differ in +case or use a hyphen instead of an underscore are also valid aliases. + +Many of the character sets support the same languages. They vary in individual +characters (e.g. whether the EURO SIGN is supported or not), and in the +assignment of characters to code positions. For the European languages in +particular, the following variants typically exist: + +* an ISO 8859 codeset + +* a Microsoft Windows code page, which is typically derived from a 8859 codeset, + but replaces control characters with additional graphic characters + +* an IBM EBCDIC code page + +* an IBM PC code page, which is ASCII compatible + ++-----------------+--------------------------------+--------------------------------+ +| Codec | Aliases | Languages | ++=================+================================+================================+ +| ascii | 646, us-ascii | English | ++-----------------+--------------------------------+--------------------------------+ +| big5 | big5-tw, csbig5 | Traditional Chinese | ++-----------------+--------------------------------+--------------------------------+ +| big5hkscs | big5-hkscs, hkscs | Traditional Chinese | ++-----------------+--------------------------------+--------------------------------+ +| cp037 | IBM037, IBM039 | English | ++-----------------+--------------------------------+--------------------------------+ +| cp424 | EBCDIC-CP-HE, IBM424 | Hebrew | ++-----------------+--------------------------------+--------------------------------+ +| cp437 | 437, IBM437 | English | ++-----------------+--------------------------------+--------------------------------+ +| cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, | Western Europe | +| | IBM500 | | ++-----------------+--------------------------------+--------------------------------+ +| cp737 | | Greek | ++-----------------+--------------------------------+--------------------------------+ +| cp775 | IBM775 | Baltic languages | ++-----------------+--------------------------------+--------------------------------+ +| cp850 | 850, IBM850 | Western Europe | ++-----------------+--------------------------------+--------------------------------+ +| cp852 | 852, IBM852 | Central and Eastern Europe | ++-----------------+--------------------------------+--------------------------------+ +| cp855 | 855, IBM855 | Bulgarian, Byelorussian, | +| | | Macedonian, Russian, Serbian | ++-----------------+--------------------------------+--------------------------------+ +| cp856 | | Hebrew | ++-----------------+--------------------------------+--------------------------------+ +| cp857 | 857, IBM857 | Turkish | ++-----------------+--------------------------------+--------------------------------+ +| cp860 | 860, IBM860 | Portuguese | ++-----------------+--------------------------------+--------------------------------+ +| cp861 | 861, CP-IS, IBM861 | Icelandic | ++-----------------+--------------------------------+--------------------------------+ +| cp862 | 862, IBM862 | Hebrew | ++-----------------+--------------------------------+--------------------------------+ +| cp863 | 863, IBM863 | Canadian | ++-----------------+--------------------------------+--------------------------------+ +| cp864 | IBM864 | Arabic | ++-----------------+--------------------------------+--------------------------------+ +| cp865 | 865, IBM865 | Danish, Norwegian | ++-----------------+--------------------------------+--------------------------------+ +| cp866 | 866, IBM866 | Russian | ++-----------------+--------------------------------+--------------------------------+ +| cp869 | 869, CP-GR, IBM869 | Greek | ++-----------------+--------------------------------+--------------------------------+ +| cp874 | | Thai | ++-----------------+--------------------------------+--------------------------------+ +| cp875 | | Greek | ++-----------------+--------------------------------+--------------------------------+ +| cp932 | 932, ms932, mskanji, ms-kanji | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| cp949 | 949, ms949, uhc | Korean | ++-----------------+--------------------------------+--------------------------------+ +| cp950 | 950, ms950 | Traditional Chinese | ++-----------------+--------------------------------+--------------------------------+ +| cp1006 | | Urdu | ++-----------------+--------------------------------+--------------------------------+ +| cp1026 | ibm1026 | Turkish | ++-----------------+--------------------------------+--------------------------------+ +| cp1140 | ibm1140 | Western Europe | ++-----------------+--------------------------------+--------------------------------+ +| cp1250 | windows-1250 | Central and Eastern Europe | ++-----------------+--------------------------------+--------------------------------+ +| cp1251 | windows-1251 | Bulgarian, Byelorussian, | +| | | Macedonian, Russian, Serbian | ++-----------------+--------------------------------+--------------------------------+ +| cp1252 | windows-1252 | Western Europe | ++-----------------+--------------------------------+--------------------------------+ +| cp1253 | windows-1253 | Greek | ++-----------------+--------------------------------+--------------------------------+ +| cp1254 | windows-1254 | Turkish | ++-----------------+--------------------------------+--------------------------------+ +| cp1255 | windows-1255 | Hebrew | ++-----------------+--------------------------------+--------------------------------+ +| cp1256 | windows1256 | Arabic | ++-----------------+--------------------------------+--------------------------------+ +| cp1257 | windows-1257 | Baltic languages | ++-----------------+--------------------------------+--------------------------------+ +| cp1258 | windows-1258 | Vietnamese | ++-----------------+--------------------------------+--------------------------------+ +| euc_jp | eucjp, ujis, u-jis | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| euc_jis_2004 | jisx0213, eucjis2004 | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| euc_jisx0213 | eucjisx0213 | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| euc_kr | euckr, korean, ksc5601, | Korean | +| | ks_c-5601, ks_c-5601-1987, | | +| | ksx1001, ks_x-1001 | | ++-----------------+--------------------------------+--------------------------------+ +| gb2312 | chinese, csiso58gb231280, euc- | Simplified Chinese | +| | cn, euccn, eucgb2312-cn, | | +| | gb2312-1980, gb2312-80, iso- | | +| | ir-58 | | ++-----------------+--------------------------------+--------------------------------+ +| gbk | 936, cp936, ms936 | Unified Chinese | ++-----------------+--------------------------------+--------------------------------+ +| gb18030 | gb18030-2000 | Unified Chinese | ++-----------------+--------------------------------+--------------------------------+ +| hz | hzgb, hz-gb, hz-gb-2312 | Simplified Chinese | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp | csiso2022jp, iso2022jp, | Japanese | +| | iso-2022-jp | | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | Japanese, Korean, Simplified | +| | | Chinese, Western Europe, Greek | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp_2004 | iso2022jp-2004, | Japanese | +| | iso-2022-jp-2004 | | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | Japanese | ++-----------------+--------------------------------+--------------------------------+ +| iso2022_kr | csiso2022kr, iso2022kr, | Korean | +| | iso-2022-kr | | ++-----------------+--------------------------------+--------------------------------+ +| latin_1 | iso-8859-1, iso8859-1, 8859, | West Europe | +| | cp819, latin, latin1, L1 | | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_2 | iso-8859-2, latin2, L2 | Central and Eastern Europe | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_3 | iso-8859-3, latin3, L3 | Esperanto, Maltese | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_4 | iso-8859-4, latin4, L4 | Baltic languagues | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_5 | iso-8859-5, cyrillic | Bulgarian, Byelorussian, | +| | | Macedonian, Russian, Serbian | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_6 | iso-8859-6, arabic | Arabic | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_7 | iso-8859-7, greek, greek8 | Greek | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_8 | iso-8859-8, hebrew | Hebrew | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_9 | iso-8859-9, latin5, L5 | Turkish | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_10 | iso-8859-10, latin6, L6 | Nordic languages | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_13 | iso-8859-13 | Baltic languages | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_14 | iso-8859-14, latin8, L8 | Celtic languages | ++-----------------+--------------------------------+--------------------------------+ +| iso8859_15 | iso-8859-15 | Western Europe | ++-----------------+--------------------------------+--------------------------------+ +| johab | cp1361, ms1361 | Korean | ++-----------------+--------------------------------+--------------------------------+ +| koi8_r | | Russian | ++-----------------+--------------------------------+--------------------------------+ +| koi8_u | | Ukrainian | ++-----------------+--------------------------------+--------------------------------+ +| mac_cyrillic | maccyrillic | Bulgarian, Byelorussian, | +| | | Macedonian, Russian, Serbian | ++-----------------+--------------------------------+--------------------------------+ +| mac_greek | macgreek | Greek | ++-----------------+--------------------------------+--------------------------------+ +| mac_iceland | maciceland | Icelandic | ++-----------------+--------------------------------+--------------------------------+ +| mac_latin2 | maclatin2, maccentraleurope | Central and Eastern Europe | ++-----------------+--------------------------------+--------------------------------+ +| mac_roman | macroman | Western Europe | ++-----------------+--------------------------------+--------------------------------+ +| mac_turkish | macturkish | Turkish | ++-----------------+--------------------------------+--------------------------------+ +| ptcp154 | csptcp154, pt154, cp154, | Kazakh | +| | cyrillic-asian | | ++-----------------+--------------------------------+--------------------------------+ +| shift_jis | csshiftjis, shiftjis, sjis, | Japanese | +| | s_jis | | ++-----------------+--------------------------------+--------------------------------+ +| shift_jis_2004 | shiftjis2004, sjis_2004, | Japanese | +| | sjis2004 | | ++-----------------+--------------------------------+--------------------------------+ +| shift_jisx0213 | shiftjisx0213, sjisx0213, | Japanese | +| | s_jisx0213 | | ++-----------------+--------------------------------+--------------------------------+ +| utf_16 | U16, utf16 | all languages | ++-----------------+--------------------------------+--------------------------------+ +| utf_16_be | UTF-16BE | all languages (BMP only) | ++-----------------+--------------------------------+--------------------------------+ +| utf_16_le | UTF-16LE | all languages (BMP only) | ++-----------------+--------------------------------+--------------------------------+ +| utf_7 | U7, unicode-1-1-utf-7 | all languages | ++-----------------+--------------------------------+--------------------------------+ +| utf_8 | U8, UTF, utf8 | all languages | ++-----------------+--------------------------------+--------------------------------+ +| utf_8_sig | | all languages | ++-----------------+--------------------------------+--------------------------------+ + +A number of codecs are specific to Python, so their codec names have no meaning +outside Python. Some of them don't convert from Unicode strings to byte strings, +but instead use the property of the Python codecs machinery that any bijective +function with one argument can be considered as an encoding. + +For the codecs listed below, the result in the "encoding" direction is always a +byte string. The result of the "decoding" direction is listed as operand type in +the table. + ++--------------------+---------+----------------+---------------------------+ +| Codec | Aliases | Operand type | Purpose | ++====================+=========+================+===========================+ +| idna | | Unicode string | Implements :rfc:`3490`, | +| | | | see also | +| | | | :mod:`encodings.idna` | ++--------------------+---------+----------------+---------------------------+ +| mbcs | dbcs | Unicode string | Windows only: Encode | +| | | | operand according to the | +| | | | ANSI codepage (CP_ACP) | ++--------------------+---------+----------------+---------------------------+ +| palmos | | Unicode string | Encoding of PalmOS 3.5 | ++--------------------+---------+----------------+---------------------------+ +| punycode | | Unicode string | Implements :rfc:`3492` | ++--------------------+---------+----------------+---------------------------+ +| raw_unicode_escape | | Unicode string | Produce a string that is | +| | | | suitable as raw Unicode | +| | | | literal in Python source | +| | | | code | ++--------------------+---------+----------------+---------------------------+ +| undefined | | any | Raise an exception for | +| | | | all conversions. Can be | +| | | | used as the system | +| | | | encoding if no automatic | +| | | | coercion between byte and | +| | | | Unicode strings is | +| | | | desired. | ++--------------------+---------+----------------+---------------------------+ +| unicode_escape | | Unicode string | Produce a string that is | +| | | | suitable as Unicode | +| | | | literal in Python source | +| | | | code | ++--------------------+---------+----------------+---------------------------+ +| unicode_internal | | Unicode string | Return the internal | +| | | | representation of the | +| | | | operand | ++--------------------+---------+----------------+---------------------------+ + +.. versionadded:: 2.3 + The ``idna`` and ``punycode`` encodings. + + +:mod:`encodings.idna` --- Internationalized Domain Names in Applications +------------------------------------------------------------------------ + +.. module:: encodings.idna + :synopsis: Internationalized Domain Names implementation +.. moduleauthor:: Martin v. Löwis + +.. versionadded:: 2.3 + +This module implements :rfc:`3490` (Internationalized Domain Names in +Applications) and :rfc:`3492` (Nameprep: A Stringprep Profile for +Internationalized Domain Names (IDN)). It builds upon the ``punycode`` encoding +and :mod:`stringprep`. + +These RFCs together define a protocol to support non-ASCII characters in domain +names. A domain name containing non-ASCII characters (such as +``www.Alliancefrançaise.nu``) is converted into an ASCII-compatible encoding +(ACE, such as ``www.xn--alliancefranaise-npb.nu``). The ACE form of the domain +name is then used in all places where arbitrary characters are not allowed by +the protocol, such as DNS queries, HTTP :mailheader:`Host` fields, and so +on. This conversion is carried out in the application; if possible invisible to +the user: The application should transparently convert Unicode domain labels to +IDNA on the wire, and convert back ACE labels to Unicode before presenting them +to the user. + +Python supports this conversion in several ways: The ``idna`` codec allows to +convert between Unicode and the ACE. Furthermore, the :mod:`socket` module +transparently converts Unicode host names to ACE, so that applications need not +be concerned about converting host names themselves when they pass them to the +socket module. On top of that, modules that have host names as function +parameters, such as :mod:`httplib` and :mod:`ftplib`, accept Unicode host names +(:mod:`httplib` then also transparently sends an IDNA hostname in the +:mailheader:`Host` field if it sends that field at all). + +When receiving host names from the wire (such as in reverse name lookup), no +automatic conversion to Unicode is performed: Applications wishing to present +such host names to the user should decode them to Unicode. + +The module :mod:`encodings.idna` also implements the nameprep procedure, which +performs certain normalizations on host names, to achieve case-insensitivity of +international domain names, and to unify similar characters. The nameprep +functions can be used directly if desired. + + +.. function:: nameprep(label) + + Return the nameprepped version of *label*. The implementation currently assumes + query strings, so ``AllowUnassigned`` is true. + + +.. function:: ToASCII(label) + + Convert a label to ASCII, as specified in :rfc:`3490`. ``UseSTD3ASCIIRules`` is + assumed to be false. + + +.. function:: ToUnicode(label) + + Convert a label to Unicode, as specified in :rfc:`3490`. + + +:mod:`encodings.utf_8_sig` --- UTF-8 codec with BOM signature +------------------------------------------------------------- + +.. module:: encodings.utf_8_sig + :synopsis: UTF-8 codec with BOM signature +.. moduleauthor:: Walter Dörwald + +.. versionadded:: 2.5 + +This module implements a variant of the UTF-8 codec: On encoding a UTF-8 encoded +BOM will be prepended to the UTF-8 encoded bytes. For the stateful encoder this +is only done once (on the first write to the byte stream). For decoding an +optional UTF-8 encoded BOM at the start of the data will be skipped. + diff --git a/Doc/library/codeop.rst b/Doc/library/codeop.rst new file mode 100644 index 0000000..8a730ec --- /dev/null +++ b/Doc/library/codeop.rst @@ -0,0 +1,95 @@ + +:mod:`codeop` --- Compile Python code +===================================== + +.. module:: codeop + :synopsis: Compile (possibly incomplete) Python code. +.. sectionauthor:: Moshe Zadka +.. sectionauthor:: Michael Hudson + + +.. % LaTeXed from excellent doc-string. + +The :mod:`codeop` module provides utilities upon which the Python +read-eval-print loop can be emulated, as is done in the :mod:`code` module. As +a result, you probably don't want to use the module directly; if you want to +include such a loop in your program you probably want to use the :mod:`code` +module instead. + +There are two parts to this job: + +#. Being able to tell if a line of input completes a Python statement: in + short, telling whether to print '``>>>``' or '``...``' next. + +#. Remembering which future statements the user has entered, so subsequent + input can be compiled with these in effect. + +The :mod:`codeop` module provides a way of doing each of these things, and a way +of doing them both. + +To do just the former: + + +.. function:: compile_command(source[, filename[, symbol]]) + + Tries to compile *source*, which should be a string of Python code and return a + code object if *source* is valid Python code. In that case, the filename + attribute of the code object will be *filename*, which defaults to + ``''``. Returns ``None`` if *source* is *not* valid Python code, but is a + prefix of valid Python code. + + If there is a problem with *source*, an exception will be raised. + :exc:`SyntaxError` is raised if there is invalid Python syntax, and + :exc:`OverflowError` or :exc:`ValueError` if there is an invalid literal. + + The *symbol* argument determines whether *source* is compiled as a statement + (``'single'``, the default) or as an expression (``'eval'``). Any other value + will cause :exc:`ValueError` to be raised. + + **Caveat:** It is possible (but not likely) that the parser stops parsing with a + successful outcome before reaching the end of the source; in this case, trailing + symbols may be ignored instead of causing an error. For example, a backslash + followed by two newlines may be followed by arbitrary garbage. This will be + fixed once the API for the parser is better. + + +.. class:: Compile() + + Instances of this class have :meth:`__call__` methods identical in signature to + the built-in function :func:`compile`, but with the difference that if the + instance compiles program text containing a :mod:`__future__` statement, the + instance 'remembers' and compiles all subsequent program texts with the + statement in force. + + +.. class:: CommandCompiler() + + Instances of this class have :meth:`__call__` methods identical in signature to + :func:`compile_command`; the difference is that if the instance compiles program + text containing a ``__future__`` statement, the instance 'remembers' and + compiles all subsequent program texts with the statement in force. + +A note on version compatibility: the :class:`Compile` and +:class:`CommandCompiler` are new in Python 2.2. If you want to enable the +future-tracking features of 2.2 but also retain compatibility with 2.1 and +earlier versions of Python you can either write :: + + try: + from codeop import CommandCompiler + compile_command = CommandCompiler() + del CommandCompiler + except ImportError: + from codeop import compile_command + +which is a low-impact change, but introduces possibly unwanted global state into +your program, or you can write:: + + try: + from codeop import CommandCompiler + except ImportError: + def CommandCompiler(): + from codeop import compile_command + return compile_command + +and then call ``CommandCompiler`` every time you need a fresh compiler object. + diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst new file mode 100644 index 0000000..c2c9262 --- /dev/null +++ b/Doc/library/collections.rst @@ -0,0 +1,414 @@ + +:mod:`collections` --- High-performance container datatypes +=========================================================== + +.. module:: collections + :synopsis: High-performance datatypes +.. moduleauthor:: Raymond Hettinger +.. sectionauthor:: Raymond Hettinger + + +.. versionadded:: 2.4 + +This module implements high-performance container datatypes. Currently, +there are two datatypes, :class:`deque` and :class:`defaultdict`, and +one datatype factory function, :func:`NamedTuple`. Python already +includes built-in containers, :class:`dict`, :class:`list`, +:class:`set`, and :class:`tuple`. In addition, the optional :mod:`bsddb` +module has a :meth:`bsddb.btopen` method that can be used to create in-memory +or file based ordered dictionaries with string keys. + +Future editions of the standard library may include balanced trees and +ordered dictionaries. + +.. versionchanged:: 2.5 + Added :class:`defaultdict`. + +.. versionchanged:: 2.6 + Added :class:`NamedTuple`. + + +.. _deque-objects: + +:class:`deque` objects +---------------------- + + +.. class:: deque([iterable]) + + Returns a new deque object initialized left-to-right (using :meth:`append`) with + data from *iterable*. If *iterable* is not specified, the new deque is empty. + + Deques are a generalization of stacks and queues (the name is pronounced "deck" + and is short for "double-ended queue"). Deques support thread-safe, memory + efficient appends and pops from either side of the deque with approximately the + same O(1) performance in either direction. + + Though :class:`list` objects support similar operations, they are optimized for + fast fixed-length operations and incur O(n) memory movement costs for + ``pop(0)`` and ``insert(0, v)`` operations which change both the size and + position of the underlying data representation. + + .. versionadded:: 2.4 + +Deque objects support the following methods: + + +.. method:: deque.append(x) + + Add *x* to the right side of the deque. + + +.. method:: deque.appendleft(x) + + Add *x* to the left side of the deque. + + +.. method:: deque.clear() + + Remove all elements from the deque leaving it with length 0. + + +.. method:: deque.extend(iterable) + + Extend the right side of the deque by appending elements from the iterable + argument. + + +.. method:: deque.extendleft(iterable) + + Extend the left side of the deque by appending elements from *iterable*. Note, + the series of left appends results in reversing the order of elements in the + iterable argument. + + +.. method:: deque.pop() + + Remove and return an element from the right side of the deque. If no elements + are present, raises an :exc:`IndexError`. + + +.. method:: deque.popleft() + + Remove and return an element from the left side of the deque. If no elements are + present, raises an :exc:`IndexError`. + + +.. method:: deque.remove(value) + + Removed the first occurrence of *value*. If not found, raises a + :exc:`ValueError`. + + .. versionadded:: 2.5 + + +.. method:: deque.rotate(n) + + Rotate the deque *n* steps to the right. If *n* is negative, rotate to the + left. Rotating one step to the right is equivalent to: + ``d.appendleft(d.pop())``. + +In addition to the above, deques support iteration, pickling, ``len(d)``, +``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with +the :keyword:`in` operator, and subscript references such as ``d[-1]``. + +Example:: + + >>> from collections import deque + >>> d = deque('ghi') # make a new deque with three items + >>> for elem in d: # iterate over the deque's elements + ... print elem.upper() + G + H + I + + >>> d.append('j') # add a new entry to the right side + >>> d.appendleft('f') # add a new entry to the left side + >>> d # show the representation of the deque + deque(['f', 'g', 'h', 'i', 'j']) + + >>> d.pop() # return and remove the rightmost item + 'j' + >>> d.popleft() # return and remove the leftmost item + 'f' + >>> list(d) # list the contents of the deque + ['g', 'h', 'i'] + >>> d[0] # peek at leftmost item + 'g' + >>> d[-1] # peek at rightmost item + 'i' + + >>> list(reversed(d)) # list the contents of a deque in reverse + ['i', 'h', 'g'] + >>> 'h' in d # search the deque + True + >>> d.extend('jkl') # add multiple elements at once + >>> d + deque(['g', 'h', 'i', 'j', 'k', 'l']) + >>> d.rotate(1) # right rotation + >>> d + deque(['l', 'g', 'h', 'i', 'j', 'k']) + >>> d.rotate(-1) # left rotation + >>> d + deque(['g', 'h', 'i', 'j', 'k', 'l']) + + >>> deque(reversed(d)) # make a new deque in reverse order + deque(['l', 'k', 'j', 'i', 'h', 'g']) + >>> d.clear() # empty the deque + >>> d.pop() # cannot pop from an empty deque + Traceback (most recent call last): + File "", line 1, in -toplevel- + d.pop() + IndexError: pop from an empty deque + + >>> d.extendleft('abc') # extendleft() reverses the input order + >>> d + deque(['c', 'b', 'a']) + + +.. _deque-recipes: + +Recipes +^^^^^^^ + +This section shows various approaches to working with deques. + +The :meth:`rotate` method provides a way to implement :class:`deque` slicing and +deletion. For example, a pure python implementation of ``del d[n]`` relies on +the :meth:`rotate` method to position elements to be popped:: + + def delete_nth(d, n): + d.rotate(-n) + d.popleft() + d.rotate(n) + +To implement :class:`deque` slicing, use a similar approach applying +:meth:`rotate` to bring a target element to the left side of the deque. Remove +old entries with :meth:`popleft`, add new entries with :meth:`extend`, and then +reverse the rotation. + +With minor variations on that approach, it is easy to implement Forth style +stack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``, +``rot``, and ``roll``. + +A roundrobin task server can be built from a :class:`deque` using +:meth:`popleft` to select the current task and :meth:`append` to add it back to +the tasklist if the input stream is not exhausted:: + + >>> def roundrobin(*iterables): + ... pending = deque(iter(i) for i in iterables) + ... while pending: + ... task = pending.popleft() + ... try: + ... yield next(task) + ... except StopIteration: + ... continue + ... pending.append(task) + ... + >>> for value in roundrobin('abc', 'd', 'efgh'): + ... print value + + a + d + e + b + f + c + g + h + + +Multi-pass data reduction algorithms can be succinctly expressed and efficiently +coded by extracting elements with multiple calls to :meth:`popleft`, applying +the reduction function, and calling :meth:`append` to add the result back to the +queue. + +For example, building a balanced binary tree of nested lists entails reducing +two adjacent nodes into one by grouping them in a list:: + + >>> def maketree(iterable): + ... d = deque(iterable) + ... while len(d) > 1: + ... pair = [d.popleft(), d.popleft()] + ... d.append(pair) + ... return list(d) + ... + >>> print maketree('abcdefgh') + [[[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]] + + + +.. _defaultdict-objects: + +:class:`defaultdict` objects +---------------------------- + + +.. class:: defaultdict([default_factory[, ...]]) + + Returns a new dictionary-like object. :class:`defaultdict` is a subclass of the + builtin :class:`dict` class. It overrides one method and adds one writable + instance variable. The remaining functionality is the same as for the + :class:`dict` class and is not documented here. + + The first argument provides the initial value for the :attr:`default_factory` + attribute; it defaults to ``None``. All remaining arguments are treated the same + as if they were passed to the :class:`dict` constructor, including keyword + arguments. + + .. versionadded:: 2.5 + +:class:`defaultdict` objects support the following method in addition to the +standard :class:`dict` operations: + + +.. method:: defaultdict.__missing__(key) + + If the :attr:`default_factory` attribute is ``None``, this raises an + :exc:`KeyError` exception with the *key* as argument. + + If :attr:`default_factory` is not ``None``, it is called without arguments to + provide a default value for the given *key*, this value is inserted in the + dictionary for the *key*, and returned. + + If calling :attr:`default_factory` raises an exception this exception is + propagated unchanged. + + This method is called by the :meth:`__getitem__` method of the :class:`dict` + class when the requested key is not found; whatever it returns or raises is then + returned or raised by :meth:`__getitem__`. + +:class:`defaultdict` objects support the following instance variable: + + +.. attribute:: defaultdict.default_factory + + This attribute is used by the :meth:`__missing__` method; it is initialized from + the first argument to the constructor, if present, or to ``None``, if absent. + + +.. _defaultdict-examples: + +:class:`defaultdict` Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using :class:`list` as the :attr:`default_factory`, it is easy to group a +sequence of key-value pairs into a dictionary of lists:: + + >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] + >>> d = defaultdict(list) + >>> for k, v in s: + ... d[k].append(v) + ... + >>> d.items() + [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] + +When each key is encountered for the first time, it is not already in the +mapping; so an entry is automatically created using the :attr:`default_factory` +function which returns an empty :class:`list`. The :meth:`list.append` +operation then attaches the value to the new list. When keys are encountered +again, the look-up proceeds normally (returning the list for that key) and the +:meth:`list.append` operation adds another value to the list. This technique is +simpler and faster than an equivalent technique using :meth:`dict.setdefault`:: + + >>> d = {} + >>> for k, v in s: + ... d.setdefault(k, []).append(v) + ... + >>> d.items() + [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] + +Setting the :attr:`default_factory` to :class:`int` makes the +:class:`defaultdict` useful for counting (like a bag or multiset in other +languages):: + + >>> s = 'mississippi' + >>> d = defaultdict(int) + >>> for k in s: + ... d[k] += 1 + ... + >>> d.items() + [('i', 4), ('p', 2), ('s', 4), ('m', 1)] + +When a letter is first encountered, it is missing from the mapping, so the +:attr:`default_factory` function calls :func:`int` to supply a default count of +zero. The increment operation then builds up the count for each letter. + +The function :func:`int` which always returns zero is just a special case of +constant functions. A faster and more flexible way to create constant functions +is to use a lambda function which can supply any constant value (not just +zero):: + + >>> def constant_factory(value): + ... return lambda: value + >>> d = defaultdict(constant_factory('')) + >>> d.update(name='John', action='ran') + >>> '%(name)s %(action)s to %(object)s' % d + 'John ran to ' + +Setting the :attr:`default_factory` to :class:`set` makes the +:class:`defaultdict` useful for building a dictionary of sets:: + + >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] + >>> d = defaultdict(set) + >>> for k, v in s: + ... d[k].add(v) + ... + >>> d.items() + [('blue', set([2, 4])), ('red', set([1, 3]))] + + +.. _named-tuple-factory: + +:func:`NamedTuple` datatype factory function +-------------------------------------------- + + +.. function:: NamedTuple(typename, fieldnames) + + Returns a new tuple subclass named *typename*. The new subclass is used to + create tuple-like objects that have fields accessable by attribute lookup as + well as being indexable and iterable. Instances of the subclass also have a + helpful docstring (with typename and fieldnames) and a helpful :meth:`__repr__` + method which lists the tuple contents in a ``name=value`` format. + + .. versionadded:: 2.6 + + The *fieldnames* are specified in a single string and are separated by spaces. + Any valid Python identifier may be used for a field name. + + Example:: + + >>> Point = NamedTuple('Point', 'x y') + >>> Point.__doc__ # docstring for the new datatype + 'Point(x, y)' + >>> p = Point(11, y=22) # instantiate with positional or keyword arguments + >>> p[0] + p[1] # works just like the tuple (11, 22) + 33 + >>> x, y = p # unpacks just like a tuple + >>> x, y + (11, 22) + >>> p.x + p.y # fields also accessable by name + 33 + >>> p # readable __repr__ with name=value style + Point(x=11, y=22) + + The use cases are the same as those for tuples. The named factories assign + meaning to each tuple position and allow for more readable, self-documenting + code. Named tuples can also be used to assign field names to tuples returned + by the :mod:`csv` or :mod:`sqlite3` modules. For example:: + + from itertools import starmap + import csv + EmployeeRecord = NamedTuple('EmployeeRecord', 'name age title department paygrade') + for record in starmap(EmployeeRecord, csv.reader(open("employees.csv", "rb"))): + print record + + To cast an individual record stored as :class:`list`, :class:`tuple`, or some + other iterable type, use the star-operator to unpack the values:: + + >>> Color = NamedTuple('Color', 'name code') + >>> m = dict(red=1, green=2, blue=3) + >>> print Color(*m.popitem()) + Color(name='blue', code=3) + diff --git a/Doc/library/colorpicker.rst b/Doc/library/colorpicker.rst new file mode 100644 index 0000000..4244104 --- /dev/null +++ b/Doc/library/colorpicker.rst @@ -0,0 +1,23 @@ + +:mod:`ColorPicker` --- Color selection dialog +============================================= + +.. module:: ColorPicker + :platform: Mac + :synopsis: Interface to the standard color selection dialog. +.. moduleauthor:: Just van Rossum +.. sectionauthor:: Fred L. Drake, Jr. + + +The :mod:`ColorPicker` module provides access to the standard color picker +dialog. + + +.. function:: GetColor(prompt, rgb) + + Show a standard color selection dialog and allow the user to select a color. + The user is given instruction by the *prompt* string, and the default color is + set to *rgb*. *rgb* must be a tuple giving the red, green, and blue components + of the color. :func:`GetColor` returns a tuple giving the user's selected color + and a flag indicating whether they accepted the selection of cancelled. + diff --git a/Doc/library/colorsys.rst b/Doc/library/colorsys.rst new file mode 100644 index 0000000..2e7f3b7 --- /dev/null +++ b/Doc/library/colorsys.rst @@ -0,0 +1,60 @@ + +:mod:`colorsys` --- Conversions between color systems +===================================================== + +.. module:: colorsys + :synopsis: Conversion functions between RGB and other color systems. +.. sectionauthor:: David Ascher + + +The :mod:`colorsys` module defines bidirectional conversions of color values +between colors expressed in the RGB (Red Green Blue) color space used in +computer monitors and three other coordinate systems: YIQ, HLS (Hue Lightness +Saturation) and HSV (Hue Saturation Value). Coordinates in all of these color +spaces are floating point values. In the YIQ space, the Y coordinate is between +0 and 1, but the I and Q coordinates can be positive or negative. In all other +spaces, the coordinates are all between 0 and 1. + +More information about color spaces can be found at +http://www.poynton.com/ColorFAQ.html. + +The :mod:`colorsys` module defines the following functions: + + +.. function:: rgb_to_yiq(r, g, b) + + Convert the color from RGB coordinates to YIQ coordinates. + + +.. function:: yiq_to_rgb(y, i, q) + + Convert the color from YIQ coordinates to RGB coordinates. + + +.. function:: rgb_to_hls(r, g, b) + + Convert the color from RGB coordinates to HLS coordinates. + + +.. function:: hls_to_rgb(h, l, s) + + Convert the color from HLS coordinates to RGB coordinates. + + +.. function:: rgb_to_hsv(r, g, b) + + Convert the color from RGB coordinates to HSV coordinates. + + +.. function:: hsv_to_rgb(h, s, v) + + Convert the color from HSV coordinates to RGB coordinates. + +Example:: + + >>> import colorsys + >>> colorsys.rgb_to_hsv(.3, .4, .2) + (0.25, 0.5, 0.4) + >>> colorsys.hsv_to_rgb(0.25, 0.5, 0.4) + (0.3, 0.4, 0.2) + diff --git a/Doc/library/commands.rst b/Doc/library/commands.rst new file mode 100644 index 0000000..79e3d73 --- /dev/null +++ b/Doc/library/commands.rst @@ -0,0 +1,53 @@ + +:mod:`commands` --- Utilities for running commands +================================================== + +.. module:: commands + :platform: Unix + :synopsis: Utility functions for running external commands. +.. sectionauthor:: Sue Williams + + +The :mod:`commands` module contains wrapper functions for :func:`os.popen` which +take a system command as a string and return any output generated by the command +and, optionally, the exit status. + +The :mod:`subprocess` module provides more powerful facilities for spawning new +processes and retrieving their results. Using the :mod:`subprocess` module is +preferable to using the :mod:`commands` module. + +The :mod:`commands` module defines the following functions: + + +.. function:: getstatusoutput(cmd) + + Execute the string *cmd* in a shell with :func:`os.popen` and return a 2-tuple + ``(status, output)``. *cmd* is actually run as ``{ cmd ; } 2>&1``, so that the + returned output will contain output or error messages. A trailing newline is + stripped from the output. The exit status for the command can be interpreted + according to the rules for the C function :cfunc:`wait`. + + +.. function:: getoutput(cmd) + + Like :func:`getstatusoutput`, except the exit status is ignored and the return + value is a string containing the command's output. + +Example:: + + >>> import commands + >>> commands.getstatusoutput('ls /bin/ls') + (0, '/bin/ls') + >>> commands.getstatusoutput('cat /bin/junk') + (256, 'cat: /bin/junk: No such file or directory') + >>> commands.getstatusoutput('/bin/junk') + (256, 'sh: /bin/junk: not found') + >>> commands.getoutput('ls /bin/ls') + '/bin/ls' + + +.. seealso:: + + Module :mod:`subprocess` + Module for spawning and managing subprocesses. + diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst new file mode 100644 index 0000000..d62b785 --- /dev/null +++ b/Doc/library/compileall.rst @@ -0,0 +1,57 @@ + +:mod:`compileall` --- Byte-compile Python libraries +=================================================== + +.. module:: compileall + :synopsis: Tools for byte-compiling all Python source files in a directory tree. + + +This module provides some utility functions to support installing Python +libraries. These functions compile Python source files in a directory tree, +allowing users without permission to write to the libraries to take advantage of +cached byte-code files. + +The source file for this module may also be used as a script to compile Python +sources in directories named on the command line or in ``sys.path``. + + +.. function:: compile_dir(dir[, maxlevels[, ddir[, force[, rx[, quiet]]]]]) + + Recursively descend the directory tree named by *dir*, compiling all :file:`.py` + files along the way. The *maxlevels* parameter is used to limit the depth of + the recursion; it defaults to ``10``. If *ddir* is given, it is used as the + base path from which the filenames used in error messages will be generated. + If *force* is true, modules are re-compiled even if the timestamps are up to + date. + + If *rx* is given, it specifies a regular expression of file names to exclude + from the search; that expression is searched for in the full path. + + If *quiet* is true, nothing is printed to the standard output in normal + operation. + + +.. function:: compile_path([skip_curdir[, maxlevels[, force]]]) + + Byte-compile all the :file:`.py` files found along ``sys.path``. If + *skip_curdir* is true (the default), the current directory is not included in + the search. The *maxlevels* and *force* parameters default to ``0`` and are + passed to the :func:`compile_dir` function. + +To force a recompile of all the :file:`.py` files in the :file:`Lib/` +subdirectory and all its subdirectories:: + + import compileall + + compileall.compile_dir('Lib/', force=True) + + # Perform same compilation, excluding files in .svn directories. + import re + compileall.compile_dir('Lib/', rx=re.compile('/[.]svn'), force=True) + + +.. seealso:: + + Module :mod:`py_compile` + Byte-compile a single source file. + diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst new file mode 100644 index 0000000..dd91d59 --- /dev/null +++ b/Doc/library/configparser.rst @@ -0,0 +1,361 @@ + +:mod:`ConfigParser` --- Configuration file parser +================================================= + +.. module:: ConfigParser + :synopsis: Configuration file parser. +.. moduleauthor:: Ken Manheimer +.. moduleauthor:: Barry Warsaw +.. moduleauthor:: Eric S. Raymond +.. sectionauthor:: Christopher G. Petrilli + + +.. index:: + pair: .ini; file + pair: configuration; file + single: ini file + single: Windows ini file + +This module defines the class :class:`ConfigParser`. The :class:`ConfigParser` +class implements a basic configuration file parser language which provides a +structure similar to what you would find on Microsoft Windows INI files. You +can use this to write Python programs which can be customized by end users +easily. + +.. warning:: + + This library does *not* interpret or write the value-type prefixes used in the + Windows Registry extended version of INI syntax. + +The configuration file consists of sections, led by a ``[section]`` header and +followed by ``name: value`` entries, with continuations in the style of +:rfc:`822`; ``name=value`` is also accepted. Note that leading whitespace is +removed from values. The optional values can contain format strings which refer +to other values in the same section, or values in a special ``DEFAULT`` section. +Additional defaults can be provided on initialization and retrieval. Lines +beginning with ``'#'`` or ``';'`` are ignored and may be used to provide +comments. + +For example:: + + [My Section] + foodir: %(dir)s/whatever + dir=frob + +would resolve the ``%(dir)s`` to the value of ``dir`` (``frob`` in this case). +All reference expansions are done on demand. + +Default values can be specified by passing them into the :class:`ConfigParser` +constructor as a dictionary. Additional defaults may be passed into the +:meth:`get` method which will override all others. + +Sections are normally stored in a builtin dictionary. An alternative dictionary +type can be passed to the :class:`ConfigParser` constructor. For example, if a +dictionary type is passed that sorts its keys, the sections will be sorted on +write-back, as will be the keys within each section. + + +.. class:: RawConfigParser([defaults[, dict_type]]) + + The basic configuration object. When *defaults* is given, it is initialized + into the dictionary of intrinsic defaults. When *dict_type* is given, it will + be used to create the dictionary objects for the list of sections, for the + options within a section, and for the default values. This class does not + support the magical interpolation behavior. + + .. versionadded:: 2.3 + + .. versionchanged:: 2.6 + *dict_type* was added. + + +.. class:: ConfigParser([defaults]) + + Derived class of :class:`RawConfigParser` that implements the magical + interpolation feature and adds optional arguments to the :meth:`get` and + :meth:`items` methods. The values in *defaults* must be appropriate for the + ``%()s`` string interpolation. Note that *__name__* is an intrinsic default; + its value is the section name, and will override any value provided in + *defaults*. + + All option names used in interpolation will be passed through the + :meth:`optionxform` method just like any other option name reference. For + example, using the default implementation of :meth:`optionxform` (which converts + option names to lower case), the values ``foo %(bar)s`` and ``foo %(BAR)s`` are + equivalent. + + +.. class:: SafeConfigParser([defaults]) + + Derived class of :class:`ConfigParser` that implements a more-sane variant of + the magical interpolation feature. This implementation is more predictable as + well. New applications should prefer this version if they don't need to be + compatible with older versions of Python. + + .. % XXX Need to explain what's safer/more predictable about it. + + .. versionadded:: 2.3 + + +.. exception:: NoSectionError + + Exception raised when a specified section is not found. + + +.. exception:: DuplicateSectionError + + Exception raised if :meth:`add_section` is called with the name of a section + that is already present. + + +.. exception:: NoOptionError + + Exception raised when a specified option is not found in the specified section. + + +.. exception:: InterpolationError + + Base class for exceptions raised when problems occur performing string + interpolation. + + +.. exception:: InterpolationDepthError + + Exception raised when string interpolation cannot be completed because the + number of iterations exceeds :const:`MAX_INTERPOLATION_DEPTH`. Subclass of + :exc:`InterpolationError`. + + +.. exception:: InterpolationMissingOptionError + + Exception raised when an option referenced from a value does not exist. Subclass + of :exc:`InterpolationError`. + + .. versionadded:: 2.3 + + +.. exception:: InterpolationSyntaxError + + Exception raised when the source text into which substitutions are made does not + conform to the required syntax. Subclass of :exc:`InterpolationError`. + + .. versionadded:: 2.3 + + +.. exception:: MissingSectionHeaderError + + Exception raised when attempting to parse a file which has no section headers. + + +.. exception:: ParsingError + + Exception raised when errors occur attempting to parse a file. + + +.. data:: MAX_INTERPOLATION_DEPTH + + The maximum depth for recursive interpolation for :meth:`get` when the *raw* + parameter is false. This is relevant only for the :class:`ConfigParser` class. + + +.. seealso:: + + Module :mod:`shlex` + Support for a creating Unix shell-like mini-languages which can be used as an + alternate format for application configuration files. + + +.. _rawconfigparser-objects: + +RawConfigParser Objects +----------------------- + +:class:`RawConfigParser` instances have the following methods: + + +.. method:: RawConfigParser.defaults() + + Return a dictionary containing the instance-wide defaults. + + +.. method:: RawConfigParser.sections() + + Return a list of the sections available; ``DEFAULT`` is not included in the + list. + + +.. method:: RawConfigParser.add_section(section) + + Add a section named *section* to the instance. If a section by the given name + already exists, :exc:`DuplicateSectionError` is raised. + + +.. method:: RawConfigParser.has_section(section) + + Indicates whether the named section is present in the configuration. The + ``DEFAULT`` section is not acknowledged. + + +.. method:: RawConfigParser.options(section) + + Returns a list of options available in the specified *section*. + + +.. method:: RawConfigParser.has_option(section, option) + + If the given section exists, and contains the given option, return + :const:`True`; otherwise return :const:`False`. + + .. versionadded:: 1.6 + + +.. method:: RawConfigParser.read(filenames) + + Attempt to read and parse a list of filenames, returning a list of filenames + which were successfully parsed. If *filenames* is a string or Unicode string, + it is treated as a single filename. If a file named in *filenames* cannot be + opened, that file will be ignored. This is designed so that you can specify a + list of potential configuration file locations (for example, the current + directory, the user's home directory, and some system-wide directory), and all + existing configuration files in the list will be read. If none of the named + files exist, the :class:`ConfigParser` instance will contain an empty dataset. + An application which requires initial values to be loaded from a file should + load the required file or files using :meth:`readfp` before calling :meth:`read` + for any optional files:: + + import ConfigParser, os + + config = ConfigParser.ConfigParser() + config.readfp(open('defaults.cfg')) + config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')]) + + .. versionchanged:: 2.4 + Returns list of successfully parsed filenames. + + +.. method:: RawConfigParser.readfp(fp[, filename]) + + Read and parse configuration data from the file or file-like object in *fp* + (only the :meth:`readline` method is used). If *filename* is omitted and *fp* + has a :attr:`name` attribute, that is used for *filename*; the default is + ````. + + +.. method:: RawConfigParser.get(section, option) + + Get an *option* value for the named *section*. + + +.. method:: RawConfigParser.getint(section, option) + + A convenience method which coerces the *option* in the specified *section* to an + integer. + + +.. method:: RawConfigParser.getfloat(section, option) + + A convenience method which coerces the *option* in the specified *section* to a + floating point number. + + +.. method:: RawConfigParser.getboolean(section, option) + + A convenience method which coerces the *option* in the specified *section* to a + Boolean value. Note that the accepted values for the option are ``"1"``, + ``"yes"``, ``"true"``, and ``"on"``, which cause this method to return ``True``, + and ``"0"``, ``"no"``, ``"false"``, and ``"off"``, which cause it to return + ``False``. These string values are checked in a case-insensitive manner. Any + other value will cause it to raise :exc:`ValueError`. + + +.. method:: RawConfigParser.items(section) + + Return a list of ``(name, value)`` pairs for each option in the given *section*. + + +.. method:: RawConfigParser.set(section, option, value) + + If the given section exists, set the given option to the specified value; + otherwise raise :exc:`NoSectionError`. While it is possible to use + :class:`RawConfigParser` (or :class:`ConfigParser` with *raw* parameters set to + true) for *internal* storage of non-string values, full functionality (including + interpolation and output to files) can only be achieved using string values. + + .. versionadded:: 1.6 + + +.. method:: RawConfigParser.write(fileobject) + + Write a representation of the configuration to the specified file object. This + representation can be parsed by a future :meth:`read` call. + + .. versionadded:: 1.6 + + +.. method:: RawConfigParser.remove_option(section, option) + + Remove the specified *option* from the specified *section*. If the section does + not exist, raise :exc:`NoSectionError`. If the option existed to be removed, + return :const:`True`; otherwise return :const:`False`. + + .. versionadded:: 1.6 + + +.. method:: RawConfigParser.remove_section(section) + + Remove the specified *section* from the configuration. If the section in fact + existed, return ``True``. Otherwise return ``False``. + + +.. method:: RawConfigParser.optionxform(option) + + Transforms the option name *option* as found in an input file or as passed in by + client code to the form that should be used in the internal structures. The + default implementation returns a lower-case version of *option*; subclasses may + override this or client code can set an attribute of this name on instances to + affect this behavior. Setting this to :func:`str`, for example, would make + option names case sensitive. + + +.. _configparser-objects: + +ConfigParser Objects +-------------------- + +The :class:`ConfigParser` class extends some methods of the +:class:`RawConfigParser` interface, adding some optional arguments. + + +.. method:: ConfigParser.get(section, option[, raw[, vars]]) + + Get an *option* value for the named *section*. All the ``'%'`` interpolations + are expanded in the return values, based on the defaults passed into the + constructor, as well as the options *vars* provided, unless the *raw* argument + is true. + + +.. method:: ConfigParser.items(section[, raw[, vars]]) + + Return a list of ``(name, value)`` pairs for each option in the given *section*. + Optional arguments have the same meaning as for the :meth:`get` method. + + .. versionadded:: 2.3 + + +.. _safeconfigparser-objects: + +SafeConfigParser Objects +------------------------ + +The :class:`SafeConfigParser` class implements the same extended interface as +:class:`ConfigParser`, with the following addition: + + +.. method:: SafeConfigParser.set(section, option, value) + + If the given section exists, set the given option to the specified value; + otherwise raise :exc:`NoSectionError`. *value* must be a string (:class:`str` + or :class:`unicode`); if not, :exc:`TypeError` is raised. + + .. versionadded:: 2.4 + diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst new file mode 100644 index 0000000..fecd836 --- /dev/null +++ b/Doc/library/constants.rst @@ -0,0 +1,42 @@ + +Built-in Constants +================== + +A small number of constants live in the built-in namespace. They are: + + +.. data:: False + + The false value of the :class:`bool` type. + + .. versionadded:: 2.3 + + +.. data:: True + + The true value of the :class:`bool` type. + + .. versionadded:: 2.3 + + +.. data:: None + + The sole value of :attr:`types.NoneType`. ``None`` is frequently used to + represent the absence of a value, as when default arguments are not passed to a + function. + + +.. data:: NotImplemented + + Special value which can be returned by the "rich comparison" special methods + (:meth:`__eq__`, :meth:`__lt__`, and friends), to indicate that the comparison + is not implemented with respect to the other type. + + +.. data:: Ellipsis + + The same as ``...``. Special value used mostly in conjunction with extended + slicing syntax for user-defined container data types. + + .. % XXX Someone who understands extended slicing should fill in here. + diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst new file mode 100644 index 0000000..fffb99c --- /dev/null +++ b/Doc/library/contextlib.rst @@ -0,0 +1,120 @@ + +:mod:`contextlib` --- Utilities for :keyword:`with`\ -statement contexts. +========================================================================= + +.. module:: contextlib + :synopsis: Utilities for with-statement contexts. + + +.. versionadded:: 2.5 + +This module provides utilities for common tasks involving the :keyword:`with` +statement. For more information see also :ref:`typecontextmanager` and +:ref:`context-managers`. + +Functions provided: + + +.. function:: contextmanager(func) + + This function is a decorator that can be used to define a factory function for + :keyword:`with` statement context managers, without needing to create a class or + separate :meth:`__enter__` and :meth:`__exit__` methods. + + A simple example (this is not recommended as a real way of generating HTML!):: + + from __future__ import with_statement + from contextlib import contextmanager + + @contextmanager + def tag(name): + print "<%s>" % name + yield + print "" % name + + >>> with tag("h1"): + ... print "foo" + ... +

    + foo +

    + + The function being decorated must return a generator-iterator when called. This + iterator must yield exactly one value, which will be bound to the targets in the + :keyword:`with` statement's :keyword:`as` clause, if any. + + At the point where the generator yields, the block nested in the :keyword:`with` + statement is executed. The generator is then resumed after the block is exited. + If an unhandled exception occurs in the block, it is reraised inside the + generator at the point where the yield occurred. Thus, you can use a + :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` statement to trap + the error (if any), or ensure that some cleanup takes place. If an exception is + trapped merely in order to log it or to perform some action (rather than to + suppress it entirely), the generator must reraise that exception. Otherwise the + generator context manager will indicate to the :keyword:`with` statement that + the exception has been handled, and execution will resume with the statement + immediately following the :keyword:`with` statement. + + +.. function:: nested(mgr1[, mgr2[, ...]]) + + Combine multiple context managers into a single nested context manager. + + Code like this:: + + from contextlib import nested + + with nested(A, B, C) as (X, Y, Z): + do_something() + + is equivalent to this:: + + with A as X: + with B as Y: + with C as Z: + do_something() + + Note that if the :meth:`__exit__` method of one of the nested context managers + indicates an exception should be suppressed, no exception information will be + passed to any remaining outer context managers. Similarly, if the + :meth:`__exit__` method of one of the nested managers raises an exception, any + previous exception state will be lost; the new exception will be passed to the + :meth:`__exit__` methods of any remaining outer context managers. In general, + :meth:`__exit__` methods should avoid raising exceptions, and in particular they + should not re-raise a passed-in exception. + + +.. function:: closing(thing) + + Return a context manager that closes *thing* upon completion of the block. This + is basically equivalent to:: + + from contextlib import contextmanager + + @contextmanager + def closing(thing): + try: + yield thing + finally: + thing.close() + + And lets you write code like this:: + + from __future__ import with_statement + from contextlib import closing + import urllib + + with closing(urllib.urlopen('http://www.python.org')) as page: + for line in page: + print line + + without needing to explicitly close ``page``. Even if an error occurs, + ``page.close()`` will be called when the :keyword:`with` block is exited. + + +.. seealso:: + + :pep:`0343` - The "with" statement + The specification, background, and examples for the Python :keyword:`with` + statement. + diff --git a/Doc/library/cookie.rst b/Doc/library/cookie.rst new file mode 100644 index 0000000..5a5808f --- /dev/null +++ b/Doc/library/cookie.rst @@ -0,0 +1,282 @@ + +:mod:`Cookie` --- HTTP state management +======================================= + +.. module:: Cookie + :synopsis: Support for HTTP state management (cookies). +.. moduleauthor:: Timothy O'Malley +.. sectionauthor:: Moshe Zadka + + +The :mod:`Cookie` module defines classes for abstracting the concept of +cookies, an HTTP state management mechanism. It supports both simple string-only +cookies, and provides an abstraction for having any serializable data-type as +cookie value. + +The module formerly strictly applied the parsing rules described in the +:rfc:`2109` and :rfc:`2068` specifications. It has since been discovered that +MSIE 3.0x doesn't follow the character rules outlined in those specs. As a +result, the parsing rules used are a bit less strict. + + +.. exception:: CookieError + + Exception failing because of :rfc:`2109` invalidity: incorrect attributes, + incorrect :mailheader:`Set-Cookie` header, etc. + + +.. class:: BaseCookie([input]) + + This class is a dictionary-like object whose keys are strings and whose values + are :class:`Morsel` instances. Note that upon setting a key to a value, the + value is first converted to a :class:`Morsel` containing the key and the value. + + If *input* is given, it is passed to the :meth:`load` method. + + +.. class:: SimpleCookie([input]) + + This class derives from :class:`BaseCookie` and overrides :meth:`value_decode` + and :meth:`value_encode` to be the identity and :func:`str` respectively. + + +.. class:: SerialCookie([input]) + + This class derives from :class:`BaseCookie` and overrides :meth:`value_decode` + and :meth:`value_encode` to be the :func:`pickle.loads` and + :func:`pickle.dumps`. + + .. deprecated:: 2.3 + Reading pickled values from untrusted cookie data is a huge security hole, as + pickle strings can be crafted to cause arbitrary code to execute on your server. + It is supported for backwards compatibility only, and may eventually go away. + + +.. class:: SmartCookie([input]) + + This class derives from :class:`BaseCookie`. It overrides :meth:`value_decode` + to be :func:`pickle.loads` if it is a valid pickle, and otherwise the value + itself. It overrides :meth:`value_encode` to be :func:`pickle.dumps` unless it + is a string, in which case it returns the value itself. + + .. deprecated:: 2.3 + The same security warning from :class:`SerialCookie` applies here. + +A further security note is warranted. For backwards compatibility, the +:mod:`Cookie` module exports a class named :class:`Cookie` which is just an +alias for :class:`SmartCookie`. This is probably a mistake and will likely be +removed in a future version. You should not use the :class:`Cookie` class in +your applications, for the same reason why you should not use the +:class:`SerialCookie` class. + + +.. seealso:: + + Module :mod:`cookielib` + HTTP cookie handling for web *clients*. The :mod:`cookielib` and :mod:`Cookie` + modules do not depend on each other. + + :rfc:`2109` - HTTP State Management Mechanism + This is the state management specification implemented by this module. + + +.. _cookie-objects: + +Cookie Objects +-------------- + + +.. method:: BaseCookie.value_decode(val) + + Return a decoded value from a string representation. Return value can be any + type. This method does nothing in :class:`BaseCookie` --- it exists so it can be + overridden. + + +.. method:: BaseCookie.value_encode(val) + + Return an encoded value. *val* can be any type, but return value must be a + string. This method does nothing in :class:`BaseCookie` --- it exists so it can + be overridden + + In general, it should be the case that :meth:`value_encode` and + :meth:`value_decode` are inverses on the range of *value_decode*. + + +.. method:: BaseCookie.output([attrs[, header[, sep]]]) + + Return a string representation suitable to be sent as HTTP headers. *attrs* and + *header* are sent to each :class:`Morsel`'s :meth:`output` method. *sep* is used + to join the headers together, and is by default the combination ``'\r\n'`` + (CRLF). + + .. versionchanged:: 2.5 + The default separator has been changed from ``'\n'`` to match the cookie + specification. + + +.. method:: BaseCookie.js_output([attrs]) + + Return an embeddable JavaScript snippet, which, if run on a browser which + supports JavaScript, will act the same as if the HTTP headers was sent. + + The meaning for *attrs* is the same as in :meth:`output`. + + +.. method:: BaseCookie.load(rawdata) + + If *rawdata* is a string, parse it as an ``HTTP_COOKIE`` and add the values + found there as :class:`Morsel`\ s. If it is a dictionary, it is equivalent to:: + + for k, v in rawdata.items(): + cookie[k] = v + + +.. _morsel-objects: + +Morsel Objects +-------------- + + +.. class:: Morsel() + + Abstract a key/value pair, which has some :rfc:`2109` attributes. + + Morsels are dictionary-like objects, whose set of keys is constant --- the valid + :rfc:`2109` attributes, which are + + * ``expires`` + * ``path`` + * ``comment`` + * ``domain`` + * ``max-age`` + * ``secure`` + * ``version`` + + The keys are case-insensitive. + + +.. attribute:: Morsel.value + + The value of the cookie. + + +.. attribute:: Morsel.coded_value + + The encoded value of the cookie --- this is what should be sent. + + +.. attribute:: Morsel.key + + The name of the cookie. + + +.. method:: Morsel.set(key, value, coded_value) + + Set the *key*, *value* and *coded_value* members. + + +.. method:: Morsel.isReservedKey(K) + + Whether *K* is a member of the set of keys of a :class:`Morsel`. + + +.. method:: Morsel.output([attrs[, header]]) + + Return a string representation of the Morsel, suitable to be sent as an HTTP + header. By default, all the attributes are included, unless *attrs* is given, in + which case it should be a list of attributes to use. *header* is by default + ``"Set-Cookie:"``. + + +.. method:: Morsel.js_output([attrs]) + + Return an embeddable JavaScript snippet, which, if run on a browser which + supports JavaScript, will act the same as if the HTTP header was sent. + + The meaning for *attrs* is the same as in :meth:`output`. + + +.. method:: Morsel.OutputString([attrs]) + + Return a string representing the Morsel, without any surrounding HTTP or + JavaScript. + + The meaning for *attrs* is the same as in :meth:`output`. + + +.. _cookie-example: + +Example +------- + +The following example demonstrates how to use the :mod:`Cookie` module. :: + + >>> import Cookie + >>> C = Cookie.SimpleCookie() + >>> C = Cookie.SerialCookie() + >>> C = Cookie.SmartCookie() + >>> C["fig"] = "newton" + >>> C["sugar"] = "wafer" + >>> print C # generate HTTP headers + Set-Cookie: sugar=wafer + Set-Cookie: fig=newton + >>> print C.output() # same thing + Set-Cookie: sugar=wafer + Set-Cookie: fig=newton + >>> C = Cookie.SmartCookie() + >>> C["rocky"] = "road" + >>> C["rocky"]["path"] = "/cookie" + >>> print C.output(header="Cookie:") + Cookie: rocky=road; Path=/cookie + >>> print C.output(attrs=[], header="Cookie:") + Cookie: rocky=road + >>> C = Cookie.SmartCookie() + >>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header) + >>> print C + Set-Cookie: vienna=finger + Set-Cookie: chips=ahoy + >>> C = Cookie.SmartCookie() + >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";') + >>> print C + Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;" + >>> C = Cookie.SmartCookie() + >>> C["oreo"] = "doublestuff" + >>> C["oreo"]["path"] = "/" + >>> print C + Set-Cookie: oreo=doublestuff; Path=/ + >>> C = Cookie.SmartCookie() + >>> C["twix"] = "none for you" + >>> C["twix"].value + 'none for you' + >>> C = Cookie.SimpleCookie() + >>> C["number"] = 7 # equivalent to C["number"] = str(7) + >>> C["string"] = "seven" + >>> C["number"].value + '7' + >>> C["string"].value + 'seven' + >>> print C + Set-Cookie: number=7 + Set-Cookie: string=seven + >>> C = Cookie.SerialCookie() + >>> C["number"] = 7 + >>> C["string"] = "seven" + >>> C["number"].value + 7 + >>> C["string"].value + 'seven' + >>> print C + Set-Cookie: number="I7\012." + Set-Cookie: string="S'seven'\012p1\012." + >>> C = Cookie.SmartCookie() + >>> C["number"] = 7 + >>> C["string"] = "seven" + >>> C["number"].value + 7 + >>> C["string"].value + 'seven' + >>> print C + Set-Cookie: number="I7\012." + Set-Cookie: string=seven + diff --git a/Doc/library/cookielib.rst b/Doc/library/cookielib.rst new file mode 100644 index 0000000..44045d3 --- /dev/null +++ b/Doc/library/cookielib.rst @@ -0,0 +1,768 @@ + +:mod:`cookielib` --- Cookie handling for HTTP clients +===================================================== + +.. module:: cookielib + :synopsis: Classes for automatic handling of HTTP cookies. +.. moduleauthor:: John J. Lee +.. sectionauthor:: John J. Lee + + +.. versionadded:: 2.4 + + + +The :mod:`cookielib` module defines classes for automatic handling of HTTP +cookies. It is useful for accessing web sites that require small pieces of data +-- :dfn:`cookies` -- to be set on the client machine by an HTTP response from a +web server, and then returned to the server in later HTTP requests. + +Both the regular Netscape cookie protocol and the protocol defined by +:rfc:`2965` are handled. RFC 2965 handling is switched off by default. +:rfc:`2109` cookies are parsed as Netscape cookies and subsequently treated +either as Netscape or RFC 2965 cookies according to the 'policy' in effect. +Note that the great majority of cookies on the Internet are Netscape cookies. +:mod:`cookielib` attempts to follow the de-facto Netscape cookie protocol (which +differs substantially from that set out in the original Netscape specification), +including taking note of the ``max-age`` and ``port`` cookie-attributes +introduced with RFC 2965. + +.. note:: + + The various named parameters found in :mailheader:`Set-Cookie` and + :mailheader:`Set-Cookie2` headers (eg. ``domain`` and ``expires``) are + conventionally referred to as :dfn:`attributes`. To distinguish them from + Python attributes, the documentation for this module uses the term + :dfn:`cookie-attribute` instead. + + +The module defines the following exception: + + +.. exception:: LoadError + + Instances of :class:`FileCookieJar` raise this exception on failure to load + cookies from a file. + + .. note:: + + For backwards-compatibility with Python 2.4 (which raised an :exc:`IOError`), + :exc:`LoadError` is a subclass of :exc:`IOError`. + + +The following classes are provided: + + +.. class:: CookieJar(policy=None) + + *policy* is an object implementing the :class:`CookiePolicy` interface. + + The :class:`CookieJar` class stores HTTP cookies. It extracts cookies from HTTP + requests, and returns them in HTTP responses. :class:`CookieJar` instances + automatically expire contained cookies when necessary. Subclasses are also + responsible for storing and retrieving cookies from a file or database. + + +.. class:: FileCookieJar(filename, delayload=None, policy=None) + + *policy* is an object implementing the :class:`CookiePolicy` interface. For the + other arguments, see the documentation for the corresponding attributes. + + A :class:`CookieJar` which can load cookies from, and perhaps save cookies to, a + file on disk. Cookies are **NOT** loaded from the named file until either the + :meth:`load` or :meth:`revert` method is called. Subclasses of this class are + documented in section :ref:`file-cookie-jar-classes`. + + +.. class:: CookiePolicy() + + This class is responsible for deciding whether each cookie should be accepted + from / returned to the server. + + +.. class:: DefaultCookiePolicy( blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False ) + + Constructor arguments should be passed as keyword arguments only. + *blocked_domains* is a sequence of domain names that we never accept cookies + from, nor return cookies to. *allowed_domains* if not :const:`None`, this is a + sequence of the only domains for which we accept and return cookies. For all + other arguments, see the documentation for :class:`CookiePolicy` and + :class:`DefaultCookiePolicy` objects. + + :class:`DefaultCookiePolicy` implements the standard accept / reject rules for + Netscape and RFC 2965 cookies. By default, RFC 2109 cookies (ie. cookies + received in a :mailheader:`Set-Cookie` header with a version cookie-attribute of + 1) are treated according to the RFC 2965 rules. However, if RFC 2965 handling + is turned off or :attr:`rfc2109_as_netscape` is True, RFC 2109 cookies are + 'downgraded' by the :class:`CookieJar` instance to Netscape cookies, by + setting the :attr:`version` attribute of the :class:`Cookie` instance to 0. + :class:`DefaultCookiePolicy` also provides some parameters to allow some + fine-tuning of policy. + + +.. class:: Cookie() + + This class represents Netscape, RFC 2109 and RFC 2965 cookies. It is not + expected that users of :mod:`cookielib` construct their own :class:`Cookie` + instances. Instead, if necessary, call :meth:`make_cookies` on a + :class:`CookieJar` instance. + + +.. seealso:: + + Module :mod:`urllib2` + URL opening with automatic cookie handling. + + Module :mod:`Cookie` + HTTP cookie classes, principally useful for server-side code. The + :mod:`cookielib` and :mod:`Cookie` modules do not depend on each other. + + http://wwwsearch.sf.net/ClientCookie/ + Extensions to this module, including a class for reading Microsoft Internet + Explorer cookies on Windows. + + http://www.netscape.com/newsref/std/cookie_spec.html + The specification of the original Netscape cookie protocol. Though this is + still the dominant protocol, the 'Netscape cookie protocol' implemented by all + the major browsers (and :mod:`cookielib`) only bears a passing resemblance to + the one sketched out in ``cookie_spec.html``. + + :rfc:`2109` - HTTP State Management Mechanism + Obsoleted by RFC 2965. Uses :mailheader:`Set-Cookie` with version=1. + + :rfc:`2965` - HTTP State Management Mechanism + The Netscape protocol with the bugs fixed. Uses :mailheader:`Set-Cookie2` in + place of :mailheader:`Set-Cookie`. Not widely used. + + http://kristol.org/cookie/errata.html + Unfinished errata to RFC 2965. + + :rfc:`2964` - Use of HTTP State Management + +.. _cookie-jar-objects: + +CookieJar and FileCookieJar Objects +----------------------------------- + +:class:`CookieJar` objects support the iterator protocol for iterating over +contained :class:`Cookie` objects. + +:class:`CookieJar` has the following methods: + + +.. method:: CookieJar.add_cookie_header(request) + + Add correct :mailheader:`Cookie` header to *request*. + + If policy allows (ie. the :attr:`rfc2965` and :attr:`hide_cookie2` attributes of + the :class:`CookieJar`'s :class:`CookiePolicy` instance are true and false + respectively), the :mailheader:`Cookie2` header is also added when appropriate. + + The *request* object (usually a :class:`urllib2.Request` instance) must support + the methods :meth:`get_full_url`, :meth:`get_host`, :meth:`get_type`, + :meth:`unverifiable`, :meth:`get_origin_req_host`, :meth:`has_header`, + :meth:`get_header`, :meth:`header_items`, and :meth:`add_unredirected_header`,as + documented by :mod:`urllib2`. + + +.. method:: CookieJar.extract_cookies(response, request) + + Extract cookies from HTTP *response* and store them in the :class:`CookieJar`, + where allowed by policy. + + The :class:`CookieJar` will look for allowable :mailheader:`Set-Cookie` and + :mailheader:`Set-Cookie2` headers in the *response* argument, and store cookies + as appropriate (subject to the :meth:`CookiePolicy.set_ok` method's approval). + + The *response* object (usually the result of a call to :meth:`urllib2.urlopen`, + or similar) should support an :meth:`info` method, which returns an object with + a :meth:`getallmatchingheaders` method (usually a :class:`mimetools.Message` + instance). + + The *request* object (usually a :class:`urllib2.Request` instance) must support + the methods :meth:`get_full_url`, :meth:`get_host`, :meth:`unverifiable`, and + :meth:`get_origin_req_host`, as documented by :mod:`urllib2`. The request is + used to set default values for cookie-attributes as well as for checking that + the cookie is allowed to be set. + + +.. method:: CookieJar.set_policy(policy) + + Set the :class:`CookiePolicy` instance to be used. + + +.. method:: CookieJar.make_cookies(response, request) + + Return sequence of :class:`Cookie` objects extracted from *response* object. + + See the documentation for :meth:`extract_cookies` for the interfaces required of + the *response* and *request* arguments. + + +.. method:: CookieJar.set_cookie_if_ok(cookie, request) + + Set a :class:`Cookie` if policy says it's OK to do so. + + +.. method:: CookieJar.set_cookie(cookie) + + Set a :class:`Cookie`, without checking with policy to see whether or not it + should be set. + + +.. method:: CookieJar.clear([domain[, path[, name]]]) + + Clear some cookies. + + If invoked without arguments, clear all cookies. If given a single argument, + only cookies belonging to that *domain* will be removed. If given two arguments, + cookies belonging to the specified *domain* and URL *path* are removed. If + given three arguments, then the cookie with the specified *domain*, *path* and + *name* is removed. + + Raises :exc:`KeyError` if no matching cookie exists. + + +.. method:: CookieJar.clear_session_cookies() + + Discard all session cookies. + + Discards all contained cookies that have a true :attr:`discard` attribute + (usually because they had either no ``max-age`` or ``expires`` cookie-attribute, + or an explicit ``discard`` cookie-attribute). For interactive browsers, the end + of a session usually corresponds to closing the browser window. + + Note that the :meth:`save` method won't save session cookies anyway, unless you + ask otherwise by passing a true *ignore_discard* argument. + +:class:`FileCookieJar` implements the following additional methods: + + +.. method:: FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False) + + Save cookies to a file. + + This base class raises :exc:`NotImplementedError`. Subclasses may leave this + method unimplemented. + + *filename* is the name of file in which to save cookies. If *filename* is not + specified, :attr:`self.filename` is used (whose default is the value passed to + the constructor, if any); if :attr:`self.filename` is :const:`None`, + :exc:`ValueError` is raised. + + *ignore_discard*: save even cookies set to be discarded. *ignore_expires*: save + even cookies that have expired + + The file is overwritten if it already exists, thus wiping all the cookies it + contains. Saved cookies can be restored later using the :meth:`load` or + :meth:`revert` methods. + + +.. method:: FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False) + + Load cookies from a file. + + Old cookies are kept unless overwritten by newly loaded ones. + + Arguments are as for :meth:`save`. + + The named file must be in the format understood by the class, or + :exc:`LoadError` will be raised. Also, :exc:`IOError` may be raised, for + example if the file does not exist. + + .. note:: + + For backwards-compatibility with Python 2.4 (which raised an :exc:`IOError`), + :exc:`LoadError` is a subclass of :exc:`IOError`. + + +.. method:: FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False) + + Clear all cookies and reload cookies from a saved file. + + :meth:`revert` can raise the same exceptions as :meth:`load`. If there is a + failure, the object's state will not be altered. + +:class:`FileCookieJar` instances have the following public attributes: + + +.. attribute:: FileCookieJar.filename + + Filename of default file in which to keep cookies. This attribute may be + assigned to. + + +.. attribute:: FileCookieJar.delayload + + If true, load cookies lazily from disk. This attribute should not be assigned + to. This is only a hint, since this only affects performance, not behaviour + (unless the cookies on disk are changing). A :class:`CookieJar` object may + ignore it. None of the :class:`FileCookieJar` classes included in the standard + library lazily loads cookies. + + +.. _file-cookie-jar-classes: + +FileCookieJar subclasses and co-operation with web browsers +----------------------------------------------------------- + +The following :class:`CookieJar` subclasses are provided for reading and writing +. Further :class:`CookieJar` subclasses, including one that reads Microsoft +Internet Explorer cookies, are available at +http://wwwsearch.sf.net/ClientCookie/. + + +.. class:: MozillaCookieJar(filename, delayload=None, policy=None) + + A :class:`FileCookieJar` that can load from and save cookies to disk in the + Mozilla ``cookies.txt`` file format (which is also used by the Lynx and Netscape + browsers). + + .. note:: + + This loses information about RFC 2965 cookies, and also about newer or + non-standard cookie-attributes such as ``port``. + + .. warning:: + + Back up your cookies before saving if you have cookies whose loss / corruption + would be inconvenient (there are some subtleties which may lead to slight + changes in the file over a load / save round-trip). + + Also note that cookies saved while Mozilla is running will get clobbered by + Mozilla. + + +.. class:: LWPCookieJar(filename, delayload=None, policy=None) + + A :class:`FileCookieJar` that can load from and save cookies to disk in format + compatible with the libwww-perl library's ``Set-Cookie3`` file format. This is + convenient if you want to store cookies in a human-readable file. + + +.. _cookie-policy-objects: + +CookiePolicy Objects +-------------------- + +Objects implementing the :class:`CookiePolicy` interface have the following +methods: + + +.. method:: CookiePolicy.set_ok(cookie, request) + + Return boolean value indicating whether cookie should be accepted from server. + + *cookie* is a :class:`cookielib.Cookie` instance. *request* is an object + implementing the interface defined by the documentation for + :meth:`CookieJar.extract_cookies`. + + +.. method:: CookiePolicy.return_ok(cookie, request) + + Return boolean value indicating whether cookie should be returned to server. + + *cookie* is a :class:`cookielib.Cookie` instance. *request* is an object + implementing the interface defined by the documentation for + :meth:`CookieJar.add_cookie_header`. + + +.. method:: CookiePolicy.domain_return_ok(domain, request) + + Return false if cookies should not be returned, given cookie domain. + + This method is an optimization. It removes the need for checking every cookie + with a particular domain (which might involve reading many files). Returning + true from :meth:`domain_return_ok` and :meth:`path_return_ok` leaves all the + work to :meth:`return_ok`. + + If :meth:`domain_return_ok` returns true for the cookie domain, + :meth:`path_return_ok` is called for the cookie path. Otherwise, + :meth:`path_return_ok` and :meth:`return_ok` are never called for that cookie + domain. If :meth:`path_return_ok` returns true, :meth:`return_ok` is called + with the :class:`Cookie` object itself for a full check. Otherwise, + :meth:`return_ok` is never called for that cookie path. + + Note that :meth:`domain_return_ok` is called for every *cookie* domain, not just + for the *request* domain. For example, the function might be called with both + ``".example.com"`` and ``"www.example.com"`` if the request domain is + ``"www.example.com"``. The same goes for :meth:`path_return_ok`. + + The *request* argument is as documented for :meth:`return_ok`. + + +.. method:: CookiePolicy.path_return_ok(path, request) + + Return false if cookies should not be returned, given cookie path. + + See the documentation for :meth:`domain_return_ok`. + +In addition to implementing the methods above, implementations of the +:class:`CookiePolicy` interface must also supply the following attributes, +indicating which protocols should be used, and how. All of these attributes may +be assigned to. + + +.. attribute:: CookiePolicy.netscape + + Implement Netscape protocol. + + +.. attribute:: CookiePolicy.rfc2965 + + Implement RFC 2965 protocol. + + +.. attribute:: CookiePolicy.hide_cookie2 + + Don't add :mailheader:`Cookie2` header to requests (the presence of this header + indicates to the server that we understand RFC 2965 cookies). + +The most useful way to define a :class:`CookiePolicy` class is by subclassing +from :class:`DefaultCookiePolicy` and overriding some or all of the methods +above. :class:`CookiePolicy` itself may be used as a 'null policy' to allow +setting and receiving any and all cookies (this is unlikely to be useful). + + +.. _default-cookie-policy-objects: + +DefaultCookiePolicy Objects +--------------------------- + +Implements the standard rules for accepting and returning cookies. + +Both RFC 2965 and Netscape cookies are covered. RFC 2965 handling is switched +off by default. + +The easiest way to provide your own policy is to override this class and call +its methods in your overridden implementations before adding your own additional +checks:: + + import cookielib + class MyCookiePolicy(cookielib.DefaultCookiePolicy): + def set_ok(self, cookie, request): + if not cookielib.DefaultCookiePolicy.set_ok(self, cookie, request): + return False + if i_dont_want_to_store_this_cookie(cookie): + return False + return True + +In addition to the features required to implement the :class:`CookiePolicy` +interface, this class allows you to block and allow domains from setting and +receiving cookies. There are also some strictness switches that allow you to +tighten up the rather loose Netscape protocol rules a little bit (at the cost of +blocking some benign cookies). + +A domain blacklist and whitelist is provided (both off by default). Only domains +not in the blacklist and present in the whitelist (if the whitelist is active) +participate in cookie setting and returning. Use the *blocked_domains* +constructor argument, and :meth:`blocked_domains` and +:meth:`set_blocked_domains` methods (and the corresponding argument and methods +for *allowed_domains*). If you set a whitelist, you can turn it off again by +setting it to :const:`None`. + +Domains in block or allow lists that do not start with a dot must equal the +cookie domain to be matched. For example, ``"example.com"`` matches a blacklist +entry of ``"example.com"``, but ``"www.example.com"`` does not. Domains that do +start with a dot are matched by more specific domains too. For example, both +``"www.example.com"`` and ``"www.coyote.example.com"`` match ``".example.com"`` +(but ``"example.com"`` itself does not). IP addresses are an exception, and +must match exactly. For example, if blocked_domains contains ``"192.168.1.2"`` +and ``".168.1.2"``, 192.168.1.2 is blocked, but 193.168.1.2 is not. + +:class:`DefaultCookiePolicy` implements the following additional methods: + + +.. method:: DefaultCookiePolicy.blocked_domains() + + Return the sequence of blocked domains (as a tuple). + + +.. method:: DefaultCookiePolicy.set_blocked_domains(blocked_domains) + + Set the sequence of blocked domains. + + +.. method:: DefaultCookiePolicy.is_blocked(domain) + + Return whether *domain* is on the blacklist for setting or receiving cookies. + + +.. method:: DefaultCookiePolicy.allowed_domains() + + Return :const:`None`, or the sequence of allowed domains (as a tuple). + + +.. method:: DefaultCookiePolicy.set_allowed_domains(allowed_domains) + + Set the sequence of allowed domains, or :const:`None`. + + +.. method:: DefaultCookiePolicy.is_not_allowed(domain) + + Return whether *domain* is not on the whitelist for setting or receiving + cookies. + +:class:`DefaultCookiePolicy` instances have the following attributes, which are +all initialised from the constructor arguments of the same name, and which may +all be assigned to. + + +.. attribute:: DefaultCookiePolicy.rfc2109_as_netscape + + If true, request that the :class:`CookieJar` instance downgrade RFC 2109 cookies + (ie. cookies received in a :mailheader:`Set-Cookie` header with a version + cookie-attribute of 1) to Netscape cookies by setting the version attribute of + the :class:`Cookie` instance to 0. The default value is :const:`None`, in which + case RFC 2109 cookies are downgraded if and only if RFC 2965 handling is turned + off. Therefore, RFC 2109 cookies are downgraded by default. + + .. versionadded:: 2.5 + +General strictness switches: + + +.. attribute:: DefaultCookiePolicy.strict_domain + + Don't allow sites to set two-component domains with country-code top-level + domains like ``.co.uk``, ``.gov.uk``, ``.co.nz``.etc. This is far from perfect + and isn't guaranteed to work! + +RFC 2965 protocol strictness switches: + + +.. attribute:: DefaultCookiePolicy.strict_rfc2965_unverifiable + + Follow RFC 2965 rules on unverifiable transactions (usually, an unverifiable + transaction is one resulting from a redirect or a request for an image hosted on + another site). If this is false, cookies are *never* blocked on the basis of + verifiability + +Netscape protocol strictness switches: + + +.. attribute:: DefaultCookiePolicy.strict_ns_unverifiable + + apply RFC 2965 rules on unverifiable transactions even to Netscape cookies + + +.. attribute:: DefaultCookiePolicy.strict_ns_domain + + Flags indicating how strict to be with domain-matching rules for Netscape + cookies. See below for acceptable values. + + +.. attribute:: DefaultCookiePolicy.strict_ns_set_initial_dollar + + Ignore cookies in Set-Cookie: headers that have names starting with ``'$'``. + + +.. attribute:: DefaultCookiePolicy.strict_ns_set_path + + Don't allow setting cookies whose path doesn't path-match request URI. + +:attr:`strict_ns_domain` is a collection of flags. Its value is constructed by +or-ing together (for example, ``DomainStrictNoDots|DomainStrictNonDomain`` means +both flags are set). + + +.. attribute:: DefaultCookiePolicy.DomainStrictNoDots + + When setting cookies, the 'host prefix' must not contain a dot (eg. + ``www.foo.bar.com`` can't set a cookie for ``.bar.com``, because ``www.foo`` + contains a dot). + + +.. attribute:: DefaultCookiePolicy.DomainStrictNonDomain + + Cookies that did not explicitly specify a ``domain`` cookie-attribute can only + be returned to a domain equal to the domain that set the cookie (eg. + ``spam.example.com`` won't be returned cookies from ``example.com`` that had no + ``domain`` cookie-attribute). + + +.. attribute:: DefaultCookiePolicy.DomainRFC2965Match + + When setting cookies, require a full RFC 2965 domain-match. + +The following attributes are provided for convenience, and are the most useful +combinations of the above flags: + + +.. attribute:: DefaultCookiePolicy.DomainLiberal + + Equivalent to 0 (ie. all of the above Netscape domain strictness flags switched + off). + + +.. attribute:: DefaultCookiePolicy.DomainStrict + + Equivalent to ``DomainStrictNoDots|DomainStrictNonDomain``. + + +.. _cookielib-cookie-objects: + +Cookie Objects +-------------- + +:class:`Cookie` instances have Python attributes roughly corresponding to the +standard cookie-attributes specified in the various cookie standards. The +correspondence is not one-to-one, because there are complicated rules for +assigning default values, because the ``max-age`` and ``expires`` +cookie-attributes contain equivalent information, and because RFC 2109 cookies +may be 'downgraded' by :mod:`cookielib` from version 1 to version 0 (Netscape) +cookies. + +Assignment to these attributes should not be necessary other than in rare +circumstances in a :class:`CookiePolicy` method. The class does not enforce +internal consistency, so you should know what you're doing if you do that. + + +.. attribute:: Cookie.version + + Integer or :const:`None`. Netscape cookies have :attr:`version` 0. RFC 2965 and + RFC 2109 cookies have a ``version`` cookie-attribute of 1. However, note that + :mod:`cookielib` may 'downgrade' RFC 2109 cookies to Netscape cookies, in which + case :attr:`version` is 0. + + +.. attribute:: Cookie.name + + Cookie name (a string). + + +.. attribute:: Cookie.value + + Cookie value (a string), or :const:`None`. + + +.. attribute:: Cookie.port + + String representing a port or a set of ports (eg. '80', or '80,8080'), or + :const:`None`. + + +.. attribute:: Cookie.path + + Cookie path (a string, eg. ``'/acme/rocket_launchers'``). + + +.. attribute:: Cookie.secure + + True if cookie should only be returned over a secure connection. + + +.. attribute:: Cookie.expires + + Integer expiry date in seconds since epoch, or :const:`None`. See also the + :meth:`is_expired` method. + + +.. attribute:: Cookie.discard + + True if this is a session cookie. + + +.. attribute:: Cookie.comment + + String comment from the server explaining the function of this cookie, or + :const:`None`. + + +.. attribute:: Cookie.comment_url + + URL linking to a comment from the server explaining the function of this cookie, + or :const:`None`. + + +.. attribute:: Cookie.rfc2109 + + True if this cookie was received as an RFC 2109 cookie (ie. the cookie + arrived in a :mailheader:`Set-Cookie` header, and the value of the Version + cookie-attribute in that header was 1). This attribute is provided because + :mod:`cookielib` may 'downgrade' RFC 2109 cookies to Netscape cookies, in + which case :attr:`version` is 0. + + .. versionadded:: 2.5 + + +.. attribute:: Cookie.port_specified + + True if a port or set of ports was explicitly specified by the server (in the + :mailheader:`Set-Cookie` / :mailheader:`Set-Cookie2` header). + + +.. attribute:: Cookie.domain_specified + + True if a domain was explicitly specified by the server. + + +.. attribute:: Cookie.domain_initial_dot + + True if the domain explicitly specified by the server began with a dot + (``'.'``). + +Cookies may have additional non-standard cookie-attributes. These may be +accessed using the following methods: + + +.. method:: Cookie.has_nonstandard_attr(name) + + Return true if cookie has the named cookie-attribute. + + +.. method:: Cookie.get_nonstandard_attr(name, default=None) + + If cookie has the named cookie-attribute, return its value. Otherwise, return + *default*. + + +.. method:: Cookie.set_nonstandard_attr(name, value) + + Set the value of the named cookie-attribute. + +The :class:`Cookie` class also defines the following method: + + +.. method:: Cookie.is_expired([now=:const:`None`]) + + True if cookie has passed the time at which the server requested it should + expire. If *now* is given (in seconds since the epoch), return whether the + cookie has expired at the specified time. + + +.. _cookielib-examples: + +Examples +-------- + +The first example shows the most common usage of :mod:`cookielib`:: + + import cookielib, urllib2 + cj = cookielib.CookieJar() + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + r = opener.open("http://example.com/") + +This example illustrates how to open a URL using your Netscape, Mozilla, or Lynx +cookies (assumes Unix/Netscape convention for location of the cookies file):: + + import os, cookielib, urllib2 + cj = cookielib.MozillaCookieJar() + cj.load(os.path.join(os.environ["HOME"], ".netscape/cookies.txt")) + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + r = opener.open("http://example.com/") + +The next example illustrates the use of :class:`DefaultCookiePolicy`. Turn on +RFC 2965 cookies, be more strict about domains when setting and returning +Netscape cookies, and block some domains from setting cookies or having them +returned:: + + import urllib2 + from cookielib import CookieJar, DefaultCookiePolicy + policy = DefaultCookiePolicy( + rfc2965=True, strict_ns_domain=Policy.DomainStrict, + blocked_domains=["ads.net", ".ads.net"]) + cj = CookieJar(policy) + opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + r = opener.open("http://example.com/") + diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst new file mode 100644 index 0000000..6fb3100 --- /dev/null +++ b/Doc/library/copy.rst @@ -0,0 +1,85 @@ + +:mod:`copy` --- Shallow and deep copy operations +================================================ + +.. module:: copy + :synopsis: Shallow and deep copy operations. + + +.. index:: + single: copy() (in copy) + single: deepcopy() (in copy) + +This module provides generic (shallow and deep) copying operations. + +Interface summary:: + + import copy + + x = copy.copy(y) # make a shallow copy of y + x = copy.deepcopy(y) # make a deep copy of y + +For module specific errors, :exc:`copy.error` is raised. + +.. % + +The difference between shallow and deep copying is only relevant for compound +objects (objects that contain other objects, like lists or class instances): + +* A *shallow copy* constructs a new compound object and then (to the extent + possible) inserts *references* into it to the objects found in the original. + +* A *deep copy* constructs a new compound object and then, recursively, inserts + *copies* into it of the objects found in the original. + +Two problems often exist with deep copy operations that don't exist with shallow +copy operations: + +* Recursive objects (compound objects that, directly or indirectly, contain a + reference to themselves) may cause a recursive loop. + +* Because deep copy copies *everything* it may copy too much, e.g., + administrative data structures that should be shared even between copies. + +The :func:`deepcopy` function avoids these problems by: + +* keeping a "memo" dictionary of objects already copied during the current + copying pass; and + +* letting user-defined classes override the copying operation or the set of + components copied. + +This module does not copy types like module, method, stack trace, stack frame, +file, socket, window, array, or any similar types. It does "copy" functions and +classes (shallow and deeply), by returning the original object unchanged; this +is compatible with the way these are treated by the :mod:`pickle` module. + +.. versionchanged:: 2.5 + Added copying functions. + +.. index:: module: pickle + +Classes can use the same interfaces to control copying that they use to control +pickling. See the description of module :mod:`pickle` for information on these +methods. The :mod:`copy` module does not use the :mod:`copy_reg` registration +module. + +.. index:: + single: __copy__() (copy protocol) + single: __deepcopy__() (copy protocol) + +In order for a class to define its own copy implementation, it can define +special methods :meth:`__copy__` and :meth:`__deepcopy__`. The former is called +to implement the shallow copy operation; no additional arguments are passed. +The latter is called to implement the deep copy operation; it is passed one +argument, the memo dictionary. If the :meth:`__deepcopy__` implementation needs +to make a deep copy of a component, it should call the :func:`deepcopy` function +with the component as first argument and the memo dictionary as second argument. + + +.. seealso:: + + Module :mod:`pickle` + Discussion of the special methods used to support object state retrieval and + restoration. + diff --git a/Doc/library/copy_reg.rst b/Doc/library/copy_reg.rst new file mode 100644 index 0000000..9b82a31 --- /dev/null +++ b/Doc/library/copy_reg.rst @@ -0,0 +1,42 @@ + +:mod:`copy_reg` --- Register :mod:`pickle` support functions +============================================================ + +.. module:: copy_reg + :synopsis: Register pickle support functions. + + +.. index:: + module: pickle + module: cPickle + module: copy + +The :mod:`copy_reg` module provides support for the :mod:`pickle` and +:mod:`cPickle` modules. The :mod:`copy` module is likely to use this in the +future as well. It provides configuration information about object constructors +which are not classes. Such constructors may be factory functions or class +instances. + + +.. function:: constructor(object) + + Declares *object* to be a valid constructor. If *object* is not callable (and + hence not valid as a constructor), raises :exc:`TypeError`. + + +.. function:: pickle(type, function[, constructor]) + + Declares that *function* should be used as a "reduction" function for objects of + type *type*; *type* must not be a "classic" class object. (Classic classes are + handled differently; see the documentation for the :mod:`pickle` module for + details.) *function* should return either a string or a tuple containing two or + three elements. + + The optional *constructor* parameter, if provided, is a callable object which + can be used to reconstruct the object when called with the tuple of arguments + returned by *function* at pickling time. :exc:`TypeError` will be raised if + *object* is a class or *constructor* is not callable. + + See the :mod:`pickle` module for more details on the interface expected of + *function* and *constructor*. + diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst new file mode 100644 index 0000000..8840fc7 --- /dev/null +++ b/Doc/library/crypt.rst @@ -0,0 +1,66 @@ + +:mod:`crypt` --- Function to check Unix passwords +================================================= + +.. module:: crypt + :platform: Unix + :synopsis: The crypt() function used to check Unix passwords. +.. moduleauthor:: Steven D. Majewski +.. sectionauthor:: Steven D. Majewski +.. sectionauthor:: Peter Funk + + +.. index:: + single: crypt(3) + pair: cipher; DES + +This module implements an interface to the :manpage:`crypt(3)` routine, which is +a one-way hash function based upon a modified DES algorithm; see the Unix man +page for further details. Possible uses include allowing Python scripts to +accept typed passwords from the user, or attempting to crack Unix passwords with +a dictionary. + +.. index:: single: crypt(3) + +Notice that the behavior of this module depends on the actual implementation of +the :manpage:`crypt(3)` routine in the running system. Therefore, any +extensions available on the current implementation will also be available on +this module. + + +.. function:: crypt(word, salt) + + *word* will usually be a user's password as typed at a prompt or in a graphical + interface. *salt* is usually a random two-character string which will be used + to perturb the DES algorithm in one of 4096 ways. The characters in *salt* must + be in the set ``[./a-zA-Z0-9]``. Returns the hashed password as a string, which + will be composed of characters from the same alphabet as the salt (the first two + characters represent the salt itself). + + .. index:: single: crypt(3) + + Since a few :manpage:`crypt(3)` extensions allow different values, with + different sizes in the *salt*, it is recommended to use the full crypted + password as salt when checking for a password. + +A simple example illustrating typical use:: + + import crypt, getpass, pwd + + def raw_input(prompt): + import sys + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + + def login(): + username = raw_input('Python login:') + cryptedpasswd = pwd.getpwnam(username)[1] + if cryptedpasswd: + if cryptedpasswd == 'x' or cryptedpasswd == '*': + raise "Sorry, currently no support for shadow passwords" + cleartext = getpass.getpass() + return crypt.crypt(cleartext, cryptedpasswd) == cryptedpasswd + else: + return 1 + diff --git a/Doc/library/crypto.rst b/Doc/library/crypto.rst new file mode 100644 index 0000000..dce5a01 --- /dev/null +++ b/Doc/library/crypto.rst @@ -0,0 +1,30 @@ + +.. _crypto: + +********************** +Cryptographic Services +********************** + +.. index:: single: cryptography + +The modules described in this chapter implement various algorithms of a +cryptographic nature. They are available at the discretion of the installation. +Here's an overview: + + +.. toctree:: + + hashlib.rst + hmac.rst + +.. index:: + pair: AES; algorithm + single: cryptography + single: Kuchling, Andrew + +Hardcore cypherpunks will probably find the cryptographic modules written by +A.M. Kuchling of further interest; the package contains modules for various +encryption algorithms, most notably AES. These modules are not distributed with +Python but available separately. See the URL +http://www.amk.ca/python/code/crypto.html for more information. + diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst new file mode 100644 index 0000000..19123c6 --- /dev/null +++ b/Doc/library/csv.rst @@ -0,0 +1,530 @@ + +:mod:`csv` --- CSV File Reading and Writing +=========================================== + +.. module:: csv + :synopsis: Write and read tabular data to and from delimited files. +.. sectionauthor:: Skip Montanaro + + +.. versionadded:: 2.3 + +.. index:: + single: csv + pair: data; tabular + +The so-called CSV (Comma Separated Values) format is the most common import and +export format for spreadsheets and databases. There is no "CSV standard", so +the format is operationally defined by the many applications which read and +write it. The lack of a standard means that subtle differences often exist in +the data produced and consumed by different applications. These differences can +make it annoying to process CSV files from multiple sources. Still, while the +delimiters and quoting characters vary, the overall format is similar enough +that it is possible to write a single module which can efficiently manipulate +such data, hiding the details of reading and writing the data from the +programmer. + +The :mod:`csv` module implements classes to read and write tabular data in CSV +format. It allows programmers to say, "write this data in the format preferred +by Excel," or "read data from this file which was generated by Excel," without +knowing the precise details of the CSV format used by Excel. Programmers can +also describe the CSV formats understood by other applications or define their +own special-purpose CSV formats. + +The :mod:`csv` module's :class:`reader` and :class:`writer` objects read and +write sequences. Programmers can also read and write data in dictionary form +using the :class:`DictReader` and :class:`DictWriter` classes. + +.. note:: + + This version of the :mod:`csv` module doesn't support Unicode input. Also, + there are currently some issues regarding ASCII NUL characters. Accordingly, + all input should be UTF-8 or printable ASCII to be safe; see the examples in + section :ref:`csv-examples`. These restrictions will be removed in the future. + + +.. seealso:: + + .. % \seemodule{array}{Arrays of uniformly types numeric values.} + + :pep:`305` - CSV File API + The Python Enhancement Proposal which proposed this addition to Python. + + +.. _csv-contents: + +Module Contents +--------------- + +The :mod:`csv` module defines the following functions: + + +.. function:: reader(csvfile[, dialect='excel'][, fmtparam]) + + Return a reader object which will iterate over lines in the given *csvfile*. + *csvfile* can be any object which supports the iterator protocol and returns a + string each time its :meth:`next` method is called --- file objects and list + objects are both suitable. If *csvfile* is a file object, it must be opened + with the 'b' flag on platforms where that makes a difference. An optional + *dialect* parameter can be given which is used to define a set of parameters + specific to a particular CSV dialect. It may be an instance of a subclass of + the :class:`Dialect` class or one of the strings returned by the + :func:`list_dialects` function. The other optional *fmtparam* keyword arguments + can be given to override individual formatting parameters in the current + dialect. For full details about the dialect and formatting parameters, see + section :ref:`csv-fmt-params`. + + All data read are returned as strings. No automatic data type conversion is + performed. + + .. versionchanged:: 2.5 + The parser is now stricter with respect to multi-line quoted fields. Previously, + if a line ended within a quoted field without a terminating newline character, a + newline would be inserted into the returned field. This behavior caused problems + when reading files which contained carriage return characters within fields. + The behavior was changed to return the field without inserting newlines. As a + consequence, if newlines embedded within fields are important, the input should + be split into lines in a manner which preserves the newline characters. + + +.. function:: writer(csvfile[, dialect='excel'][, fmtparam]) + + Return a writer object responsible for converting the user's data into delimited + strings on the given file-like object. *csvfile* can be any object with a + :func:`write` method. If *csvfile* is a file object, it must be opened with the + 'b' flag on platforms where that makes a difference. An optional *dialect* + parameter can be given which is used to define a set of parameters specific to a + particular CSV dialect. It may be an instance of a subclass of the + :class:`Dialect` class or one of the strings returned by the + :func:`list_dialects` function. The other optional *fmtparam* keyword arguments + can be given to override individual formatting parameters in the current + dialect. For full details about the dialect and formatting parameters, see + section :ref:`csv-fmt-params`. To make it + as easy as possible to interface with modules which implement the DB API, the + value :const:`None` is written as the empty string. While this isn't a + reversible transformation, it makes it easier to dump SQL NULL data values to + CSV files without preprocessing the data returned from a ``cursor.fetch*`` call. + All other non-string data are stringified with :func:`str` before being written. + + +.. function:: register_dialect(name[, dialect][, fmtparam]) + + Associate *dialect* with *name*. *name* must be a string or Unicode object. The + dialect can be specified either by passing a sub-class of :class:`Dialect`, or + by *fmtparam* keyword arguments, or both, with keyword arguments overriding + parameters of the dialect. For full details about the dialect and formatting + parameters, see section :ref:`csv-fmt-params`. + + +.. function:: unregister_dialect(name) + + Delete the dialect associated with *name* from the dialect registry. An + :exc:`Error` is raised if *name* is not a registered dialect name. + + +.. function:: get_dialect(name) + + Return the dialect associated with *name*. An :exc:`Error` is raised if *name* + is not a registered dialect name. + + +.. function:: list_dialects() + + Return the names of all registered dialects. + + +.. function:: field_size_limit([new_limit]) + + Returns the current maximum field size allowed by the parser. If *new_limit* is + given, this becomes the new limit. + + .. versionadded:: 2.5 + +The :mod:`csv` module defines the following classes: + + +.. class:: DictReader(csvfile[, fieldnames=:const:None,[, restkey=:const:None[, restval=None[, dialect='excel'[, *args, **kwds]]]]]) + + Create an object which operates like a regular reader but maps the information + read into a dict whose keys are given by the optional *fieldnames* parameter. + If the *fieldnames* parameter is omitted, the values in the first row of the + *csvfile* will be used as the fieldnames. If the row read has fewer fields than + the fieldnames sequence, the value of *restval* will be used as the default + value. If the row read has more fields than the fieldnames sequence, the + remaining data is added as a sequence keyed by the value of *restkey*. If the + row read has fewer fields than the fieldnames sequence, the remaining keys take + the value of the optional *restval* parameter. Any other optional or keyword + arguments are passed to the underlying :class:`reader` instance. + + +.. class:: DictWriter(csvfile, fieldnames[, restval=''[, extrasaction='raise'[, dialect='excel'[, *args, **kwds]]]]) + + Create an object which operates like a regular writer but maps dictionaries onto + output rows. The *fieldnames* parameter identifies the order in which values in + the dictionary passed to the :meth:`writerow` method are written to the + *csvfile*. The optional *restval* parameter specifies the value to be written + if the dictionary is missing a key in *fieldnames*. If the dictionary passed to + the :meth:`writerow` method contains a key not found in *fieldnames*, the + optional *extrasaction* parameter indicates what action to take. If it is set + to ``'raise'`` a :exc:`ValueError` is raised. If it is set to ``'ignore'``, + extra values in the dictionary are ignored. Any other optional or keyword + arguments are passed to the underlying :class:`writer` instance. + + Note that unlike the :class:`DictReader` class, the *fieldnames* parameter of + the :class:`DictWriter` is not optional. Since Python's :class:`dict` objects + are not ordered, there is not enough information available to deduce the order + in which the row should be written to the *csvfile*. + + +.. class:: Dialect + + The :class:`Dialect` class is a container class relied on primarily for its + attributes, which are used to define the parameters for a specific + :class:`reader` or :class:`writer` instance. + + +.. class:: excel() + + The :class:`excel` class defines the usual properties of an Excel-generated CSV + file. It is registered with the dialect name ``'excel'``. + + +.. class:: excel_tab() + + The :class:`excel_tab` class defines the usual properties of an Excel-generated + TAB-delimited file. It is registered with the dialect name ``'excel-tab'``. + + +.. class:: Sniffer() + + The :class:`Sniffer` class is used to deduce the format of a CSV file. + +The :class:`Sniffer` class provides two methods: + + +.. method:: Sniffer.sniff(sample[, delimiters=None]) + + Analyze the given *sample* and return a :class:`Dialect` subclass reflecting the + parameters found. If the optional *delimiters* parameter is given, it is + interpreted as a string containing possible valid delimiter characters. + + +.. method:: Sniffer.has_header(sample) + + Analyze the sample text (presumed to be in CSV format) and return :const:`True` + if the first row appears to be a series of column headers. + +The :mod:`csv` module defines the following constants: + + +.. data:: QUOTE_ALL + + Instructs :class:`writer` objects to quote all fields. + + +.. data:: QUOTE_MINIMAL + + Instructs :class:`writer` objects to only quote those fields which contain + special characters such as *delimiter*, *quotechar* or any of the characters in + *lineterminator*. + + +.. data:: QUOTE_NONNUMERIC + + Instructs :class:`writer` objects to quote all non-numeric fields. + + Instructs the reader to convert all non-quoted fields to type *float*. + + +.. data:: QUOTE_NONE + + Instructs :class:`writer` objects to never quote fields. When the current + *delimiter* occurs in output data it is preceded by the current *escapechar* + character. If *escapechar* is not set, the writer will raise :exc:`Error` if + any characters that require escaping are encountered. + + Instructs :class:`reader` to perform no special processing of quote characters. + +The :mod:`csv` module defines the following exception: + + +.. exception:: Error + + Raised by any of the functions when an error is detected. + + +.. _csv-fmt-params: + +Dialects and Formatting Parameters +---------------------------------- + +To make it easier to specify the format of input and output records, specific +formatting parameters are grouped together into dialects. A dialect is a +subclass of the :class:`Dialect` class having a set of specific methods and a +single :meth:`validate` method. When creating :class:`reader` or +:class:`writer` objects, the programmer can specify a string or a subclass of +the :class:`Dialect` class as the dialect parameter. In addition to, or instead +of, the *dialect* parameter, the programmer can also specify individual +formatting parameters, which have the same names as the attributes defined below +for the :class:`Dialect` class. + +Dialects support the following attributes: + + +.. attribute:: Dialect.delimiter + + A one-character string used to separate fields. It defaults to ``','``. + + +.. attribute:: Dialect.doublequote + + Controls how instances of *quotechar* appearing inside a field should be + themselves be quoted. When :const:`True`, the character is doubled. When + :const:`False`, the *escapechar* is used as a prefix to the *quotechar*. It + defaults to :const:`True`. + + On output, if *doublequote* is :const:`False` and no *escapechar* is set, + :exc:`Error` is raised if a *quotechar* is found in a field. + + +.. attribute:: Dialect.escapechar + + A one-character string used by the writer to escape the *delimiter* if *quoting* + is set to :const:`QUOTE_NONE` and the *quotechar* if *doublequote* is + :const:`False`. On reading, the *escapechar* removes any special meaning from + the following character. It defaults to :const:`None`, which disables escaping. + + +.. attribute:: Dialect.lineterminator + + The string used to terminate lines produced by the :class:`writer`. It defaults + to ``'\r\n'``. + + .. note:: + + The :class:`reader` is hard-coded to recognise either ``'\r'`` or ``'\n'`` as + end-of-line, and ignores *lineterminator*. This behavior may change in the + future. + + +.. attribute:: Dialect.quotechar + + A one-character string used to quote fields containing special characters, such + as the *delimiter* or *quotechar*, or which contain new-line characters. It + defaults to ``'"'``. + + +.. attribute:: Dialect.quoting + + Controls when quotes should be generated by the writer and recognised by the + reader. It can take on any of the :const:`QUOTE_\*` constants (see section + :ref:`csv-contents`) and defaults to :const:`QUOTE_MINIMAL`. + + +.. attribute:: Dialect.skipinitialspace + + When :const:`True`, whitespace immediately following the *delimiter* is ignored. + The default is :const:`False`. + + +Reader Objects +-------------- + +Reader objects (:class:`DictReader` instances and objects returned by the +:func:`reader` function) have the following public methods: + + +.. method:: csvreader.next() + + Return the next row of the reader's iterable object as a list, parsed according + to the current dialect. + +Reader objects have the following public attributes: + + +.. attribute:: csvreader.dialect + + A read-only description of the dialect in use by the parser. + + +.. attribute:: csvreader.line_num + + The number of lines read from the source iterator. This is not the same as the + number of records returned, as records can span multiple lines. + + .. versionadded:: 2.5 + + +Writer Objects +-------------- + +:class:`Writer` objects (:class:`DictWriter` instances and objects returned by +the :func:`writer` function) have the following public methods. A *row* must be +a sequence of strings or numbers for :class:`Writer` objects and a dictionary +mapping fieldnames to strings or numbers (by passing them through :func:`str` +first) for :class:`DictWriter` objects. Note that complex numbers are written +out surrounded by parens. This may cause some problems for other programs which +read CSV files (assuming they support complex numbers at all). + + +.. method:: csvwriter.writerow(row) + + Write the *row* parameter to the writer's file object, formatted according to + the current dialect. + + +.. method:: csvwriter.writerows(rows) + + Write all the *rows* parameters (a list of *row* objects as described above) to + the writer's file object, formatted according to the current dialect. + +Writer objects have the following public attribute: + + +.. attribute:: csvwriter.dialect + + A read-only description of the dialect in use by the writer. + + +.. _csv-examples: + +Examples +-------- + +The simplest example of reading a CSV file:: + + import csv + reader = csv.reader(open("some.csv", "rb")) + for row in reader: + print row + +Reading a file with an alternate format:: + + import csv + reader = csv.reader(open("passwd", "rb"), delimiter=':', quoting=csv.QUOTE_NONE) + for row in reader: + print row + +The corresponding simplest possible writing example is:: + + import csv + writer = csv.writer(open("some.csv", "wb")) + writer.writerows(someiterable) + +Registering a new dialect:: + + import csv + + csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE) + + reader = csv.reader(open("passwd", "rb"), 'unixpwd') + +A slightly more advanced use of the reader --- catching and reporting errors:: + + import csv, sys + filename = "some.csv" + reader = csv.reader(open(filename, "rb")) + try: + for row in reader: + print row + except csv.Error as e: + sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e)) + +And while the module doesn't directly support parsing strings, it can easily be +done:: + + import csv + for row in csv.reader(['one,two,three']): + print row + +The :mod:`csv` module doesn't directly support reading and writing Unicode, but +it is 8-bit-clean save for some problems with ASCII NUL characters. So you can +write functions or classes that handle the encoding and decoding for you as long +as you avoid encodings like UTF-16 that use NULs. UTF-8 is recommended. + +:func:`unicode_csv_reader` below is a generator that wraps :class:`csv.reader` +to handle Unicode CSV data (a list of Unicode strings). :func:`utf_8_encoder` +is a generator that encodes the Unicode strings as UTF-8, one string (or row) at +a time. The encoded strings are parsed by the CSV reader, and +:func:`unicode_csv_reader` decodes the UTF-8-encoded cells back into Unicode:: + + import csv + + def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs): + # csv.py doesn't do Unicode; encode temporarily as UTF-8: + csv_reader = csv.reader(utf_8_encoder(unicode_csv_data), + dialect=dialect, **kwargs) + for row in csv_reader: + # decode UTF-8 back to Unicode, cell by cell: + yield [unicode(cell, 'utf-8') for cell in row] + + def utf_8_encoder(unicode_csv_data): + for line in unicode_csv_data: + yield line.encode('utf-8') + +For all other encodings the following :class:`UnicodeReader` and +:class:`UnicodeWriter` classes can be used. They take an additional *encoding* +parameter in their constructor and make sure that the data passes the real +reader or writer encoded as UTF-8:: + + import csv, codecs, cStringIO + + class UTF8Recoder: + """ + Iterator that reads an encoded stream and reencodes the input to UTF-8 + """ + def __init__(self, f, encoding): + self.reader = codecs.getreader(encoding)(f) + + def __iter__(self): + return self + + def __next__(self): + return next(self.reader).encode("utf-8") + + class UnicodeReader: + """ + A CSV reader which will iterate over lines in the CSV file "f", + which is encoded in the given encoding. + """ + + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + f = UTF8Recoder(f, encoding) + self.reader = csv.reader(f, dialect=dialect, **kwds) + + def __next__(self): + row = next(self.reader) + return [unicode(s, "utf-8") for s in row] + + def __iter__(self): + return self + + class UnicodeWriter: + """ + A CSV writer which will write rows to CSV file "f", + which is encoded in the given encoding. + """ + + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + # Redirect output to a queue + self.queue = cStringIO.StringIO() + self.writer = csv.writer(self.queue, dialect=dialect, **kwds) + self.stream = f + self.encoder = codecs.getincrementalencoder(encoding)() + + def writerow(self, row): + self.writer.writerow([s.encode("utf-8") for s in row]) + # Fetch UTF-8 output from the queue ... + data = self.queue.getvalue() + data = data.decode("utf-8") + # ... and reencode it into the target encoding + data = self.encoder.encode(data) + # write to the target stream + self.stream.write(data) + # empty queue + self.queue.truncate(0) + + def writerows(self, rows): + for row in rows: + self.writerow(row) + diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst new file mode 100644 index 0000000..dc37565 --- /dev/null +++ b/Doc/library/ctypes.rst @@ -0,0 +1,2364 @@ + +:mod:`ctypes` --- A foreign function library for Python. +======================================================== + +.. module:: ctypes + :synopsis: A foreign function library for Python. +.. moduleauthor:: Thomas Heller + + +.. versionadded:: 2.5 + +``ctypes`` is a foreign function library for Python. It provides C compatible +data types, and allows calling functions in dlls/shared libraries. It can be +used to wrap these libraries in pure Python. + + +.. _ctypes-ctypes-tutorial: + +ctypes tutorial +--------------- + +Note: The code samples in this tutorial use ``doctest`` to make sure that they +actually work. Since some code samples behave differently under Linux, Windows, +or Mac OS X, they contain doctest directives in comments. + +Note: Some code sample references the ctypes :class:`c_int` type. This type is +an alias to the :class:`c_long` type on 32-bit systems. So, you should not be +confused if :class:`c_long` is printed if you would expect :class:`c_int` --- +they are actually the same type. + + +.. _ctypes-loading-dynamic-link-libraries: + +Loading dynamic link libraries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``ctypes`` exports the *cdll*, and on Windows also *windll* and *oledll* objects +to load dynamic link libraries. + +You load libraries by accessing them as attributes of these objects. *cdll* +loads libraries which export functions using the standard ``cdecl`` calling +convention, while *windll* libraries call functions using the ``stdcall`` +calling convention. *oledll* also uses the ``stdcall`` calling convention, and +assumes the functions return a Windows :class:`HRESULT` error code. The error +code is used to automatically raise :class:`WindowsError` Python exceptions when +the function call fails. + +Here are some examples for Windows. Note that ``msvcrt`` is the MS standard C +library containing most standard C functions, and uses the cdecl calling +convention:: + + >>> from ctypes import * + >>> print windll.kernel32 # doctest: +WINDOWS + + >>> print cdll.msvcrt # doctest: +WINDOWS + + >>> libc = cdll.msvcrt # doctest: +WINDOWS + >>> + +Windows appends the usual '.dll' file suffix automatically. + +On Linux, it is required to specify the filename *including* the extension to +load a library, so attribute access does not work. Either the +:meth:`LoadLibrary` method of the dll loaders should be used, or you should load +the library by creating an instance of CDLL by calling the constructor:: + + >>> cdll.LoadLibrary("libc.so.6") # doctest: +LINUX + + >>> libc = CDLL("libc.so.6") # doctest: +LINUX + >>> libc # doctest: +LINUX + + >>> + +.. % XXX Add section for Mac OS X. + + +.. _ctypes-accessing-functions-from-loaded-dlls: + +Accessing functions from loaded dlls +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Functions are accessed as attributes of dll objects:: + + >>> from ctypes import * + >>> libc.printf + <_FuncPtr object at 0x...> + >>> print windll.kernel32.GetModuleHandleA # doctest: +WINDOWS + <_FuncPtr object at 0x...> + >>> print windll.kernel32.MyOwnFunction # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + File "ctypes.py", line 239, in __getattr__ + func = _StdcallFuncPtr(name, self) + AttributeError: function 'MyOwnFunction' not found + >>> + +Note that win32 system dlls like ``kernel32`` and ``user32`` often export ANSI +as well as UNICODE versions of a function. The UNICODE version is exported with +an ``W`` appended to the name, while the ANSI version is exported with an ``A`` +appended to the name. The win32 ``GetModuleHandle`` function, which returns a +*module handle* for a given module name, has the following C prototype, and a +macro is used to expose one of them as ``GetModuleHandle`` depending on whether +UNICODE is defined or not:: + + /* ANSI version */ + HMODULE GetModuleHandleA(LPCSTR lpModuleName); + /* UNICODE version */ + HMODULE GetModuleHandleW(LPCWSTR lpModuleName); + +*windll* does not try to select one of them by magic, you must access the +version you need by specifying ``GetModuleHandleA`` or ``GetModuleHandleW`` +explicitely, and then call it with normal strings or unicode strings +respectively. + +Sometimes, dlls export functions with names which aren't valid Python +identifiers, like ``"??2@YAPAXI@Z"``. In this case you have to use ``getattr`` +to retrieve the function:: + + >>> getattr(cdll.msvcrt, "??2@YAPAXI@Z") # doctest: +WINDOWS + <_FuncPtr object at 0x...> + >>> + +On Windows, some dlls export functions not by name but by ordinal. These +functions can be accessed by indexing the dll object with the ordinal number:: + + >>> cdll.kernel32[1] # doctest: +WINDOWS + <_FuncPtr object at 0x...> + >>> cdll.kernel32[0] # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + File "ctypes.py", line 310, in __getitem__ + func = _StdcallFuncPtr(name, self) + AttributeError: function ordinal 0 not found + >>> + + +.. _ctypes-calling-functions: + +Calling functions +^^^^^^^^^^^^^^^^^ + +You can call these functions like any other Python callable. This example uses +the ``time()`` function, which returns system time in seconds since the Unix +epoch, and the ``GetModuleHandleA()`` function, which returns a win32 module +handle. + +This example calls both functions with a NULL pointer (``None`` should be used +as the NULL pointer):: + + >>> print libc.time(None) # doctest: +SKIP + 1150640792 + >>> print hex(windll.kernel32.GetModuleHandleA(None)) # doctest: +WINDOWS + 0x1d000000 + >>> + +``ctypes`` tries to protect you from calling functions with the wrong number of +arguments or the wrong calling convention. Unfortunately this only works on +Windows. It does this by examining the stack after the function returns, so +although an error is raised the function *has* been called:: + + >>> windll.kernel32.GetModuleHandleA() # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + ValueError: Procedure probably called with not enough arguments (4 bytes missing) + >>> windll.kernel32.GetModuleHandleA(0, 0) # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + ValueError: Procedure probably called with too many arguments (4 bytes in excess) + >>> + +The same exception is raised when you call an ``stdcall`` function with the +``cdecl`` calling convention, or vice versa:: + + >>> cdll.kernel32.GetModuleHandleA(None) # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + ValueError: Procedure probably called with not enough arguments (4 bytes missing) + >>> + + >>> windll.msvcrt.printf("spam") # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + ValueError: Procedure probably called with too many arguments (4 bytes in excess) + >>> + +To find out the correct calling convention you have to look into the C header +file or the documentation for the function you want to call. + +On Windows, ``ctypes`` uses win32 structured exception handling to prevent +crashes from general protection faults when functions are called with invalid +argument values:: + + >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + WindowsError: exception: access violation reading 0x00000020 + >>> + +There are, however, enough ways to crash Python with ``ctypes``, so you should +be careful anyway. + +``None``, integers, longs, byte strings and unicode strings are the only native +Python objects that can directly be used as parameters in these function calls. +``None`` is passed as a C ``NULL`` pointer, byte strings and unicode strings are +passed as pointer to the memory block that contains their data (``char *`` or +``wchar_t *``). Python integers and Python longs are passed as the platforms +default C ``int`` type, their value is masked to fit into the C type. + +Before we move on calling functions with other parameter types, we have to learn +more about ``ctypes`` data types. + + +.. _ctypes-fundamental-data-types: + +Fundamental data types +^^^^^^^^^^^^^^^^^^^^^^ + +``ctypes`` defines a number of primitive C compatible data types : + + +----------------------+--------------------------------+----------------------------+ + | ctypes type | C type | Python type | + +======================+================================+============================+ + | :class:`c_char` | ``char`` | 1-character string | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_wchar` | ``wchar_t`` | 1-character unicode string | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_byte` | ``char`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_ubyte` | ``unsigned char`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_short` | ``short`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_ushort` | ``unsigned short`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_int` | ``int`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_uint` | ``unsigned int`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_long` | ``long`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_ulong` | ``unsigned long`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_longlong` | ``__int64`` or ``long long`` | int/long | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_ulonglong` | ``unsigned __int64`` or | int/long | + | | ``unsigned long long`` | | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_float` | ``float`` | float | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_double` | ``double`` | float | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_char_p` | ``char *`` (NUL terminated) | string or ``None`` | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_wchar_p` | ``wchar_t *`` (NUL terminated) | unicode or ``None`` | + +----------------------+--------------------------------+----------------------------+ + | :class:`c_void_p` | ``void *`` | int/long or ``None`` | + +----------------------+--------------------------------+----------------------------+ + + +All these types can be created by calling them with an optional initializer of +the correct type and value:: + + >>> c_int() + c_long(0) + >>> c_char_p("Hello, World") + c_char_p('Hello, World') + >>> c_ushort(-3) + c_ushort(65533) + >>> + +Since these types are mutable, their value can also be changed afterwards:: + + >>> i = c_int(42) + >>> print i + c_long(42) + >>> print i.value + 42 + >>> i.value = -99 + >>> print i.value + -99 + >>> + +Assigning a new value to instances of the pointer types :class:`c_char_p`, +:class:`c_wchar_p`, and :class:`c_void_p` changes the *memory location* they +point to, *not the contents* of the memory block (of course not, because Python +strings are immutable):: + + >>> s = "Hello, World" + >>> c_s = c_char_p(s) + >>> print c_s + c_char_p('Hello, World') + >>> c_s.value = "Hi, there" + >>> print c_s + c_char_p('Hi, there') + >>> print s # first string is unchanged + Hello, World + >>> + +You should be careful, however, not to pass them to functions expecting pointers +to mutable memory. If you need mutable memory blocks, ctypes has a +``create_string_buffer`` function which creates these in various ways. The +current memory block contents can be accessed (or changed) with the ``raw`` +property; if you want to access it as NUL terminated string, use the ``value`` +property:: + + >>> from ctypes import * + >>> p = create_string_buffer(3) # create a 3 byte buffer, initialized to NUL bytes + >>> print sizeof(p), repr(p.raw) + 3 '\x00\x00\x00' + >>> p = create_string_buffer("Hello") # create a buffer containing a NUL terminated string + >>> print sizeof(p), repr(p.raw) + 6 'Hello\x00' + >>> print repr(p.value) + 'Hello' + >>> p = create_string_buffer("Hello", 10) # create a 10 byte buffer + >>> print sizeof(p), repr(p.raw) + 10 'Hello\x00\x00\x00\x00\x00' + >>> p.value = "Hi" + >>> print sizeof(p), repr(p.raw) + 10 'Hi\x00lo\x00\x00\x00\x00\x00' + >>> + +The ``create_string_buffer`` function replaces the ``c_buffer`` function (which +is still available as an alias), as well as the ``c_string`` function from +earlier ctypes releases. To create a mutable memory block containing unicode +characters of the C type ``wchar_t`` use the ``create_unicode_buffer`` function. + + +.. _ctypes-calling-functions-continued: + +Calling functions, continued +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Note that printf prints to the real standard output channel, *not* to +``sys.stdout``, so these examples will only work at the console prompt, not from +within *IDLE* or *PythonWin*:: + + >>> printf = libc.printf + >>> printf("Hello, %s\n", "World!") + Hello, World! + 14 + >>> printf("Hello, %S", u"World!") + Hello, World! + 13 + >>> printf("%d bottles of beer\n", 42) + 42 bottles of beer + 19 + >>> printf("%f bottles of beer\n", 42.5) + Traceback (most recent call last): + File "", line 1, in ? + ArgumentError: argument 2: exceptions.TypeError: Don't know how to convert parameter 2 + >>> + +As has been mentioned before, all Python types except integers, strings, and +unicode strings have to be wrapped in their corresponding ``ctypes`` type, so +that they can be converted to the required C data type:: + + >>> printf("An int %d, a double %f\n", 1234, c_double(3.14)) + Integer 1234, double 3.1400001049 + 31 + >>> + + +.. _ctypes-calling-functions-with-own-custom-data-types: + +Calling functions with your own custom data types +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can also customize ``ctypes`` argument conversion to allow instances of your +own classes be used as function arguments. ``ctypes`` looks for an +:attr:`_as_parameter_` attribute and uses this as the function argument. Of +course, it must be one of integer, string, or unicode:: + + >>> class Bottles(object): + ... def __init__(self, number): + ... self._as_parameter_ = number + ... + >>> bottles = Bottles(42) + >>> printf("%d bottles of beer\n", bottles) + 42 bottles of beer + 19 + >>> + +If you don't want to store the instance's data in the :attr:`_as_parameter_` +instance variable, you could define a ``property`` which makes the data +avaiblable. + + +.. _ctypes-specifying-required-argument-types: + +Specifying the required argument types (function prototypes) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is possible to specify the required argument types of functions exported from +DLLs by setting the :attr:`argtypes` attribute. + +:attr:`argtypes` must be a sequence of C data types (the ``printf`` function is +probably not a good example here, because it takes a variable number and +different types of parameters depending on the format string, on the other hand +this is quite handy to experiment with this feature):: + + >>> printf.argtypes = [c_char_p, c_char_p, c_int, c_double] + >>> printf("String '%s', Int %d, Double %f\n", "Hi", 10, 2.2) + String 'Hi', Int 10, Double 2.200000 + 37 + >>> + +Specifying a format protects against incompatible argument types (just as a +prototype for a C function), and tries to convert the arguments to valid types:: + + >>> printf("%d %d %d", 1, 2, 3) + Traceback (most recent call last): + File "", line 1, in ? + ArgumentError: argument 2: exceptions.TypeError: wrong type + >>> printf("%s %d %f", "X", 2, 3) + X 2 3.00000012 + 12 + >>> + +If you have defined your own classes which you pass to function calls, you have +to implement a :meth:`from_param` class method for them to be able to use them +in the :attr:`argtypes` sequence. The :meth:`from_param` class method receives +the Python object passed to the function call, it should do a typecheck or +whatever is needed to make sure this object is acceptable, and then return the +object itself, it's :attr:`_as_parameter_` attribute, or whatever you want to +pass as the C function argument in this case. Again, the result should be an +integer, string, unicode, a ``ctypes`` instance, or something having the +:attr:`_as_parameter_` attribute. + + +.. _ctypes-return-types: + +Return types +^^^^^^^^^^^^ + +By default functions are assumed to return the C ``int`` type. Other return +types can be specified by setting the :attr:`restype` attribute of the function +object. + +Here is a more advanced example, it uses the ``strchr`` function, which expects +a string pointer and a char, and returns a pointer to a string:: + + >>> strchr = libc.strchr + >>> strchr("abcdef", ord("d")) # doctest: +SKIP + 8059983 + >>> strchr.restype = c_char_p # c_char_p is a pointer to a string + >>> strchr("abcdef", ord("d")) + 'def' + >>> print strchr("abcdef", ord("x")) + None + >>> + +If you want to avoid the ``ord("x")`` calls above, you can set the +:attr:`argtypes` attribute, and the second argument will be converted from a +single character Python string into a C char:: + + >>> strchr.restype = c_char_p + >>> strchr.argtypes = [c_char_p, c_char] + >>> strchr("abcdef", "d") + 'def' + >>> strchr("abcdef", "def") + Traceback (most recent call last): + File "", line 1, in ? + ArgumentError: argument 2: exceptions.TypeError: one character string expected + >>> print strchr("abcdef", "x") + None + >>> strchr("abcdef", "d") + 'def' + >>> + +You can also use a callable Python object (a function or a class for example) as +the :attr:`restype` attribute, if the foreign function returns an integer. The +callable will be called with the ``integer`` the C function returns, and the +result of this call will be used as the result of your function call. This is +useful to check for error return values and automatically raise an exception:: + + >>> GetModuleHandle = windll.kernel32.GetModuleHandleA # doctest: +WINDOWS + >>> def ValidHandle(value): + ... if value == 0: + ... raise WinError() + ... return value + ... + >>> + >>> GetModuleHandle.restype = ValidHandle # doctest: +WINDOWS + >>> GetModuleHandle(None) # doctest: +WINDOWS + 486539264 + >>> GetModuleHandle("something silly") # doctest: +WINDOWS + Traceback (most recent call last): + File "", line 1, in ? + File "", line 3, in ValidHandle + WindowsError: [Errno 126] The specified module could not be found. + >>> + +``WinError`` is a function which will call Windows ``FormatMessage()`` api to +get the string representation of an error code, and *returns* an exception. +``WinError`` takes an optional error code parameter, if no one is used, it calls +:func:`GetLastError` to retrieve it. + +Please note that a much more powerful error checking mechanism is available +through the :attr:`errcheck` attribute; see the reference manual for details. + + +.. _ctypes-passing-pointers: + +Passing pointers (or: passing parameters by reference) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes a C api function expects a *pointer* to a data type as parameter, +probably to write into the corresponding location, or if the data is too large +to be passed by value. This is also known as *passing parameters by reference*. + +``ctypes`` exports the :func:`byref` function which is used to pass parameters +by reference. The same effect can be achieved with the ``pointer`` function, +although ``pointer`` does a lot more work since it constructs a real pointer +object, so it is faster to use :func:`byref` if you don't need the pointer +object in Python itself:: + + >>> i = c_int() + >>> f = c_float() + >>> s = create_string_buffer('\000' * 32) + >>> print i.value, f.value, repr(s.value) + 0 0.0 '' + >>> libc.sscanf("1 3.14 Hello", "%d %f %s", + ... byref(i), byref(f), s) + 3 + >>> print i.value, f.value, repr(s.value) + 1 3.1400001049 'Hello' + >>> + + +.. _ctypes-structures-unions: + +Structures and unions +^^^^^^^^^^^^^^^^^^^^^ + +Structures and unions must derive from the :class:`Structure` and :class:`Union` +base classes which are defined in the ``ctypes`` module. Each subclass must +define a :attr:`_fields_` attribute. :attr:`_fields_` must be a list of +*2-tuples*, containing a *field name* and a *field type*. + +The field type must be a ``ctypes`` type like :class:`c_int`, or any other +derived ``ctypes`` type: structure, union, array, pointer. + +Here is a simple example of a POINT structure, which contains two integers named +``x`` and ``y``, and also shows how to initialize a structure in the +constructor:: + + >>> from ctypes import * + >>> class POINT(Structure): + ... _fields_ = [("x", c_int), + ... ("y", c_int)] + ... + >>> point = POINT(10, 20) + >>> print point.x, point.y + 10 20 + >>> point = POINT(y=5) + >>> print point.x, point.y + 0 5 + >>> POINT(1, 2, 3) + Traceback (most recent call last): + File "", line 1, in ? + ValueError: too many initializers + >>> + +You can, however, build much more complicated structures. Structures can itself +contain other structures by using a structure as a field type. + +Here is a RECT structure which contains two POINTs named ``upperleft`` and +``lowerright`` :: + + >>> class RECT(Structure): + ... _fields_ = [("upperleft", POINT), + ... ("lowerright", POINT)] + ... + >>> rc = RECT(point) + >>> print rc.upperleft.x, rc.upperleft.y + 0 5 + >>> print rc.lowerright.x, rc.lowerright.y + 0 0 + >>> + +Nested structures can also be initialized in the constructor in several ways:: + + >>> r = RECT(POINT(1, 2), POINT(3, 4)) + >>> r = RECT((1, 2), (3, 4)) + +Fields descriptors can be retrieved from the *class*, they are useful for +debugging because they can provide useful information:: + + >>> print POINT.x + + >>> print POINT.y + + >>> + + +.. _ctypes-structureunion-alignment-byte-order: + +Structure/union alignment and byte order +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, Structure and Union fields are aligned in the same way the C +compiler does it. It is possible to override this behaviour be specifying a +:attr:`_pack_` class attribute in the subclass definition. This must be set to a +positive integer and specifies the maximum alignment for the fields. This is +what ``#pragma pack(n)`` also does in MSVC. + +``ctypes`` uses the native byte order for Structures and Unions. To build +structures with non-native byte order, you can use one of the +BigEndianStructure, LittleEndianStructure, BigEndianUnion, and LittleEndianUnion +base classes. These classes cannot contain pointer fields. + + +.. _ctypes-bit-fields-in-structures-unions: + +Bit fields in structures and unions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is possible to create structures and unions containing bit fields. Bit fields +are only possible for integer fields, the bit width is specified as the third +item in the :attr:`_fields_` tuples:: + + >>> class Int(Structure): + ... _fields_ = [("first_16", c_int, 16), + ... ("second_16", c_int, 16)] + ... + >>> print Int.first_16 + + >>> print Int.second_16 + + >>> + + +.. _ctypes-arrays: + +Arrays +^^^^^^ + +Arrays are sequences, containing a fixed number of instances of the same type. + +The recommended way to create array types is by multiplying a data type with a +positive integer:: + + TenPointsArrayType = POINT * 10 + +Here is an example of an somewhat artifical data type, a structure containing 4 +POINTs among other stuff:: + + >>> from ctypes import * + >>> class POINT(Structure): + ... _fields_ = ("x", c_int), ("y", c_int) + ... + >>> class MyStruct(Structure): + ... _fields_ = [("a", c_int), + ... ("b", c_float), + ... ("point_array", POINT * 4)] + >>> + >>> print len(MyStruct().point_array) + 4 + >>> + +Instances are created in the usual way, by calling the class:: + + arr = TenPointsArrayType() + for pt in arr: + print pt.x, pt.y + +The above code print a series of ``0 0`` lines, because the array contents is +initialized to zeros. + +Initializers of the correct type can also be specified:: + + >>> from ctypes import * + >>> TenIntegers = c_int * 10 + >>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + >>> print ii + + >>> for i in ii: print i, + ... + 1 2 3 4 5 6 7 8 9 10 + >>> + + +.. _ctypes-pointers: + +Pointers +^^^^^^^^ + +Pointer instances are created by calling the ``pointer`` function on a +``ctypes`` type:: + + >>> from ctypes import * + >>> i = c_int(42) + >>> pi = pointer(i) + >>> + +Pointer instances have a ``contents`` attribute which returns the object to +which the pointer points, the ``i`` object above:: + + >>> pi.contents + c_long(42) + >>> + +Note that ``ctypes`` does not have OOR (original object return), it constructs a +new, equivalent object each time you retrieve an attribute:: + + >>> pi.contents is i + False + >>> pi.contents is pi.contents + False + >>> + +Assigning another :class:`c_int` instance to the pointer's contents attribute +would cause the pointer to point to the memory location where this is stored:: + + >>> i = c_int(99) + >>> pi.contents = i + >>> pi.contents + c_long(99) + >>> + +Pointer instances can also be indexed with integers:: + + >>> pi[0] + 99 + >>> + +Assigning to an integer index changes the pointed to value:: + + >>> print i + c_long(99) + >>> pi[0] = 22 + >>> print i + c_long(22) + >>> + +It is also possible to use indexes different from 0, but you must know what +you're doing, just as in C: You can access or change arbitrary memory locations. +Generally you only use this feature if you receive a pointer from a C function, +and you *know* that the pointer actually points to an array instead of a single +item. + +Behind the scenes, the ``pointer`` function does more than simply create pointer +instances, it has to create pointer *types* first. This is done with the +``POINTER`` function, which accepts any ``ctypes`` type, and returns a new +type:: + + >>> PI = POINTER(c_int) + >>> PI + + >>> PI(42) + Traceback (most recent call last): + File "", line 1, in ? + TypeError: expected c_long instead of int + >>> PI(c_int(42)) + + >>> + +Calling the pointer type without an argument creates a ``NULL`` pointer. +``NULL`` pointers have a ``False`` boolean value:: + + >>> null_ptr = POINTER(c_int)() + >>> print bool(null_ptr) + False + >>> + +``ctypes`` checks for ``NULL`` when dereferencing pointers (but dereferencing +non-\ ``NULL`` pointers would crash Python):: + + >>> null_ptr[0] + Traceback (most recent call last): + .... + ValueError: NULL pointer access + >>> + + >>> null_ptr[0] = 1234 + Traceback (most recent call last): + .... + ValueError: NULL pointer access + >>> + + +.. _ctypes-type-conversions: + +Type conversions +^^^^^^^^^^^^^^^^ + +Usually, ctypes does strict type checking. This means, if you have +``POINTER(c_int)`` in the :attr:`argtypes` list of a function or as the type of +a member field in a structure definition, only instances of exactly the same +type are accepted. There are some exceptions to this rule, where ctypes accepts +other objects. For example, you can pass compatible array instances instead of +pointer types. So, for ``POINTER(c_int)``, ctypes accepts an array of c_int:: + + >>> class Bar(Structure): + ... _fields_ = [("count", c_int), ("values", POINTER(c_int))] + ... + >>> bar = Bar() + >>> bar.values = (c_int * 3)(1, 2, 3) + >>> bar.count = 3 + >>> for i in range(bar.count): + ... print bar.values[i] + ... + 1 + 2 + 3 + >>> + +To set a POINTER type field to ``NULL``, you can assign ``None``:: + + >>> bar.values = None + >>> + +XXX list other conversions... + +Sometimes you have instances of incompatible types. In ``C``, you can cast one +type into another type. ``ctypes`` provides a ``cast`` function which can be +used in the same way. The ``Bar`` structure defined above accepts +``POINTER(c_int)`` pointers or :class:`c_int` arrays for its ``values`` field, +but not instances of other types:: + + >>> bar.values = (c_byte * 4)() + Traceback (most recent call last): + File "", line 1, in ? + TypeError: incompatible types, c_byte_Array_4 instance instead of LP_c_long instance + >>> + +For these cases, the ``cast`` function is handy. + +The ``cast`` function can be used to cast a ctypes instance into a pointer to a +different ctypes data type. ``cast`` takes two parameters, a ctypes object that +is or can be converted to a pointer of some kind, and a ctypes pointer type. It +returns an instance of the second argument, which references the same memory +block as the first argument:: + + >>> a = (c_byte * 4)() + >>> cast(a, POINTER(c_int)) + + >>> + +So, ``cast`` can be used to assign to the ``values`` field of ``Bar`` the +structure:: + + >>> bar = Bar() + >>> bar.values = cast((c_byte * 4)(), POINTER(c_int)) + >>> print bar.values[0] + 0 + >>> + + +.. _ctypes-incomplete-types: + +Incomplete Types +^^^^^^^^^^^^^^^^ + +*Incomplete Types* are structures, unions or arrays whose members are not yet +specified. In C, they are specified by forward declarations, which are defined +later:: + + struct cell; /* forward declaration */ + + struct { + char *name; + struct cell *next; + } cell; + +The straightforward translation into ctypes code would be this, but it does not +work:: + + >>> class cell(Structure): + ... _fields_ = [("name", c_char_p), + ... ("next", POINTER(cell))] + ... + Traceback (most recent call last): + File "", line 1, in ? + File "", line 2, in cell + NameError: name 'cell' is not defined + >>> + +because the new ``class cell`` is not available in the class statement itself. +In ``ctypes``, we can define the ``cell`` class and set the :attr:`_fields_` +attribute later, after the class statement:: + + >>> from ctypes import * + >>> class cell(Structure): + ... pass + ... + >>> cell._fields_ = [("name", c_char_p), + ... ("next", POINTER(cell))] + >>> + +Lets try it. We create two instances of ``cell``, and let them point to each +other, and finally follow the pointer chain a few times:: + + >>> c1 = cell() + >>> c1.name = "foo" + >>> c2 = cell() + >>> c2.name = "bar" + >>> c1.next = pointer(c2) + >>> c2.next = pointer(c1) + >>> p = c1 + >>> for i in range(8): + ... print p.name, + ... p = p.next[0] + ... + foo bar foo bar foo bar foo bar + >>> + + +.. _ctypes-callback-functions: + +Callback functions +^^^^^^^^^^^^^^^^^^ + +``ctypes`` allows to create C callable function pointers from Python callables. +These are sometimes called *callback functions*. + +First, you must create a class for the callback function, the class knows the +calling convention, the return type, and the number and types of arguments this +function will receive. + +The CFUNCTYPE factory function creates types for callback functions using the +normal cdecl calling convention, and, on Windows, the WINFUNCTYPE factory +function creates types for callback functions using the stdcall calling +convention. + +Both of these factory functions are called with the result type as first +argument, and the callback functions expected argument types as the remaining +arguments. + +I will present an example here which uses the standard C library's :func:`qsort` +function, this is used to sort items with the help of a callback function. +:func:`qsort` will be used to sort an array of integers:: + + >>> IntArray5 = c_int * 5 + >>> ia = IntArray5(5, 1, 7, 33, 99) + >>> qsort = libc.qsort + >>> qsort.restype = None + >>> + +:func:`qsort` must be called with a pointer to the data to sort, the number of +items in the data array, the size of one item, and a pointer to the comparison +function, the callback. The callback will then be called with two pointers to +items, and it must return a negative integer if the first item is smaller than +the second, a zero if they are equal, and a positive integer else. + +So our callback function receives pointers to integers, and must return an +integer. First we create the ``type`` for the callback function:: + + >>> CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) + >>> + +For the first implementation of the callback function, we simply print the +arguments we get, and return 0 (incremental development ;-):: + + >>> def py_cmp_func(a, b): + ... print "py_cmp_func", a, b + ... return 0 + ... + >>> + +Create the C callable callback:: + + >>> cmp_func = CMPFUNC(py_cmp_func) + >>> + +And we're ready to go:: + + >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +WINDOWS + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + py_cmp_func + >>> + +We know how to access the contents of a pointer, so lets redefine our callback:: + + >>> def py_cmp_func(a, b): + ... print "py_cmp_func", a[0], b[0] + ... return 0 + ... + >>> cmp_func = CMPFUNC(py_cmp_func) + >>> + +Here is what we get on Windows:: + + >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +WINDOWS + py_cmp_func 7 1 + py_cmp_func 33 1 + py_cmp_func 99 1 + py_cmp_func 5 1 + py_cmp_func 7 5 + py_cmp_func 33 5 + py_cmp_func 99 5 + py_cmp_func 7 99 + py_cmp_func 33 99 + py_cmp_func 7 33 + >>> + +It is funny to see that on linux the sort function seems to work much more +efficient, it is doing less comparisons:: + + >>> qsort(ia, len(ia), sizeof(c_int), cmp_func) # doctest: +LINUX + py_cmp_func 5 1 + py_cmp_func 33 99 + py_cmp_func 7 33 + py_cmp_func 5 7 + py_cmp_func 1 7 + >>> + +Ah, we're nearly done! The last step is to actually compare the two items and +return a useful result:: + + >>> def py_cmp_func(a, b): + ... print "py_cmp_func", a[0], b[0] + ... return a[0] - b[0] + ... + >>> + +Final run on Windows:: + + >>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func)) # doctest: +WINDOWS + py_cmp_func 33 7 + py_cmp_func 99 33 + py_cmp_func 5 99 + py_cmp_func 1 99 + py_cmp_func 33 7 + py_cmp_func 1 33 + py_cmp_func 5 33 + py_cmp_func 5 7 + py_cmp_func 1 7 + py_cmp_func 5 1 + >>> + +and on Linux:: + + >>> qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func)) # doctest: +LINUX + py_cmp_func 5 1 + py_cmp_func 33 99 + py_cmp_func 7 33 + py_cmp_func 1 7 + py_cmp_func 5 7 + >>> + +It is quite interesting to see that the Windows :func:`qsort` function needs +more comparisons than the linux version! + +As we can easily check, our array is sorted now:: + + >>> for i in ia: print i, + ... + 1 5 7 33 99 + >>> + +**Important note for callback functions:** + +Make sure you keep references to CFUNCTYPE objects as long as they are used from +C code. ``ctypes`` doesn't, and if you don't, they may be garbage collected, +crashing your program when a callback is made. + + +.. _ctypes-accessing-values-exported-from-dlls: + +Accessing values exported from dlls +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes, a dll not only exports functions, it also exports variables. An +example in the Python library itself is the ``Py_OptimizeFlag``, an integer set +to 0, 1, or 2, depending on the :option:`-O` or :option:`-OO` flag given on +startup. + +``ctypes`` can access values like this with the :meth:`in_dll` class methods of +the type. *pythonapi* is a predefined symbol giving access to the Python C +api:: + + >>> opt_flag = c_int.in_dll(pythonapi, "Py_OptimizeFlag") + >>> print opt_flag + c_long(0) + >>> + +If the interpreter would have been started with :option:`-O`, the sample would +have printed ``c_long(1)``, or ``c_long(2)`` if :option:`-OO` would have been +specified. + +An extended example which also demonstrates the use of pointers accesses the +``PyImport_FrozenModules`` pointer exported by Python. + +Quoting the Python docs: *This pointer is initialized to point to an array of +"struct _frozen" records, terminated by one whose members are all NULL or zero. +When a frozen module is imported, it is searched in this table. Third-party code +could play tricks with this to provide a dynamically created collection of +frozen modules.* + +So manipulating this pointer could even prove useful. To restrict the example +size, we show only how this table can be read with ``ctypes``:: + + >>> from ctypes import * + >>> + >>> class struct_frozen(Structure): + ... _fields_ = [("name", c_char_p), + ... ("code", POINTER(c_ubyte)), + ... ("size", c_int)] + ... + >>> + +We have defined the ``struct _frozen`` data type, so we can get the pointer to +the table:: + + >>> FrozenTable = POINTER(struct_frozen) + >>> table = FrozenTable.in_dll(pythonapi, "PyImport_FrozenModules") + >>> + +Since ``table`` is a ``pointer`` to the array of ``struct_frozen`` records, we +can iterate over it, but we just have to make sure that our loop terminates, +because pointers have no size. Sooner or later it would probably crash with an +access violation or whatever, so it's better to break out of the loop when we +hit the NULL entry:: + + >>> for item in table: + ... print item.name, item.size + ... if item.name is None: + ... break + ... + __hello__ 104 + __phello__ -104 + __phello__.spam 104 + None 0 + >>> + +The fact that standard Python has a frozen module and a frozen package +(indicated by the negative size member) is not wellknown, it is only used for +testing. Try it out with ``import __hello__`` for example. + + +.. _ctypes-surprises: + +Surprises +^^^^^^^^^ + +There are some edges in ``ctypes`` where you may be expect something else than +what actually happens. + +Consider the following example:: + + >>> from ctypes import * + >>> class POINT(Structure): + ... _fields_ = ("x", c_int), ("y", c_int) + ... + >>> class RECT(Structure): + ... _fields_ = ("a", POINT), ("b", POINT) + ... + >>> p1 = POINT(1, 2) + >>> p2 = POINT(3, 4) + >>> rc = RECT(p1, p2) + >>> print rc.a.x, rc.a.y, rc.b.x, rc.b.y + 1 2 3 4 + >>> # now swap the two points + >>> rc.a, rc.b = rc.b, rc.a + >>> print rc.a.x, rc.a.y, rc.b.x, rc.b.y + 3 4 3 4 + >>> + +Hm. We certainly expected the last statement to print ``3 4 1 2``. What +happended? Here are the steps of the ``rc.a, rc.b = rc.b, rc.a`` line above:: + + >>> temp0, temp1 = rc.b, rc.a + >>> rc.a = temp0 + >>> rc.b = temp1 + >>> + +Note that ``temp0`` and ``temp1`` are objects still using the internal buffer of +the ``rc`` object above. So executing ``rc.a = temp0`` copies the buffer +contents of ``temp0`` into ``rc`` 's buffer. This, in turn, changes the +contents of ``temp1``. So, the last assignment ``rc.b = temp1``, doesn't have +the expected effect. + +Keep in mind that retrieving subobjects from Structure, Unions, and Arrays +doesn't *copy* the subobject, instead it retrieves a wrapper object accessing +the root-object's underlying buffer. + +Another example that may behave different from what one would expect is this:: + + >>> s = c_char_p() + >>> s.value = "abc def ghi" + >>> s.value + 'abc def ghi' + >>> s.value is s.value + False + >>> + +Why is it printing ``False``? ctypes instances are objects containing a memory +block plus some descriptors accessing the contents of the memory. Storing a +Python object in the memory block does not store the object itself, instead the +``contents`` of the object is stored. Accessing the contents again constructs a +new Python each time! + + +.. _ctypes-variable-sized-data-types: + +Variable-sized data types +^^^^^^^^^^^^^^^^^^^^^^^^^ + +``ctypes`` provides some support for variable-sized arrays and structures (this +was added in version 0.9.9.7). + +The ``resize`` function can be used to resize the memory buffer of an existing +ctypes object. The function takes the object as first argument, and the +requested size in bytes as the second argument. The memory block cannot be made +smaller than the natural memory block specified by the objects type, a +``ValueError`` is raised if this is tried:: + + >>> short_array = (c_short * 4)() + >>> print sizeof(short_array) + 8 + >>> resize(short_array, 4) + Traceback (most recent call last): + ... + ValueError: minimum size is 8 + >>> resize(short_array, 32) + >>> sizeof(short_array) + 32 + >>> sizeof(type(short_array)) + 8 + >>> + +This is nice and fine, but how would one access the additional elements +contained in this array? Since the type still only knows about 4 elements, we +get errors accessing other elements:: + + >>> short_array[:] + [0, 0, 0, 0] + >>> short_array[7] + Traceback (most recent call last): + ... + IndexError: invalid index + >>> + +Another way to use variable-sized data types with ``ctypes`` is to use the +dynamic nature of Python, and (re-)define the data type after the required size +is already known, on a case by case basis. + + +.. _ctypes-bugs-todo-non-implemented-things: + +Bugs, ToDo and non-implemented things +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Enumeration types are not implemented. You can do it easily yourself, using +:class:`c_int` as the base class. + +``long double`` is not implemented. + +.. % Local Variables: +.. % compile-command: "make.bat" +.. % End: + + +.. _ctypes-ctypes-reference: + +ctypes reference +---------------- + + +.. _ctypes-finding-shared-libraries: + +Finding shared libraries +^^^^^^^^^^^^^^^^^^^^^^^^ + +When programming in a compiled language, shared libraries are accessed when +compiling/linking a program, and when the program is run. + +The purpose of the ``find_library`` function is to locate a library in a way +similar to what the compiler does (on platforms with several versions of a +shared library the most recent should be loaded), while the ctypes library +loaders act like when a program is run, and call the runtime loader directly. + +The ``ctypes.util`` module provides a function which can help to determine the +library to load. + + +.. data:: find_library(name) + :noindex: + + Try to find a library and return a pathname. *name* is the library name without + any prefix like *lib*, suffix like ``.so``, ``.dylib`` or version number (this + is the form used for the posix linker option :option:`-l`). If no library can + be found, returns ``None``. + +The exact functionality is system dependend. + +On Linux, ``find_library`` tries to run external programs (/sbin/ldconfig, gcc, +and objdump) to find the library file. It returns the filename of the library +file. Here are sone examples:: + + >>> from ctypes.util import find_library + >>> find_library("m") + 'libm.so.6' + >>> find_library("c") + 'libc.so.6' + >>> find_library("bz2") + 'libbz2.so.1.0' + >>> + +On OS X, ``find_library`` tries several predefined naming schemes and paths to +locate the library, and returns a full pathname if successfull:: + + >>> from ctypes.util import find_library + >>> find_library("c") + '/usr/lib/libc.dylib' + >>> find_library("m") + '/usr/lib/libm.dylib' + >>> find_library("bz2") + '/usr/lib/libbz2.dylib' + >>> find_library("AGL") + '/System/Library/Frameworks/AGL.framework/AGL' + >>> + +On Windows, ``find_library`` searches along the system search path, and returns +the full pathname, but since there is no predefined naming scheme a call like +``find_library("c")`` will fail and return ``None``. + +If wrapping a shared library with ``ctypes``, it *may* be better to determine +the shared library name at development type, and hardcode that into the wrapper +module instead of using ``find_library`` to locate the library at runtime. + + +.. _ctypes-loading-shared-libraries: + +Loading shared libraries +^^^^^^^^^^^^^^^^^^^^^^^^ + +There are several ways to loaded shared libraries into the Python process. One +way is to instantiate one of the following classes: + + +.. class:: CDLL(name, mode=DEFAULT_MODE, handle=None) + + Instances of this class represent loaded shared libraries. Functions in these + libraries use the standard C calling convention, and are assumed to return + ``int``. + + +.. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None) + + Windows only: Instances of this class represent loaded shared libraries, + functions in these libraries use the ``stdcall`` calling convention, and are + assumed to return the windows specific :class:`HRESULT` code. :class:`HRESULT` + values contain information specifying whether the function call failed or + succeeded, together with additional error code. If the return value signals a + failure, an :class:`WindowsError` is automatically raised. + + +.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None) + + Windows only: Instances of this class represent loaded shared libraries, + functions in these libraries use the ``stdcall`` calling convention, and are + assumed to return ``int`` by default. + + On Windows CE only the standard calling convention is used, for convenience the + :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this + platform. + +The Python GIL is released before calling any function exported by these +libraries, and reaquired afterwards. + + +.. class:: PyDLL(name, mode=DEFAULT_MODE, handle=None) + + Instances of this class behave like :class:`CDLL` instances, except that the + Python GIL is *not* released during the function call, and after the function + execution the Python error flag is checked. If the error flag is set, a Python + exception is raised. + + Thus, this is only useful to call Python C api functions directly. + +All these classes can be instantiated by calling them with at least one +argument, the pathname of the shared library. If you have an existing handle to +an already loaded shard library, it can be passed as the ``handle`` named +parameter, otherwise the underlying platforms ``dlopen`` or :meth:`LoadLibrary` +function is used to load the library into the process, and to get a handle to +it. + +The *mode* parameter can be used to specify how the library is loaded. For +details, consult the ``dlopen(3)`` manpage, on Windows, *mode* is ignored. + + +.. data:: RTLD_GLOBAL + :noindex: + + Flag to use as *mode* parameter. On platforms where this flag is not available, + it is defined as the integer zero. + + +.. data:: RTLD_LOCAL + :noindex: + + Flag to use as *mode* parameter. On platforms where this is not available, it + is the same as *RTLD_GLOBAL*. + + +.. data:: DEFAULT_MODE + :noindex: + + The default mode which is used to load shared libraries. On OSX 10.3, this is + *RTLD_GLOBAL*, otherwise it is the same as *RTLD_LOCAL*. + +Instances of these classes have no public methods, however :meth:`__getattr__` +and :meth:`__getitem__` have special behaviour: functions exported by the shared +library can be accessed as attributes of by index. Please note that both +:meth:`__getattr__` and :meth:`__getitem__` cache their result, so calling them +repeatedly returns the same object each time. + +The following public attributes are available, their name starts with an +underscore to not clash with exported function names: + + +.. attribute:: PyDLL._handle + + The system handle used to access the library. + + +.. attribute:: PyDLL._name + + The name of the library passed in the contructor. + +Shared libraries can also be loaded by using one of the prefabricated objects, +which are instances of the :class:`LibraryLoader` class, either by calling the +:meth:`LoadLibrary` method, or by retrieving the library as attribute of the +loader instance. + + +.. class:: LibraryLoader(dlltype) + + Class which loads shared libraries. ``dlltype`` should be one of the + :class:`CDLL`, :class:`PyDLL`, :class:`WinDLL`, or :class:`OleDLL` types. + + :meth:`__getattr__` has special behaviour: It allows to load a shared library by + accessing it as attribute of a library loader instance. The result is cached, + so repeated attribute accesses return the same library each time. + + +.. method:: LibraryLoader.LoadLibrary(name) + + Load a shared library into the process and return it. This method always + returns a new instance of the library. + +These prefabricated library loaders are available: + + +.. data:: cdll + :noindex: + + Creates :class:`CDLL` instances. + + +.. data:: windll + :noindex: + + Windows only: Creates :class:`WinDLL` instances. + + +.. data:: oledll + :noindex: + + Windows only: Creates :class:`OleDLL` instances. + + +.. data:: pydll + :noindex: + + Creates :class:`PyDLL` instances. + +For accessing the C Python api directly, a ready-to-use Python shared library +object is available: + + +.. data:: pythonapi + :noindex: + + An instance of :class:`PyDLL` that exposes Python C api functions as attributes. + Note that all these functions are assumed to return C ``int``, which is of + course not always the truth, so you have to assign the correct :attr:`restype` + attribute to use these functions. + + +.. _ctypes-foreign-functions: + +Foreign functions +^^^^^^^^^^^^^^^^^ + +As explained in the previous section, foreign functions can be accessed as +attributes of loaded shared libraries. The function objects created in this way +by default accept any number of arguments, accept any ctypes data instances as +arguments, and return the default result type specified by the library loader. +They are instances of a private class: + + +.. class:: _FuncPtr + + Base class for C callable foreign functions. + +Instances of foreign functions are also C compatible data types; they represent +C function pointers. + +This behaviour can be customized by assigning to special attributes of the +foreign function object. + + +.. attribute:: _FuncPtr.restype + + Assign a ctypes type to specify the result type of the foreign function. Use + ``None`` for ``void`` a function not returning anything. + + It is possible to assign a callable Python object that is not a ctypes type, in + this case the function is assumed to return a C ``int``, and the callable will + be called with this integer, allowing to do further processing or error + checking. Using this is deprecated, for more flexible postprocessing or error + checking use a ctypes data type as :attr:`restype` and assign a callable to the + :attr:`errcheck` attribute. + + +.. attribute:: _FuncPtr.argtypes + + Assign a tuple of ctypes types to specify the argument types that the function + accepts. Functions using the ``stdcall`` calling convention can only be called + with the same number of arguments as the length of this tuple; functions using + the C calling convention accept additional, unspecified arguments as well. + + When a foreign function is called, each actual argument is passed to the + :meth:`from_param` class method of the items in the :attr:`argtypes` tuple, this + method allows to adapt the actual argument to an object that the foreign + function accepts. For example, a :class:`c_char_p` item in the :attr:`argtypes` + tuple will convert a unicode string passed as argument into an byte string using + ctypes conversion rules. + + New: It is now possible to put items in argtypes which are not ctypes types, but + each item must have a :meth:`from_param` method which returns a value usable as + argument (integer, string, ctypes instance). This allows to define adapters + that can adapt custom objects as function parameters. + + +.. attribute:: _FuncPtr.errcheck + + Assign a Python function or another callable to this attribute. The callable + will be called with three or more arguments: + + +.. function:: callable(result, func, arguments) + :noindex: + + ``result`` is what the foreign function returns, as specified by the + :attr:`restype` attribute. + + ``func`` is the foreign function object itself, this allows to reuse the same + callable object to check or postprocess the results of several functions. + + ``arguments`` is a tuple containing the parameters originally passed to the + function call, this allows to specialize the behaviour on the arguments used. + + The object that this function returns will be returned from the foreign function + call, but it can also check the result value and raise an exception if the + foreign function call failed. + + +.. exception:: ArgumentError() + + This exception is raised when a foreign function call cannot convert one of the + passed arguments. + + +.. _ctypes-function-prototypes: + +Function prototypes +^^^^^^^^^^^^^^^^^^^ + +Foreign functions can also be created by instantiating function prototypes. +Function prototypes are similar to function prototypes in C; they describe a +function (return type, argument types, calling convention) without defining an +implementation. The factory functions must be called with the desired result +type and the argument types of the function. + + +.. function:: CFUNCTYPE(restype, *argtypes) + + The returned function prototype creates functions that use the standard C + calling convention. The function will release the GIL during the call. + + +.. function:: WINFUNCTYPE(restype, *argtypes) + + Windows only: The returned function prototype creates functions that use the + ``stdcall`` calling convention, except on Windows CE where :func:`WINFUNCTYPE` + is the same as :func:`CFUNCTYPE`. The function will release the GIL during the + call. + + +.. function:: PYFUNCTYPE(restype, *argtypes) + + The returned function prototype creates functions that use the Python calling + convention. The function will *not* release the GIL during the call. + +Function prototypes created by the factory functions can be instantiated in +different ways, depending on the type and number of the parameters in the call. + + +.. function:: prototype(address) + :noindex: + + Returns a foreign function at the specified address. + + +.. function:: prototype(callable) + :noindex: + + Create a C callable function (a callback function) from a Python ``callable``. + + +.. function:: prototype(func_spec[, paramflags]) + :noindex: + + Returns a foreign function exported by a shared library. ``func_spec`` must be a + 2-tuple ``(name_or_ordinal, library)``. The first item is the name of the + exported function as string, or the ordinal of the exported function as small + integer. The second item is the shared library instance. + + +.. function:: prototype(vtbl_index, name[, paramflags[, iid]]) + :noindex: + + Returns a foreign function that will call a COM method. ``vtbl_index`` is the + index into the virtual function table, a small nonnegative integer. *name* is + name of the COM method. *iid* is an optional pointer to the interface identifier + which is used in extended error reporting. + + COM methods use a special calling convention: They require a pointer to the COM + interface as first argument, in addition to those parameters that are specified + in the :attr:`argtypes` tuple. + +The optional *paramflags* parameter creates foreign function wrappers with much +more functionality than the features described above. + +*paramflags* must be a tuple of the same length as :attr:`argtypes`. + +Each item in this tuple contains further information about a parameter, it must +be a tuple containing 1, 2, or 3 items. + +The first item is an integer containing flags for the parameter: + + +.. data:: 1 + :noindex: + + Specifies an input parameter to the function. + + +.. data:: 2 + :noindex: + + Output parameter. The foreign function fills in a value. + + +.. data:: 4 + :noindex: + + Input parameter which defaults to the integer zero. + +The optional second item is the parameter name as string. If this is specified, +the foreign function can be called with named parameters. + +The optional third item is the default value for this parameter. + +This example demonstrates how to wrap the Windows ``MessageBoxA`` function so +that it supports default parameters and named arguments. The C declaration from +the windows header file is this:: + + WINUSERAPI int WINAPI + MessageBoxA( + HWND hWnd , + LPCSTR lpText, + LPCSTR lpCaption, + UINT uType); + +Here is the wrapping with ``ctypes``: + + :: + + >>> from ctypes import c_int, WINFUNCTYPE, windll + >>> from ctypes.wintypes import HWND, LPCSTR, UINT + >>> prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT) + >>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0) + >>> MessageBox = prototype(("MessageBoxA", windll.user32), paramflags) + >>> + +The MessageBox foreign function can now be called in these ways:: + + >>> MessageBox() + >>> MessageBox(text="Spam, spam, spam") + >>> MessageBox(flags=2, text="foo bar") + >>> + +A second example demonstrates output parameters. The win32 ``GetWindowRect`` +function retrieves the dimensions of a specified window by copying them into +``RECT`` structure that the caller has to supply. Here is the C declaration:: + + WINUSERAPI BOOL WINAPI + GetWindowRect( + HWND hWnd, + LPRECT lpRect); + +Here is the wrapping with ``ctypes``: + + :: + + >>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError + >>> from ctypes.wintypes import BOOL, HWND, RECT + >>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT)) + >>> paramflags = (1, "hwnd"), (2, "lprect") + >>> GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags) + >>> + +Functions with output parameters will automatically return the output parameter +value if there is a single one, or a tuple containing the output parameter +values when there are more than one, so the GetWindowRect function now returns a +RECT instance, when called. + +Output parameters can be combined with the :attr:`errcheck` protocol to do +further output processing and error checking. The win32 ``GetWindowRect`` api +function returns a ``BOOL`` to signal success or failure, so this function could +do the error checking, and raises an exception when the api call failed:: + + >>> def errcheck(result, func, args): + ... if not result: + ... raise WinError() + ... return args + >>> GetWindowRect.errcheck = errcheck + >>> + +If the :attr:`errcheck` function returns the argument tuple it receives +unchanged, ``ctypes`` continues the normal processing it does on the output +parameters. If you want to return a tuple of window coordinates instead of a +``RECT`` instance, you can retrieve the fields in the function and return them +instead, the normal processing will no longer take place:: + + >>> def errcheck(result, func, args): + ... if not result: + ... raise WinError() + ... rc = args[1] + ... return rc.left, rc.top, rc.bottom, rc.right + >>> + >>> GetWindowRect.errcheck = errcheck + >>> + + +.. _ctypes-utility-functions: + +Utility functions +^^^^^^^^^^^^^^^^^ + + +.. function:: addressof(obj) + + Returns the address of the memory buffer as integer. ``obj`` must be an + instance of a ctypes type. + + +.. function:: alignment(obj_or_type) + + Returns the alignment requirements of a ctypes type. ``obj_or_type`` must be a + ctypes type or instance. + + +.. function:: byref(obj) + + Returns a light-weight pointer to ``obj``, which must be an instance of a ctypes + type. The returned object can only be used as a foreign function call parameter. + It behaves similar to ``pointer(obj)``, but the construction is a lot faster. + + +.. function:: cast(obj, type) + + This function is similar to the cast operator in C. It returns a new instance of + ``type`` which points to the same memory block as ``obj``. ``type`` must be a + pointer type, and ``obj`` must be an object that can be interpreted as a + pointer. + + +.. function:: create_string_buffer(init_or_size[, size]) + + This function creates a mutable character buffer. The returned object is a + ctypes array of :class:`c_char`. + + ``init_or_size`` must be an integer which specifies the size of the array, or a + string which will be used to initialize the array items. + + If a string is specified as first argument, the buffer is made one item larger + than the length of the string so that the last element in the array is a NUL + termination character. An integer can be passed as second argument which allows + to specify the size of the array if the length of the string should not be used. + + If the first parameter is a unicode string, it is converted into an 8-bit string + according to ctypes conversion rules. + + +.. function:: create_unicode_buffer(init_or_size[, size]) + + This function creates a mutable unicode character buffer. The returned object is + a ctypes array of :class:`c_wchar`. + + ``init_or_size`` must be an integer which specifies the size of the array, or a + unicode string which will be used to initialize the array items. + + If a unicode string is specified as first argument, the buffer is made one item + larger than the length of the string so that the last element in the array is a + NUL termination character. An integer can be passed as second argument which + allows to specify the size of the array if the length of the string should not + be used. + + If the first parameter is a 8-bit string, it is converted into an unicode string + according to ctypes conversion rules. + + +.. function:: DllCanUnloadNow() + + Windows only: This function is a hook which allows to implement inprocess COM + servers with ctypes. It is called from the DllCanUnloadNow function that the + _ctypes extension dll exports. + + +.. function:: DllGetClassObject() + + Windows only: This function is a hook which allows to implement inprocess COM + servers with ctypes. It is called from the DllGetClassObject function that the + ``_ctypes`` extension dll exports. + + +.. function:: FormatError([code]) + + Windows only: Returns a textual description of the error code. If no error code + is specified, the last error code is used by calling the Windows api function + GetLastError. + + +.. function:: GetLastError() + + Windows only: Returns the last error code set by Windows in the calling thread. + + +.. function:: memmove(dst, src, count) + + Same as the standard C memmove library function: copies *count* bytes from + ``src`` to *dst*. *dst* and ``src`` must be integers or ctypes instances that + can be converted to pointers. + + +.. function:: memset(dst, c, count) + + Same as the standard C memset library function: fills the memory block at + address *dst* with *count* bytes of value *c*. *dst* must be an integer + specifying an address, or a ctypes instance. + + +.. function:: POINTER(type) + + This factory function creates and returns a new ctypes pointer type. Pointer + types are cached an reused internally, so calling this function repeatedly is + cheap. type must be a ctypes type. + + +.. function:: pointer(obj) + + This function creates a new pointer instance, pointing to ``obj``. The returned + object is of the type POINTER(type(obj)). + + Note: If you just want to pass a pointer to an object to a foreign function + call, you should use ``byref(obj)`` which is much faster. + + +.. function:: resize(obj, size) + + This function resizes the internal memory buffer of obj, which must be an + instance of a ctypes type. It is not possible to make the buffer smaller than + the native size of the objects type, as given by sizeof(type(obj)), but it is + possible to enlarge the buffer. + + +.. function:: set_conversion_mode(encoding, errors) + + This function sets the rules that ctypes objects use when converting between + 8-bit strings and unicode strings. encoding must be a string specifying an + encoding, like ``'utf-8'`` or ``'mbcs'``, errors must be a string specifying the + error handling on encoding/decoding errors. Examples of possible values are + ``"strict"``, ``"replace"``, or ``"ignore"``. + + ``set_conversion_mode`` returns a 2-tuple containing the previous conversion + rules. On windows, the initial conversion rules are ``('mbcs', 'ignore')``, on + other systems ``('ascii', 'strict')``. + + +.. function:: sizeof(obj_or_type) + + Returns the size in bytes of a ctypes type or instance memory buffer. Does the + same as the C ``sizeof()`` function. + + +.. function:: string_at(address[, size]) + + This function returns the string starting at memory address address. If size + is specified, it is used as size, otherwise the string is assumed to be + zero-terminated. + + +.. function:: WinError(code=None, descr=None) + + Windows only: this function is probably the worst-named thing in ctypes. It + creates an instance of WindowsError. If *code* is not specified, + ``GetLastError`` is called to determine the error code. If ``descr`` is not + spcified, :func:`FormatError` is called to get a textual description of the + error. + + +.. function:: wstring_at(address) + + This function returns the wide character string starting at memory address + ``address`` as unicode string. If ``size`` is specified, it is used as the + number of characters of the string, otherwise the string is assumed to be + zero-terminated. + + +.. _ctypes-data-types: + +Data types +^^^^^^^^^^ + + +.. class:: _CData + + This non-public class is the common base class of all ctypes data types. Among + other things, all ctypes type instances contain a memory block that hold C + compatible data; the address of the memory block is returned by the + ``addressof()`` helper function. Another instance variable is exposed as + :attr:`_objects`; this contains other Python objects that need to be kept alive + in case the memory block contains pointers. + +Common methods of ctypes data types, these are all class methods (to be exact, +they are methods of the metaclass): + + +.. method:: _CData.from_address(address) + + This method returns a ctypes type instance using the memory specified by address + which must be an integer. + + +.. method:: _CData.from_param(obj) + + This method adapts obj to a ctypes type. It is called with the actual object + used in a foreign function call, when the type is present in the foreign + functions :attr:`argtypes` tuple; it must return an object that can be used as + function call parameter. + + All ctypes data types have a default implementation of this classmethod, + normally it returns ``obj`` if that is an instance of the type. Some types + accept other objects as well. + + +.. method:: _CData.in_dll(library, name) + + This method returns a ctypes type instance exported by a shared library. *name* + is the name of the symbol that exports the data, *library* is the loaded shared + library. + +Common instance variables of ctypes data types: + + +.. attribute:: _CData._b_base_ + + Sometimes ctypes data instances do not own the memory block they contain, + instead they share part of the memory block of a base object. The + :attr:`_b_base_` readonly member is the root ctypes object that owns the memory + block. + + +.. attribute:: _CData._b_needsfree_ + + This readonly variable is true when the ctypes data instance has allocated the + memory block itself, false otherwise. + + +.. attribute:: _CData._objects + + This member is either ``None`` or a dictionary containing Python objects that + need to be kept alive so that the memory block contents is kept valid. This + object is only exposed for debugging; never modify the contents of this + dictionary. + + +.. _ctypes-fundamental-data-types-2: + +Fundamental data types +^^^^^^^^^^^^^^^^^^^^^^ + + +.. class:: _SimpleCData + + This non-public class is the base class of all fundamental ctypes data types. It + is mentioned here because it contains the common attributes of the fundamental + ctypes data types. ``_SimpleCData`` is a subclass of ``_CData``, so it inherits + their methods and attributes. + +Instances have a single attribute: + + +.. attribute:: _SimpleCData.value + + This attribute contains the actual value of the instance. For integer and + pointer types, it is an integer, for character types, it is a single character + string, for character pointer types it is a Python string or unicode string. + + When the ``value`` attribute is retrieved from a ctypes instance, usually a new + object is returned each time. ``ctypes`` does *not* implement original object + return, always a new object is constructed. The same is true for all other + ctypes object instances. + +Fundamental data types, when returned as foreign function call results, or, for +example, by retrieving structure field members or array items, are transparently +converted to native Python types. In other words, if a foreign function has a +:attr:`restype` of :class:`c_char_p`, you will always receive a Python string, +*not* a :class:`c_char_p` instance. + +Subclasses of fundamental data types do *not* inherit this behaviour. So, if a +foreign functions :attr:`restype` is a subclass of :class:`c_void_p`, you will +receive an instance of this subclass from the function call. Of course, you can +get the value of the pointer by accessing the ``value`` attribute. + +These are the fundamental ctypes data types: + + +.. class:: c_byte + + Represents the C signed char datatype, and interprets the value as small + integer. The constructor accepts an optional integer initializer; no overflow + checking is done. + + +.. class:: c_char + + Represents the C char datatype, and interprets the value as a single character. + The constructor accepts an optional string initializer, the length of the string + must be exactly one character. + + +.. class:: c_char_p + + Represents the C char \* datatype, which must be a pointer to a zero-terminated + string. The constructor accepts an integer address, or a string. + + +.. class:: c_double + + Represents the C double datatype. The constructor accepts an optional float + initializer. + + +.. class:: c_float + + Represents the C double datatype. The constructor accepts an optional float + initializer. + + +.. class:: c_int + + Represents the C signed int datatype. The constructor accepts an optional + integer initializer; no overflow checking is done. On platforms where + ``sizeof(int) == sizeof(long)`` it is an alias to :class:`c_long`. + + +.. class:: c_int8 + + Represents the C 8-bit ``signed int`` datatype. Usually an alias for + :class:`c_byte`. + + +.. class:: c_int16 + + Represents the C 16-bit signed int datatype. Usually an alias for + :class:`c_short`. + + +.. class:: c_int32 + + Represents the C 32-bit signed int datatype. Usually an alias for + :class:`c_int`. + + +.. class:: c_int64 + + Represents the C 64-bit ``signed int`` datatype. Usually an alias for + :class:`c_longlong`. + + +.. class:: c_long + + Represents the C ``signed long`` datatype. The constructor accepts an optional + integer initializer; no overflow checking is done. + + +.. class:: c_longlong + + Represents the C ``signed long long`` datatype. The constructor accepts an + optional integer initializer; no overflow checking is done. + + +.. class:: c_short + + Represents the C ``signed short`` datatype. The constructor accepts an optional + integer initializer; no overflow checking is done. + + +.. class:: c_size_t + + Represents the C ``size_t`` datatype. + + +.. class:: c_ubyte + + Represents the C ``unsigned char`` datatype, it interprets the value as small + integer. The constructor accepts an optional integer initializer; no overflow + checking is done. + + +.. class:: c_uint + + Represents the C ``unsigned int`` datatype. The constructor accepts an optional + integer initializer; no overflow checking is done. On platforms where + ``sizeof(int) == sizeof(long)`` it is an alias for :class:`c_ulong`. + + +.. class:: c_uint8 + + Represents the C 8-bit unsigned int datatype. Usually an alias for + :class:`c_ubyte`. + + +.. class:: c_uint16 + + Represents the C 16-bit unsigned int datatype. Usually an alias for + :class:`c_ushort`. + + +.. class:: c_uint32 + + Represents the C 32-bit unsigned int datatype. Usually an alias for + :class:`c_uint`. + + +.. class:: c_uint64 + + Represents the C 64-bit unsigned int datatype. Usually an alias for + :class:`c_ulonglong`. + + +.. class:: c_ulong + + Represents the C ``unsigned long`` datatype. The constructor accepts an optional + integer initializer; no overflow checking is done. + + +.. class:: c_ulonglong + + Represents the C ``unsigned long long`` datatype. The constructor accepts an + optional integer initializer; no overflow checking is done. + + +.. class:: c_ushort + + Represents the C ``unsigned short`` datatype. The constructor accepts an + optional integer initializer; no overflow checking is done. + + +.. class:: c_void_p + + Represents the C ``void *`` type. The value is represented as integer. The + constructor accepts an optional integer initializer. + + +.. class:: c_wchar + + Represents the C ``wchar_t`` datatype, and interprets the value as a single + character unicode string. The constructor accepts an optional string + initializer, the length of the string must be exactly one character. + + +.. class:: c_wchar_p + + Represents the C ``wchar_t *`` datatype, which must be a pointer to a + zero-terminated wide character string. The constructor accepts an integer + address, or a string. + + +.. class:: c_bool + + Represent the C ``bool`` datatype (more accurately, _Bool from C99). Its value + can be True or False, and the constructor accepts any object that has a truth + value. + + .. versionadded:: 2.6 + + +.. class:: HRESULT + + Windows only: Represents a :class:`HRESULT` value, which contains success or + error information for a function or method call. + + +.. class:: py_object + + Represents the C ``PyObject *`` datatype. Calling this without an argument + creates a ``NULL`` ``PyObject *`` pointer. + +The ``ctypes.wintypes`` module provides quite some other Windows specific data +types, for example ``HWND``, ``WPARAM``, or ``DWORD``. Some useful structures +like ``MSG`` or ``RECT`` are also defined. + + +.. _ctypes-structured-data-types: + +Structured data types +^^^^^^^^^^^^^^^^^^^^^ + + +.. class:: Union(*args, **kw) + + Abstract base class for unions in native byte order. + + +.. class:: BigEndianStructure(*args, **kw) + + Abstract base class for structures in *big endian* byte order. + + +.. class:: LittleEndianStructure(*args, **kw) + + Abstract base class for structures in *little endian* byte order. + +Structures with non-native byte order cannot contain pointer type fields, or any +other data types containing pointer type fields. + + +.. class:: Structure(*args, **kw) + + Abstract base class for structures in *native* byte order. + +Concrete structure and union types must be created by subclassing one of these +types, and at least define a :attr:`_fields_` class variable. ``ctypes`` will +create descriptors which allow reading and writing the fields by direct +attribute accesses. These are the + + +.. attribute:: Structure._fields_ + + A sequence defining the structure fields. The items must be 2-tuples or + 3-tuples. The first item is the name of the field, the second item specifies + the type of the field; it can be any ctypes data type. + + For integer type fields like :class:`c_int`, a third optional item can be given. + It must be a small positive integer defining the bit width of the field. + + Field names must be unique within one structure or union. This is not checked, + only one field can be accessed when names are repeated. + + It is possible to define the :attr:`_fields_` class variable *after* the class + statement that defines the Structure subclass, this allows to create data types + that directly or indirectly reference themselves:: + + class List(Structure): + pass + List._fields_ = [("pnext", POINTER(List)), + ... + ] + + The :attr:`_fields_` class variable must, however, be defined before the type is + first used (an instance is created, ``sizeof()`` is called on it, and so on). + Later assignments to the :attr:`_fields_` class variable will raise an + AttributeError. + + Structure and union subclass constructors accept both positional and named + arguments. Positional arguments are used to initialize the fields in the same + order as they appear in the :attr:`_fields_` definition, named arguments are + used to initialize the fields with the corresponding name. + + It is possible to defined sub-subclasses of structure types, they inherit the + fields of the base class plus the :attr:`_fields_` defined in the sub-subclass, + if any. + + +.. attribute:: Structure._pack_ + + An optional small integer that allows to override the alignment of structure + fields in the instance. :attr:`_pack_` must already be defined when + :attr:`_fields_` is assigned, otherwise it will have no effect. + + +.. attribute:: Structure._anonymous_ + + An optional sequence that lists the names of unnamed (anonymous) fields. + ``_anonymous_`` must be already defined when :attr:`_fields_` is assigned, + otherwise it will have no effect. + + The fields listed in this variable must be structure or union type fields. + ``ctypes`` will create descriptors in the structure type that allows to access + the nested fields directly, without the need to create the structure or union + field. + + Here is an example type (Windows):: + + class _U(Union): + _fields_ = [("lptdesc", POINTER(TYPEDESC)), + ("lpadesc", POINTER(ARRAYDESC)), + ("hreftype", HREFTYPE)] + + class TYPEDESC(Structure): + _fields_ = [("u", _U), + ("vt", VARTYPE)] + + _anonymous_ = ("u",) + + The ``TYPEDESC`` structure describes a COM data type, the ``vt`` field specifies + which one of the union fields is valid. Since the ``u`` field is defined as + anonymous field, it is now possible to access the members directly off the + TYPEDESC instance. ``td.lptdesc`` and ``td.u.lptdesc`` are equivalent, but the + former is faster since it does not need to create a temporary union instance:: + + td = TYPEDESC() + td.vt = VT_PTR + td.lptdesc = POINTER(some_type) + td.u.lptdesc = POINTER(some_type) + +It is possible to defined sub-subclasses of structures, they inherit the fields +of the base class. If the subclass definition has a separate :attr:`_fields_` +variable, the fields specified in this are appended to the fields of the base +class. + +Structure and union constructors accept both positional and keyword arguments. +Positional arguments are used to initialize member fields in the same order as +they are appear in :attr:`_fields_`. Keyword arguments in the constructor are +interpreted as attribute assignments, so they will initialize :attr:`_fields_` +with the same name, or create new attributes for names not present in +:attr:`_fields_`. + + +.. _ctypes-arrays-pointers: + +Arrays and pointers +^^^^^^^^^^^^^^^^^^^ + +Not yet written - please see the sections :ref:`ctypes-pointers` and +section :ref:`ctypes-arrays` in the tutorial. + diff --git a/Doc/library/curses.ascii.rst b/Doc/library/curses.ascii.rst new file mode 100644 index 0000000..0a45c2a --- /dev/null +++ b/Doc/library/curses.ascii.rst @@ -0,0 +1,228 @@ + +:mod:`curses.ascii` --- Utilities for ASCII characters +====================================================== + +.. module:: curses.ascii + :synopsis: Constants and set-membership functions for ASCII characters. +.. moduleauthor:: Eric S. Raymond +.. sectionauthor:: Eric S. Raymond + + +.. versionadded:: 1.6 + +The :mod:`curses.ascii` module supplies name constants for ASCII characters and +functions to test membership in various ASCII character classes. The constants +supplied are names for control characters as follows: + ++--------------+----------------------------------------------+ +| Name | Meaning | ++==============+==============================================+ +| :const:`NUL` | | ++--------------+----------------------------------------------+ +| :const:`SOH` | Start of heading, console interrupt | ++--------------+----------------------------------------------+ +| :const:`STX` | Start of text | ++--------------+----------------------------------------------+ +| :const:`ETX` | End of text | ++--------------+----------------------------------------------+ +| :const:`EOT` | End of transmission | ++--------------+----------------------------------------------+ +| :const:`ENQ` | Enquiry, goes with :const:`ACK` flow control | ++--------------+----------------------------------------------+ +| :const:`ACK` | Acknowledgement | ++--------------+----------------------------------------------+ +| :const:`BEL` | Bell | ++--------------+----------------------------------------------+ +| :const:`BS` | Backspace | ++--------------+----------------------------------------------+ +| :const:`TAB` | Tab | ++--------------+----------------------------------------------+ +| :const:`HT` | Alias for :const:`TAB`: "Horizontal tab" | ++--------------+----------------------------------------------+ +| :const:`LF` | Line feed | ++--------------+----------------------------------------------+ +| :const:`NL` | Alias for :const:`LF`: "New line" | ++--------------+----------------------------------------------+ +| :const:`VT` | Vertical tab | ++--------------+----------------------------------------------+ +| :const:`FF` | Form feed | ++--------------+----------------------------------------------+ +| :const:`CR` | Carriage return | ++--------------+----------------------------------------------+ +| :const:`SO` | Shift-out, begin alternate character set | ++--------------+----------------------------------------------+ +| :const:`SI` | Shift-in, resume default character set | ++--------------+----------------------------------------------+ +| :const:`DLE` | Data-link escape | ++--------------+----------------------------------------------+ +| :const:`DC1` | XON, for flow control | ++--------------+----------------------------------------------+ +| :const:`DC2` | Device control 2, block-mode flow control | ++--------------+----------------------------------------------+ +| :const:`DC3` | XOFF, for flow control | ++--------------+----------------------------------------------+ +| :const:`DC4` | Device control 4 | ++--------------+----------------------------------------------+ +| :const:`NAK` | Negative acknowledgement | ++--------------+----------------------------------------------+ +| :const:`SYN` | Synchronous idle | ++--------------+----------------------------------------------+ +| :const:`ETB` | End transmission block | ++--------------+----------------------------------------------+ +| :const:`CAN` | Cancel | ++--------------+----------------------------------------------+ +| :const:`EM` | End of medium | ++--------------+----------------------------------------------+ +| :const:`SUB` | Substitute | ++--------------+----------------------------------------------+ +| :const:`ESC` | Escape | ++--------------+----------------------------------------------+ +| :const:`FS` | File separator | ++--------------+----------------------------------------------+ +| :const:`GS` | Group separator | ++--------------+----------------------------------------------+ +| :const:`RS` | Record separator, block-mode terminator | ++--------------+----------------------------------------------+ +| :const:`US` | Unit separator | ++--------------+----------------------------------------------+ +| :const:`SP` | Space | ++--------------+----------------------------------------------+ +| :const:`DEL` | Delete | ++--------------+----------------------------------------------+ + +Note that many of these have little practical significance in modern usage. The +mnemonics derive from teleprinter conventions that predate digital computers. + +The module supplies the following functions, patterned on those in the standard +C library: + + +.. function:: isalnum(c) + + Checks for an ASCII alphanumeric character; it is equivalent to ``isalpha(c) or + isdigit(c)``. + + +.. function:: isalpha(c) + + Checks for an ASCII alphabetic character; it is equivalent to ``isupper(c) or + islower(c)``. + + +.. function:: isascii(c) + + Checks for a character value that fits in the 7-bit ASCII set. + + +.. function:: isblank(c) + + Checks for an ASCII whitespace character. + + +.. function:: iscntrl(c) + + Checks for an ASCII control character (in the range 0x00 to 0x1f). + + +.. function:: isdigit(c) + + Checks for an ASCII decimal digit, ``'0'`` through ``'9'``. This is equivalent + to ``c in string.digits``. + + +.. function:: isgraph(c) + + Checks for ASCII any printable character except space. + + +.. function:: islower(c) + + Checks for an ASCII lower-case character. + + +.. function:: isprint(c) + + Checks for any ASCII printable character including space. + + +.. function:: ispunct(c) + + Checks for any printable ASCII character which is not a space or an alphanumeric + character. + + +.. function:: isspace(c) + + Checks for ASCII white-space characters; space, line feed, carriage return, form + feed, horizontal tab, vertical tab. + + +.. function:: isupper(c) + + Checks for an ASCII uppercase letter. + + +.. function:: isxdigit(c) + + Checks for an ASCII hexadecimal digit. This is equivalent to ``c in + string.hexdigits``. + + +.. function:: isctrl(c) + + Checks for an ASCII control character (ordinal values 0 to 31). + + +.. function:: ismeta(c) + + Checks for a non-ASCII character (ordinal values 0x80 and above). + +These functions accept either integers or strings; when the argument is a +string, it is first converted using the built-in function :func:`ord`. + +Note that all these functions check ordinal bit values derived from the first +character of the string you pass in; they do not actually know anything about +the host machine's character encoding. For functions that know about the +character encoding (and handle internationalization properly) see the +:mod:`string` module. + +The following two functions take either a single-character string or integer +byte value; they return a value of the same type. + + +.. function:: ascii(c) + + Return the ASCII value corresponding to the low 7 bits of *c*. + + +.. function:: ctrl(c) + + Return the control character corresponding to the given character (the character + bit value is bitwise-anded with 0x1f). + + +.. function:: alt(c) + + Return the 8-bit character corresponding to the given ASCII character (the + character bit value is bitwise-ored with 0x80). + +The following function takes either a single-character string or integer value; +it returns a string. + + +.. function:: unctrl(c) + + Return a string representation of the ASCII character *c*. If *c* is printable, + this string is the character itself. If the character is a control character + (0x00-0x1f) the string consists of a caret (``'^'``) followed by the + corresponding uppercase letter. If the character is an ASCII delete (0x7f) the + string is ``'^?'``. If the character has its meta bit (0x80) set, the meta bit + is stripped, the preceding rules applied, and ``'!'`` prepended to the result. + + +.. data:: controlnames + + A 33-element string array that contains the ASCII mnemonics for the thirty-two + ASCII control characters from 0 (NUL) to 0x1f (US), in order, plus the mnemonic + ``SP`` for the space character. + diff --git a/Doc/library/curses.panel.rst b/Doc/library/curses.panel.rst new file mode 100644 index 0000000..59e5b86 --- /dev/null +++ b/Doc/library/curses.panel.rst @@ -0,0 +1,119 @@ + +:mod:`curses.panel` --- A panel stack extension for curses. +=========================================================== + +.. module:: curses.panel + :synopsis: A panel stack extension that adds depth to curses windows. +.. sectionauthor:: A.M. Kuchling + + +Panels are windows with the added feature of depth, so they can be stacked on +top of each other, and only the visible portions of each window will be +displayed. Panels can be added, moved up or down in the stack, and removed. + + +.. _cursespanel-functions: + +Functions +--------- + +The module :mod:`curses.panel` defines the following functions: + + +.. function:: bottom_panel() + + Returns the bottom panel in the panel stack. + + +.. function:: new_panel(win) + + Returns a panel object, associating it with the given window *win*. Be aware + that you need to keep the returned panel object referenced explicitly. If you + don't, the panel object is garbage collected and removed from the panel stack. + + +.. function:: top_panel() + + Returns the top panel in the panel stack. + + +.. function:: update_panels() + + Updates the virtual screen after changes in the panel stack. This does not call + :func:`curses.doupdate`, so you'll have to do this yourself. + + +.. _curses-panel-objects: + +Panel Objects +------------- + +Panel objects, as returned by :func:`new_panel` above, are windows with a +stacking order. There's always a window associated with a panel which determines +the content, while the panel methods are responsible for the window's depth in +the panel stack. + +Panel objects have the following methods: + + +.. method:: Panel.above() + + Returns the panel above the current panel. + + +.. method:: Panel.below() + + Returns the panel below the current panel. + + +.. method:: Panel.bottom() + + Push the panel to the bottom of the stack. + + +.. method:: Panel.hidden() + + Returns true if the panel is hidden (not visible), false otherwise. + + +.. method:: Panel.hide() + + Hide the panel. This does not delete the object, it just makes the window on + screen invisible. + + +.. method:: Panel.move(y, x) + + Move the panel to the screen coordinates ``(y, x)``. + + +.. method:: Panel.replace(win) + + Change the window associated with the panel to the window *win*. + + +.. method:: Panel.set_userptr(obj) + + Set the panel's user pointer to *obj*. This is used to associate an arbitrary + piece of data with the panel, and can be any Python object. + + +.. method:: Panel.show() + + Display the panel (which might have been hidden). + + +.. method:: Panel.top() + + Push panel to the top of the stack. + + +.. method:: Panel.userptr() + + Returns the user pointer for the panel. This might be any Python object. + + +.. method:: Panel.window() + + Returns the window object associated with the panel. + diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst new file mode 100644 index 0000000..91af757 --- /dev/null +++ b/Doc/library/curses.rst @@ -0,0 +1,1679 @@ + +:mod:`curses` --- Terminal handling for character-cell displays +=============================================================== + +.. module:: curses + :synopsis: An interface to the curses library, providing portable terminal handling. +.. sectionauthor:: Moshe Zadka +.. sectionauthor:: Eric Raymond + + +.. versionchanged:: 1.6 + Added support for the ``ncurses`` library and converted to a package. + +The :mod:`curses` module provides an interface to the curses library, the +de-facto standard for portable advanced terminal handling. + +While curses is most widely used in the Unix environment, versions are available +for DOS, OS/2, and possibly other systems as well. This extension module is +designed to match the API of ncurses, an open-source curses library hosted on +Linux and the BSD variants of Unix. + + +.. seealso:: + + Module :mod:`curses.ascii` + Utilities for working with ASCII characters, regardless of your locale settings. + + Module :mod:`curses.panel` + A panel stack extension that adds depth to curses windows. + + Module :mod:`curses.textpad` + Editable text widget for curses supporting :program:`Emacs`\ -like bindings. + + Module :mod:`curses.wrapper` + Convenience function to ensure proper terminal setup and resetting on + application entry and exit. + + `Curses Programming with Python `_ + Tutorial material on using curses with Python, by Andrew Kuchling and Eric + Raymond, is available on the Python Web site. + + The :file:`Demo/curses/` directory in the Python source distribution contains + some example programs using the curses bindings provided by this module. + + +.. _curses-functions: + +Functions +--------- + +The module :mod:`curses` defines the following exception: + + +.. exception:: error + + Exception raised when a curses library function returns an error. + +.. note:: + + Whenever *x* or *y* arguments to a function or a method are optional, they + default to the current cursor location. Whenever *attr* is optional, it defaults + to :const:`A_NORMAL`. + +The module :mod:`curses` defines the following functions: + + +.. function:: baudrate() + + Returns the output speed of the terminal in bits per second. On software + terminal emulators it will have a fixed high value. Included for historical + reasons; in former times, it was used to write output loops for time delays and + occasionally to change interfaces depending on the line speed. + + +.. function:: beep() + + Emit a short attention sound. + + +.. function:: can_change_color() + + Returns true or false, depending on whether the programmer can change the colors + displayed by the terminal. + + +.. function:: cbreak() + + Enter cbreak mode. In cbreak mode (sometimes called "rare" mode) normal tty + line buffering is turned off and characters are available to be read one by one. + However, unlike raw mode, special characters (interrupt, quit, suspend, and flow + control) retain their effects on the tty driver and calling program. Calling + first :func:`raw` then :func:`cbreak` leaves the terminal in cbreak mode. + + +.. function:: color_content(color_number) + + Returns the intensity of the red, green, and blue (RGB) components in the color + *color_number*, which must be between ``0`` and :const:`COLORS`. A 3-tuple is + returned, containing the R,G,B values for the given color, which will be between + ``0`` (no component) and ``1000`` (maximum amount of component). + + +.. function:: color_pair(color_number) + + Returns the attribute value for displaying text in the specified color. This + attribute value can be combined with :const:`A_STANDOUT`, :const:`A_REVERSE`, + and the other :const:`A_\*` attributes. :func:`pair_number` is the counterpart + to this function. + + +.. function:: curs_set(visibility) + + Sets the cursor state. *visibility* can be set to 0, 1, or 2, for invisible, + normal, or very visible. If the terminal supports the visibility requested, the + previous cursor state is returned; otherwise, an exception is raised. On many + terminals, the "visible" mode is an underline cursor and the "very visible" mode + is a block cursor. + + +.. function:: def_prog_mode() + + Saves the current terminal mode as the "program" mode, the mode when the running + program is using curses. (Its counterpart is the "shell" mode, for when the + program is not in curses.) Subsequent calls to :func:`reset_prog_mode` will + restore this mode. + + +.. function:: def_shell_mode() + + Saves the current terminal mode as the "shell" mode, the mode when the running + program is not using curses. (Its counterpart is the "program" mode, when the + program is using curses capabilities.) Subsequent calls to + :func:`reset_shell_mode` will restore this mode. + + +.. function:: delay_output(ms) + + Inserts an *ms* millisecond pause in output. + + +.. function:: doupdate() + + Update the physical screen. The curses library keeps two data structures, one + representing the current physical screen contents and a virtual screen + representing the desired next state. The :func:`doupdate` ground updates the + physical screen to match the virtual screen. + + The virtual screen may be updated by a :meth:`noutrefresh` call after write + operations such as :meth:`addstr` have been performed on a window. The normal + :meth:`refresh` call is simply :meth:`noutrefresh` followed by :func:`doupdate`; + if you have to update multiple windows, you can speed performance and perhaps + reduce screen flicker by issuing :meth:`noutrefresh` calls on all windows, + followed by a single :func:`doupdate`. + + +.. function:: echo() + + Enter echo mode. In echo mode, each character input is echoed to the screen as + it is entered. + + +.. function:: endwin() + + De-initialize the library, and return terminal to normal status. + + +.. function:: erasechar() + + Returns the user's current erase character. Under Unix operating systems this + is a property of the controlling tty of the curses program, and is not set by + the curses library itself. + + +.. function:: filter() + + The :func:`filter` routine, if used, must be called before :func:`initscr` is + called. The effect is that, during those calls, LINES is set to 1; the + capabilities clear, cup, cud, cud1, cuu1, cuu, vpa are disabled; and the home + string is set to the value of cr. The effect is that the cursor is confined to + the current line, and so are screen updates. This may be used for enabling + character-at-a-time line editing without touching the rest of the screen. + + +.. function:: flash() + + Flash the screen. That is, change it to reverse-video and then change it back + in a short interval. Some people prefer such as 'visible bell' to the audible + attention signal produced by :func:`beep`. + + +.. function:: flushinp() + + Flush all input buffers. This throws away any typeahead that has been typed + by the user and has not yet been processed by the program. + + +.. function:: getmouse() + + After :meth:`getch` returns :const:`KEY_MOUSE` to signal a mouse event, this + method should be call to retrieve the queued mouse event, represented as a + 5-tuple ``(id, x, y, z, bstate)``. *id* is an ID value used to distinguish + multiple devices, and *x*, *y*, *z* are the event's coordinates. (*z* is + currently unused.). *bstate* is an integer value whose bits will be set to + indicate the type of event, and will be the bitwise OR of one or more of the + following constants, where *n* is the button number from 1 to 4: + :const:`BUTTONn_PRESSED`, :const:`BUTTONn_RELEASED`, :const:`BUTTONn_CLICKED`, + :const:`BUTTONn_DOUBLE_CLICKED`, :const:`BUTTONn_TRIPLE_CLICKED`, + :const:`BUTTON_SHIFT`, :const:`BUTTON_CTRL`, :const:`BUTTON_ALT`. + + +.. function:: getsyx() + + Returns the current coordinates of the virtual screen cursor in y and x. If + leaveok is currently true, then -1,-1 is returned. + + +.. function:: getwin(file) + + Reads window related data stored in the file by an earlier :func:`putwin` call. + The routine then creates and initializes a new window using that data, returning + the new window object. + + +.. function:: has_colors() + + Returns true if the terminal can display colors; otherwise, it returns false. + + +.. function:: has_ic() + + Returns true if the terminal has insert- and delete- character capabilities. + This function is included for historical reasons only, as all modern software + terminal emulators have such capabilities. + + +.. function:: has_il() + + Returns true if the terminal has insert- and delete-line capabilities, or can + simulate them using scrolling regions. This function is included for + historical reasons only, as all modern software terminal emulators have such + capabilities. + + +.. function:: has_key(ch) + + Takes a key value *ch*, and returns true if the current terminal type recognizes + a key with that value. + + +.. function:: halfdelay(tenths) + + Used for half-delay mode, which is similar to cbreak mode in that characters + typed by the user are immediately available to the program. However, after + blocking for *tenths* tenths of seconds, an exception is raised if nothing has + been typed. The value of *tenths* must be a number between 1 and 255. Use + :func:`nocbreak` to leave half-delay mode. + + +.. function:: init_color(color_number, r, g, b) + + Changes the definition of a color, taking the number of the color to be changed + followed by three RGB values (for the amounts of red, green, and blue + components). The value of *color_number* must be between ``0`` and + :const:`COLORS`. Each of *r*, *g*, *b*, must be a value between ``0`` and + ``1000``. When :func:`init_color` is used, all occurrences of that color on the + screen immediately change to the new definition. This function is a no-op on + most terminals; it is active only if :func:`can_change_color` returns ``1``. + + +.. function:: init_pair(pair_number, fg, bg) + + Changes the definition of a color-pair. It takes three arguments: the number of + the color-pair to be changed, the foreground color number, and the background + color number. The value of *pair_number* must be between ``1`` and + ``COLOR_PAIRS - 1`` (the ``0`` color pair is wired to white on black and cannot + be changed). The value of *fg* and *bg* arguments must be between ``0`` and + :const:`COLORS`. If the color-pair was previously initialized, the screen is + refreshed and all occurrences of that color-pair are changed to the new + definition. + + +.. function:: initscr() + + Initialize the library. Returns a :class:`WindowObject` which represents the + whole screen. + + .. note:: + + If there is an error opening the terminal, the underlying curses library may + cause the interpreter to exit. + + +.. function:: isendwin() + + Returns true if :func:`endwin` has been called (that is, the curses library has + been deinitialized). + + +.. function:: keyname(k) + + Return the name of the key numbered *k*. The name of a key generating printable + ASCII character is the key's character. The name of a control-key combination + is a two-character string consisting of a caret followed by the corresponding + printable ASCII character. The name of an alt-key combination (128-255) is a + string consisting of the prefix 'M-' followed by the name of the corresponding + ASCII character. + + +.. function:: killchar() + + Returns the user's current line kill character. Under Unix operating systems + this is a property of the controlling tty of the curses program, and is not set + by the curses library itself. + + +.. function:: longname() + + Returns a string containing the terminfo long name field describing the current + terminal. The maximum length of a verbose description is 128 characters. It is + defined only after the call to :func:`initscr`. + + +.. function:: meta(yes) + + If *yes* is 1, allow 8-bit characters to be input. If *yes* is 0, allow only + 7-bit chars. + + +.. function:: mouseinterval(interval) + + Sets the maximum time in milliseconds that can elapse between press and release + events in order for them to be recognized as a click, and returns the previous + interval value. The default value is 200 msec, or one fifth of a second. + + +.. function:: mousemask(mousemask) + + Sets the mouse events to be reported, and returns a tuple ``(availmask, + oldmask)``. *availmask* indicates which of the specified mouse events can be + reported; on complete failure it returns 0. *oldmask* is the previous value of + the given window's mouse event mask. If this function is never called, no mouse + events are ever reported. + + +.. function:: napms(ms) + + Sleep for *ms* milliseconds. + + +.. function:: newpad(nlines, ncols) + + Creates and returns a pointer to a new pad data structure with the given number + of lines and columns. A pad is returned as a window object. + + A pad is like a window, except that it is not restricted by the screen size, and + is not necessarily associated with a particular part of the screen. Pads can be + used when a large window is needed, and only a part of the window will be on the + screen at one time. Automatic refreshes of pads (such as from scrolling or + echoing of input) do not occur. The :meth:`refresh` and :meth:`noutrefresh` + methods of a pad require 6 arguments to specify the part of the pad to be + displayed and the location on the screen to be used for the display. The + arguments are pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol; the p + arguments refer to the upper left corner of the pad region to be displayed and + the s arguments define a clipping box on the screen within which the pad region + is to be displayed. + + +.. function:: newwin([nlines, ncols,] begin_y, begin_x) + + Return a new window, whose left-upper corner is at ``(begin_y, begin_x)``, and + whose height/width is *nlines*/*ncols*. + + By default, the window will extend from the specified position to the lower + right corner of the screen. + + +.. function:: nl() + + Enter newline mode. This mode translates the return key into newline on input, + and translates newline into return and line-feed on output. Newline mode is + initially on. + + +.. function:: nocbreak() + + Leave cbreak mode. Return to normal "cooked" mode with line buffering. + + +.. function:: noecho() + + Leave echo mode. Echoing of input characters is turned off. + + +.. function:: nonl() + + Leave newline mode. Disable translation of return into newline on input, and + disable low-level translation of newline into newline/return on output (but this + does not change the behavior of ``addch('\n')``, which always does the + equivalent of return and line feed on the virtual screen). With translation + off, curses can sometimes speed up vertical motion a little; also, it will be + able to detect the return key on input. + + +.. function:: noqiflush() + + When the noqiflush routine is used, normal flush of input and output queues + associated with the INTR, QUIT and SUSP characters will not be done. You may + want to call :func:`noqiflush` in a signal handler if you want output to + continue as though the interrupt had not occurred, after the handler exits. + + +.. function:: noraw() + + Leave raw mode. Return to normal "cooked" mode with line buffering. + + +.. function:: pair_content(pair_number) + + Returns a tuple ``(fg, bg)`` containing the colors for the requested color pair. + The value of *pair_number* must be between ``1`` and ``COLOR_PAIRS - 1``. + + +.. function:: pair_number(attr) + + Returns the number of the color-pair set by the attribute value *attr*. + :func:`color_pair` is the counterpart to this function. + + +.. function:: putp(string) + + Equivalent to ``tputs(str, 1, putchar)``; emits the value of a specified + terminfo capability for the current terminal. Note that the output of putp + always goes to standard output. + + +.. function:: qiflush( [flag] ) + + If *flag* is false, the effect is the same as calling :func:`noqiflush`. If + *flag* is true, or no argument is provided, the queues will be flushed when + these control characters are read. + + +.. function:: raw() + + Enter raw mode. In raw mode, normal line buffering and processing of + interrupt, quit, suspend, and flow control keys are turned off; characters are + presented to curses input functions one by one. + + +.. function:: reset_prog_mode() + + Restores the terminal to "program" mode, as previously saved by + :func:`def_prog_mode`. + + +.. function:: reset_shell_mode() + + Restores the terminal to "shell" mode, as previously saved by + :func:`def_shell_mode`. + + +.. function:: setsyx(y, x) + + Sets the virtual screen cursor to *y*, *x*. If *y* and *x* are both -1, then + leaveok is set. + + +.. function:: setupterm([termstr, fd]) + + Initializes the terminal. *termstr* is a string giving the terminal name; if + omitted, the value of the TERM environment variable will be used. *fd* is the + file descriptor to which any initialization sequences will be sent; if not + supplied, the file descriptor for ``sys.stdout`` will be used. + + +.. function:: start_color() + + Must be called if the programmer wants to use colors, and before any other color + manipulation routine is called. It is good practice to call this routine right + after :func:`initscr`. + + :func:`start_color` initializes eight basic colors (black, red, green, yellow, + blue, magenta, cyan, and white), and two global variables in the :mod:`curses` + module, :const:`COLORS` and :const:`COLOR_PAIRS`, containing the maximum number + of colors and color-pairs the terminal can support. It also restores the colors + on the terminal to the values they had when the terminal was just turned on. + + +.. function:: termattrs() + + Returns a logical OR of all video attributes supported by the terminal. This + information is useful when a curses program needs complete control over the + appearance of the screen. + + +.. function:: termname() + + Returns the value of the environment variable TERM, truncated to 14 characters. + + +.. function:: tigetflag(capname) + + Returns the value of the Boolean capability corresponding to the terminfo + capability name *capname*. The value ``-1`` is returned if *capname* is not a + Boolean capability, or ``0`` if it is canceled or absent from the terminal + description. + + +.. function:: tigetnum(capname) + + Returns the value of the numeric capability corresponding to the terminfo + capability name *capname*. The value ``-2`` is returned if *capname* is not a + numeric capability, or ``-1`` if it is canceled or absent from the terminal + description. + + +.. function:: tigetstr(capname) + + Returns the value of the string capability corresponding to the terminfo + capability name *capname*. ``None`` is returned if *capname* is not a string + capability, or is canceled or absent from the terminal description. + + +.. function:: tparm(str[,...]) + + Instantiates the string *str* with the supplied parameters, where *str* should + be a parameterized string obtained from the terminfo database. E.g. + ``tparm(tigetstr("cup"), 5, 3)`` could result in ``'\033[6;4H'``, the exact + result depending on terminal type. + + +.. function:: typeahead(fd) + + Specifies that the file descriptor *fd* be used for typeahead checking. If *fd* + is ``-1``, then no typeahead checking is done. + + The curses library does "line-breakout optimization" by looking for typeahead + periodically while updating the screen. If input is found, and it is coming + from a tty, the current update is postponed until refresh or doupdate is called + again, allowing faster response to commands typed in advance. This function + allows specifying a different file descriptor for typeahead checking. + + +.. function:: unctrl(ch) + + Returns a string which is a printable representation of the character *ch*. + Control characters are displayed as a caret followed by the character, for + example as ``^C``. Printing characters are left as they are. + + +.. function:: ungetch(ch) + + Push *ch* so the next :meth:`getch` will return it. + + .. note:: + + Only one *ch* can be pushed before :meth:`getch` is called. + + +.. function:: ungetmouse(id, x, y, z, bstate) + + Push a :const:`KEY_MOUSE` event onto the input queue, associating the given + state data with it. + + +.. function:: use_env(flag) + + If used, this function should be called before :func:`initscr` or newterm are + called. When *flag* is false, the values of lines and columns specified in the + terminfo database will be used, even if environment variables :envvar:`LINES` + and :envvar:`COLUMNS` (used by default) are set, or if curses is running in a + window (in which case default behavior would be to use the window size if + :envvar:`LINES` and :envvar:`COLUMNS` are not set). + + +.. function:: use_default_colors() + + Allow use of default values for colors on terminals supporting this feature. Use + this to support transparency in your application. The default color is assigned + to the color number -1. After calling this function, ``init_pair(x, + curses.COLOR_RED, -1)`` initializes, for instance, color pair *x* to a red + foreground color on the default background. + + +.. _curses-window-objects: + +Window Objects +-------------- + +Window objects, as returned by :func:`initscr` and :func:`newwin` above, have +the following methods: + + +.. method:: window.addch([y, x,] ch[, attr]) + + .. note:: + + A *character* means a C character (an ASCII code), rather then a Python + character (a string of length 1). (This note is true whenever the documentation + mentions a character.) The builtin :func:`ord` is handy for conveying strings to + codes. + + Paint character *ch* at ``(y, x)`` with attributes *attr*, overwriting any + character previously painter at that location. By default, the character + position and attributes are the current settings for the window object. + + +.. method:: window.addnstr([y, x,] str, n[, attr]) + + Paint at most *n* characters of the string *str* at ``(y, x)`` with attributes + *attr*, overwriting anything previously on the display. + + +.. method:: window.addstr([y, x,] str[, attr]) + + Paint the string *str* at ``(y, x)`` with attributes *attr*, overwriting + anything previously on the display. + + +.. method:: window.attroff(attr) + + Remove attribute *attr* from the "background" set applied to all writes to the + current window. + + +.. method:: window.attron(attr) + + Add attribute *attr* from the "background" set applied to all writes to the + current window. + + +.. method:: window.attrset(attr) + + Set the "background" set of attributes to *attr*. This set is initially 0 (no + attributes). + + +.. method:: window.bkgd(ch[, attr]) + + Sets the background property of the window to the character *ch*, with + attributes *attr*. The change is then applied to every character position in + that window: + + * The attribute of every character in the window is changed to the new + background attribute. + + * Wherever the former background character appears, it is changed to the new + background character. + + +.. method:: window.bkgdset(ch[, attr]) + + Sets the window's background. A window's background consists of a character and + any combination of attributes. The attribute part of the background is combined + (OR'ed) with all non-blank characters that are written into the window. Both + the character and attribute parts of the background are combined with the blank + characters. The background becomes a property of the character and moves with + the character through any scrolling and insert/delete line/character operations. + + +.. method:: window.border([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]]) + + Draw a border around the edges of the window. Each parameter specifies the + character to use for a specific part of the border; see the table below for more + details. The characters can be specified as integers or as one-character + strings. + + .. note:: + + A ``0`` value for any parameter will cause the default character to be used for + that parameter. Keyword parameters can *not* be used. The defaults are listed + in this table: + + +-----------+---------------------+-----------------------+ + | Parameter | Description | Default value | + +===========+=====================+=======================+ + | *ls* | Left side | :const:`ACS_VLINE` | + +-----------+---------------------+-----------------------+ + | *rs* | Right side | :const:`ACS_VLINE` | + +-----------+---------------------+-----------------------+ + | *ts* | Top | :const:`ACS_HLINE` | + +-----------+---------------------+-----------------------+ + | *bs* | Bottom | :const:`ACS_HLINE` | + +-----------+---------------------+-----------------------+ + | *tl* | Upper-left corner | :const:`ACS_ULCORNER` | + +-----------+---------------------+-----------------------+ + | *tr* | Upper-right corner | :const:`ACS_URCORNER` | + +-----------+---------------------+-----------------------+ + | *bl* | Bottom-left corner | :const:`ACS_LLCORNER` | + +-----------+---------------------+-----------------------+ + | *br* | Bottom-right corner | :const:`ACS_LRCORNER` | + +-----------+---------------------+-----------------------+ + + +.. method:: window.box([vertch, horch]) + + Similar to :meth:`border`, but both *ls* and *rs* are *vertch* and both *ts* and + bs are *horch*. The default corner characters are always used by this function. + + +.. method:: window.chgat([y, x, ] [num,] attr) + + Sets the attributes of *num* characters at the current cursor position, or at + position ``(y, x)`` if supplied. If no value of *num* is given or *num* = -1, + the attribute will be set on all the characters to the end of the line. This + function does not move the cursor. The changed line will be touched using the + :meth:`touchline` method so that the contents will be redisplayed by the next + window refresh. + + +.. method:: window.clear() + + Like :meth:`erase`, but also causes the whole window to be repainted upon next + call to :meth:`refresh`. + + +.. method:: window.clearok(yes) + + If *yes* is 1, the next call to :meth:`refresh` will clear the window + completely. + + +.. method:: window.clrtobot() + + Erase from cursor to the end of the window: all lines below the cursor are + deleted, and then the equivalent of :meth:`clrtoeol` is performed. + + +.. method:: window.clrtoeol() + + Erase from cursor to the end of the line. + + +.. method:: window.cursyncup() + + Updates the current cursor position of all the ancestors of the window to + reflect the current cursor position of the window. + + +.. method:: window.delch([y, x]) + + Delete any character at ``(y, x)``. + + +.. method:: window.deleteln() + + Delete the line under the cursor. All following lines are moved up by 1 line. + + +.. method:: window.derwin([nlines, ncols,] begin_y, begin_x) + + An abbreviation for "derive window", :meth:`derwin` is the same as calling + :meth:`subwin`, except that *begin_y* and *begin_x* are relative to the origin + of the window, rather than relative to the entire screen. Returns a window + object for the derived window. + + +.. method:: window.echochar(ch[, attr]) + + Add character *ch* with attribute *attr*, and immediately call :meth:`refresh` + on the window. + + +.. method:: window.enclose(y, x) + + Tests whether the given pair of screen-relative character-cell coordinates are + enclosed by the given window, returning true or false. It is useful for + determining what subset of the screen windows enclose the location of a mouse + event. + + +.. method:: window.erase() + + Clear the window. + + +.. method:: window.getbegyx() + + Return a tuple ``(y, x)`` of co-ordinates of upper-left corner. + + +.. method:: window.getch([y, x]) + + Get a character. Note that the integer returned does *not* have to be in ASCII + range: function keys, keypad keys and so on return numbers higher than 256. In + no-delay mode, -1 is returned if there is no input. + + +.. method:: window.getkey([y, x]) + + Get a character, returning a string instead of an integer, as :meth:`getch` + does. Function keys, keypad keys and so on return a multibyte string containing + the key name. In no-delay mode, an exception is raised if there is no input. + + +.. method:: window.getmaxyx() + + Return a tuple ``(y, x)`` of the height and width of the window. + + +.. method:: window.getparyx() + + Returns the beginning coordinates of this window relative to its parent window + into two integer variables y and x. Returns ``-1,-1`` if this window has no + parent. + + +.. method:: window.getstr([y, x]) + + Read a string from the user, with primitive line editing capacity. + + +.. method:: window.getyx() + + Return a tuple ``(y, x)`` of current cursor position relative to the window's + upper-left corner. + + +.. method:: window.hline([y, x,] ch, n) + + Display a horizontal line starting at ``(y, x)`` with length *n* consisting of + the character *ch*. + + +.. method:: window.idcok(flag) + + If *flag* is false, curses no longer considers using the hardware insert/delete + character feature of the terminal; if *flag* is true, use of character insertion + and deletion is enabled. When curses is first initialized, use of character + insert/delete is enabled by default. + + +.. method:: window.idlok(yes) + + If called with *yes* equal to 1, :mod:`curses` will try and use hardware line + editing facilities. Otherwise, line insertion/deletion are disabled. + + +.. method:: window.immedok(flag) + + If *flag* is true, any change in the window image automatically causes the + window to be refreshed; you no longer have to call :meth:`refresh` yourself. + However, it may degrade performance considerably, due to repeated calls to + wrefresh. This option is disabled by default. + + +.. method:: window.inch([y, x]) + + Return the character at the given position in the window. The bottom 8 bits are + the character proper, and upper bits are the attributes. + + +.. method:: window.insch([y, x,] ch[, attr]) + + Paint character *ch* at ``(y, x)`` with attributes *attr*, moving the line from + position *x* right by one character. + + +.. method:: window.insdelln(nlines) + + Inserts *nlines* lines into the specified window above the current line. The + *nlines* bottom lines are lost. For negative *nlines*, delete *nlines* lines + starting with the one under the cursor, and move the remaining lines up. The + bottom *nlines* lines are cleared. The current cursor position remains the + same. + + +.. method:: window.insertln() + + Insert a blank line under the cursor. All following lines are moved down by 1 + line. + + +.. method:: window.insnstr([y, x,] str, n [, attr]) + + Insert a character string (as many characters as will fit on the line) before + the character under the cursor, up to *n* characters. If *n* is zero or + negative, the entire string is inserted. All characters to the right of the + cursor are shifted right, with the rightmost characters on the line being lost. + The cursor position does not change (after moving to *y*, *x*, if specified). + + +.. method:: window.insstr([y, x, ] str [, attr]) + + Insert a character string (as many characters as will fit on the line) before + the character under the cursor. All characters to the right of the cursor are + shifted right, with the rightmost characters on the line being lost. The cursor + position does not change (after moving to *y*, *x*, if specified). + + +.. method:: window.instr([y, x] [, n]) + + Returns a string of characters, extracted from the window starting at the + current cursor position, or at *y*, *x* if specified. Attributes are stripped + from the characters. If *n* is specified, :meth:`instr` returns return a string + at most *n* characters long (exclusive of the trailing NUL). + + +.. method:: window.is_linetouched(line) + + Returns true if the specified line was modified since the last call to + :meth:`refresh`; otherwise returns false. Raises a :exc:`curses.error` + exception if *line* is not valid for the given window. + + +.. method:: window.is_wintouched() + + Returns true if the specified window was modified since the last call to + :meth:`refresh`; otherwise returns false. + + +.. method:: window.keypad(yes) + + If *yes* is 1, escape sequences generated by some keys (keypad, function keys) + will be interpreted by :mod:`curses`. If *yes* is 0, escape sequences will be + left as is in the input stream. + + +.. method:: window.leaveok(yes) + + If *yes* is 1, cursor is left where it is on update, instead of being at "cursor + position." This reduces cursor movement where possible. If possible the cursor + will be made invisible. + + If *yes* is 0, cursor will always be at "cursor position" after an update. + + +.. method:: window.move(new_y, new_x) + + Move cursor to ``(new_y, new_x)``. + + +.. method:: window.mvderwin(y, x) + + Moves the window inside its parent window. The screen-relative parameters of + the window are not changed. This routine is used to display different parts of + the parent window at the same physical position on the screen. + + +.. method:: window.mvwin(new_y, new_x) + + Move the window so its upper-left corner is at ``(new_y, new_x)``. + + +.. method:: window.nodelay(yes) + + If *yes* is ``1``, :meth:`getch` will be non-blocking. + + +.. method:: window.notimeout(yes) + + If *yes* is ``1``, escape sequences will not be timed out. + + If *yes* is ``0``, after a few milliseconds, an escape sequence will not be + interpreted, and will be left in the input stream as is. + + +.. method:: window.noutrefresh() + + Mark for refresh but wait. This function updates the data structure + representing the desired state of the window, but does not force an update of + the physical screen. To accomplish that, call :func:`doupdate`. + + +.. method:: window.overlay(destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol]) + + Overlay the window on top of *destwin*. The windows need not be the same size, + only the overlapping region is copied. This copy is non-destructive, which means + that the current background character does not overwrite the old contents of + *destwin*. + + To get fine-grained control over the copied region, the second form of + :meth:`overlay` can be used. *sminrow* and *smincol* are the upper-left + coordinates of the source window, and the other variables mark a rectangle in + the destination window. + + +.. method:: window.overwrite(destwin[, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol]) + + Overwrite the window on top of *destwin*. The windows need not be the same size, + in which case only the overlapping region is copied. This copy is destructive, + which means that the current background character overwrites the old contents of + *destwin*. + + To get fine-grained control over the copied region, the second form of + :meth:`overwrite` can be used. *sminrow* and *smincol* are the upper-left + coordinates of the source window, the other variables mark a rectangle in the + destination window. + + +.. method:: window.putwin(file) + + Writes all data associated with the window into the provided file object. This + information can be later retrieved using the :func:`getwin` function. + + +.. method:: window.redrawln(beg, num) + + Indicates that the *num* screen lines, starting at line *beg*, are corrupted and + should be completely redrawn on the next :meth:`refresh` call. + + +.. method:: window.redrawwin() + + Touches the entire window, causing it to be completely redrawn on the next + :meth:`refresh` call. + + +.. method:: window.refresh([pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol]) + + Update the display immediately (sync actual screen with previous + drawing/deleting methods). + + The 6 optional arguments can only be specified when the window is a pad created + with :func:`newpad`. The additional parameters are needed to indicate what part + of the pad and screen are involved. *pminrow* and *pmincol* specify the upper + left-hand corner of the rectangle to be displayed in the pad. *sminrow*, + *smincol*, *smaxrow*, and *smaxcol* specify the edges of the rectangle to be + displayed on the screen. The lower right-hand corner of the rectangle to be + displayed in the pad is calculated from the screen coordinates, since the + rectangles must be the same size. Both rectangles must be entirely contained + within their respective structures. Negative values of *pminrow*, *pmincol*, + *sminrow*, or *smincol* are treated as if they were zero. + + +.. method:: window.scroll([lines=1]) + + Scroll the screen or scrolling region upward by *lines* lines. + + +.. method:: window.scrollok(flag) + + Controls what happens when the cursor of a window is moved off the edge of the + window or scrolling region, either as a result of a newline action on the bottom + line, or typing the last character of the last line. If *flag* is false, the + cursor is left on the bottom line. If *flag* is true, the window is scrolled up + one line. Note that in order to get the physical scrolling effect on the + terminal, it is also necessary to call :meth:`idlok`. + + +.. method:: window.setscrreg(top, bottom) + + Set the scrolling region from line *top* to line *bottom*. All scrolling actions + will take place in this region. + + +.. method:: window.standend() + + Turn off the standout attribute. On some terminals this has the side effect of + turning off all attributes. + + +.. method:: window.standout() + + Turn on attribute *A_STANDOUT*. + + +.. method:: window.subpad([nlines, ncols,] begin_y, begin_x) + + Return a sub-window, whose upper-left corner is at ``(begin_y, begin_x)``, and + whose width/height is *ncols*/*nlines*. + + +.. method:: window.subwin([nlines, ncols,] begin_y, begin_x) + + Return a sub-window, whose upper-left corner is at ``(begin_y, begin_x)``, and + whose width/height is *ncols*/*nlines*. + + By default, the sub-window will extend from the specified position to the lower + right corner of the window. + + +.. method:: window.syncdown() + + Touches each location in the window that has been touched in any of its ancestor + windows. This routine is called by :meth:`refresh`, so it should almost never + be necessary to call it manually. + + +.. method:: window.syncok(flag) + + If called with *flag* set to true, then :meth:`syncup` is called automatically + whenever there is a change in the window. + + +.. method:: window.syncup() + + Touches all locations in ancestors of the window that have been changed in the + window. + + +.. method:: window.timeout(delay) + + Sets blocking or non-blocking read behavior for the window. If *delay* is + negative, blocking read is used (which will wait indefinitely for input). If + *delay* is zero, then non-blocking read is used, and -1 will be returned by + :meth:`getch` if no input is waiting. If *delay* is positive, then + :meth:`getch` will block for *delay* milliseconds, and return -1 if there is + still no input at the end of that time. + + +.. method:: window.touchline(start, count[, changed]) + + Pretend *count* lines have been changed, starting with line *start*. If + *changed* is supplied, it specifies whether the affected lines are marked as + having been changed (*changed*\ =1) or unchanged (*changed*\ =0). + + +.. method:: window.touchwin() + + Pretend the whole window has been changed, for purposes of drawing + optimizations. + + +.. method:: window.untouchwin() + + Marks all lines in the window as unchanged since the last call to + :meth:`refresh`. + + +.. method:: window.vline([y, x,] ch, n) + + Display a vertical line starting at ``(y, x)`` with length *n* consisting of the + character *ch*. + + +Constants +--------- + +The :mod:`curses` module defines the following data members: + + +.. data:: ERR + + Some curses routines that return an integer, such as :func:`getch`, return + :const:`ERR` upon failure. + + +.. data:: OK + + Some curses routines that return an integer, such as :func:`napms`, return + :const:`OK` upon success. + + +.. data:: version + + A string representing the current version of the module. Also available as + :const:`__version__`. + +Several constants are available to specify character cell attributes: + ++------------------+-------------------------------+ +| Attribute | Meaning | ++==================+===============================+ +| ``A_ALTCHARSET`` | Alternate character set mode. | ++------------------+-------------------------------+ +| ``A_BLINK`` | Blink mode. | ++------------------+-------------------------------+ +| ``A_BOLD`` | Bold mode. | ++------------------+-------------------------------+ +| ``A_DIM`` | Dim mode. | ++------------------+-------------------------------+ +| ``A_NORMAL`` | Normal attribute. | ++------------------+-------------------------------+ +| ``A_STANDOUT`` | Standout mode. | ++------------------+-------------------------------+ +| ``A_UNDERLINE`` | Underline mode. | ++------------------+-------------------------------+ + +Keys are referred to by integer constants with names starting with ``KEY_``. +The exact keycaps available are system dependent. + +.. % XXX this table is far too large! +.. % XXX should this table be alphabetized? + ++-------------------+--------------------------------------------+ +| Key constant | Key | ++===================+============================================+ +| ``KEY_MIN`` | Minimum key value | ++-------------------+--------------------------------------------+ +| ``KEY_BREAK`` | Break key (unreliable) | ++-------------------+--------------------------------------------+ +| ``KEY_DOWN`` | Down-arrow | ++-------------------+--------------------------------------------+ +| ``KEY_UP`` | Up-arrow | ++-------------------+--------------------------------------------+ +| ``KEY_LEFT`` | Left-arrow | ++-------------------+--------------------------------------------+ +| ``KEY_RIGHT`` | Right-arrow | ++-------------------+--------------------------------------------+ +| ``KEY_HOME`` | Home key (upward+left arrow) | ++-------------------+--------------------------------------------+ +| ``KEY_BACKSPACE`` | Backspace (unreliable) | ++-------------------+--------------------------------------------+ +| ``KEY_F0`` | Function keys. Up to 64 function keys are | +| | supported. | ++-------------------+--------------------------------------------+ +| ``KEY_Fn`` | Value of function key *n* | ++-------------------+--------------------------------------------+ +| ``KEY_DL`` | Delete line | ++-------------------+--------------------------------------------+ +| ``KEY_IL`` | Insert line | ++-------------------+--------------------------------------------+ +| ``KEY_DC`` | Delete character | ++-------------------+--------------------------------------------+ +| ``KEY_IC`` | Insert char or enter insert mode | ++-------------------+--------------------------------------------+ +| ``KEY_EIC`` | Exit insert char mode | ++-------------------+--------------------------------------------+ +| ``KEY_CLEAR`` | Clear screen | ++-------------------+--------------------------------------------+ +| ``KEY_EOS`` | Clear to end of screen | ++-------------------+--------------------------------------------+ +| ``KEY_EOL`` | Clear to end of line | ++-------------------+--------------------------------------------+ +| ``KEY_SF`` | Scroll 1 line forward | ++-------------------+--------------------------------------------+ +| ``KEY_SR`` | Scroll 1 line backward (reverse) | ++-------------------+--------------------------------------------+ +| ``KEY_NPAGE`` | Next page | ++-------------------+--------------------------------------------+ +| ``KEY_PPAGE`` | Previous page | ++-------------------+--------------------------------------------+ +| ``KEY_STAB`` | Set tab | ++-------------------+--------------------------------------------+ +| ``KEY_CTAB`` | Clear tab | ++-------------------+--------------------------------------------+ +| ``KEY_CATAB`` | Clear all tabs | ++-------------------+--------------------------------------------+ +| ``KEY_ENTER`` | Enter or send (unreliable) | ++-------------------+--------------------------------------------+ +| ``KEY_SRESET`` | Soft (partial) reset (unreliable) | ++-------------------+--------------------------------------------+ +| ``KEY_RESET`` | Reset or hard reset (unreliable) | ++-------------------+--------------------------------------------+ +| ``KEY_PRINT`` | Print | ++-------------------+--------------------------------------------+ +| ``KEY_LL`` | Home down or bottom (lower left) | ++-------------------+--------------------------------------------+ +| ``KEY_A1`` | Upper left of keypad | ++-------------------+--------------------------------------------+ +| ``KEY_A3`` | Upper right of keypad | ++-------------------+--------------------------------------------+ +| ``KEY_B2`` | Center of keypad | ++-------------------+--------------------------------------------+ +| ``KEY_C1`` | Lower left of keypad | ++-------------------+--------------------------------------------+ +| ``KEY_C3`` | Lower right of keypad | ++-------------------+--------------------------------------------+ +| ``KEY_BTAB`` | Back tab | ++-------------------+--------------------------------------------+ +| ``KEY_BEG`` | Beg (beginning) | ++-------------------+--------------------------------------------+ +| ``KEY_CANCEL`` | Cancel | ++-------------------+--------------------------------------------+ +| ``KEY_CLOSE`` | Close | ++-------------------+--------------------------------------------+ +| ``KEY_COMMAND`` | Cmd (command) | ++-------------------+--------------------------------------------+ +| ``KEY_COPY`` | Copy | ++-------------------+--------------------------------------------+ +| ``KEY_CREATE`` | Create | ++-------------------+--------------------------------------------+ +| ``KEY_END`` | End | ++-------------------+--------------------------------------------+ +| ``KEY_EXIT`` | Exit | ++-------------------+--------------------------------------------+ +| ``KEY_FIND`` | Find | ++-------------------+--------------------------------------------+ +| ``KEY_HELP`` | Help | ++-------------------+--------------------------------------------+ +| ``KEY_MARK`` | Mark | ++-------------------+--------------------------------------------+ +| ``KEY_MESSAGE`` | Message | ++-------------------+--------------------------------------------+ +| ``KEY_MOVE`` | Move | ++-------------------+--------------------------------------------+ +| ``KEY_NEXT`` | Next | ++-------------------+--------------------------------------------+ +| ``KEY_OPEN`` | Open | ++-------------------+--------------------------------------------+ +| ``KEY_OPTIONS`` | Options | ++-------------------+--------------------------------------------+ +| ``KEY_PREVIOUS`` | Prev (previous) | ++-------------------+--------------------------------------------+ +| ``KEY_REDO`` | Redo | ++-------------------+--------------------------------------------+ +| ``KEY_REFERENCE`` | Ref (reference) | ++-------------------+--------------------------------------------+ +| ``KEY_REFRESH`` | Refresh | ++-------------------+--------------------------------------------+ +| ``KEY_REPLACE`` | Replace | ++-------------------+--------------------------------------------+ +| ``KEY_RESTART`` | Restart | ++-------------------+--------------------------------------------+ +| ``KEY_RESUME`` | Resume | ++-------------------+--------------------------------------------+ +| ``KEY_SAVE`` | Save | ++-------------------+--------------------------------------------+ +| ``KEY_SBEG`` | Shifted Beg (beginning) | ++-------------------+--------------------------------------------+ +| ``KEY_SCANCEL`` | Shifted Cancel | ++-------------------+--------------------------------------------+ +| ``KEY_SCOMMAND`` | Shifted Command | ++-------------------+--------------------------------------------+ +| ``KEY_SCOPY`` | Shifted Copy | ++-------------------+--------------------------------------------+ +| ``KEY_SCREATE`` | Shifted Create | ++-------------------+--------------------------------------------+ +| ``KEY_SDC`` | Shifted Delete char | ++-------------------+--------------------------------------------+ +| ``KEY_SDL`` | Shifted Delete line | ++-------------------+--------------------------------------------+ +| ``KEY_SELECT`` | Select | ++-------------------+--------------------------------------------+ +| ``KEY_SEND`` | Shifted End | ++-------------------+--------------------------------------------+ +| ``KEY_SEOL`` | Shifted Clear line | ++-------------------+--------------------------------------------+ +| ``KEY_SEXIT`` | Shifted Dxit | ++-------------------+--------------------------------------------+ +| ``KEY_SFIND`` | Shifted Find | ++-------------------+--------------------------------------------+ +| ``KEY_SHELP`` | Shifted Help | ++-------------------+--------------------------------------------+ +| ``KEY_SHOME`` | Shifted Home | ++-------------------+--------------------------------------------+ +| ``KEY_SIC`` | Shifted Input | ++-------------------+--------------------------------------------+ +| ``KEY_SLEFT`` | Shifted Left arrow | ++-------------------+--------------------------------------------+ +| ``KEY_SMESSAGE`` | Shifted Message | ++-------------------+--------------------------------------------+ +| ``KEY_SMOVE`` | Shifted Move | ++-------------------+--------------------------------------------+ +| ``KEY_SNEXT`` | Shifted Next | ++-------------------+--------------------------------------------+ +| ``KEY_SOPTIONS`` | Shifted Options | ++-------------------+--------------------------------------------+ +| ``KEY_SPREVIOUS`` | Shifted Prev | ++-------------------+--------------------------------------------+ +| ``KEY_SPRINT`` | Shifted Print | ++-------------------+--------------------------------------------+ +| ``KEY_SREDO`` | Shifted Redo | ++-------------------+--------------------------------------------+ +| ``KEY_SREPLACE`` | Shifted Replace | ++-------------------+--------------------------------------------+ +| ``KEY_SRIGHT`` | Shifted Right arrow | ++-------------------+--------------------------------------------+ +| ``KEY_SRSUME`` | Shifted Resume | ++-------------------+--------------------------------------------+ +| ``KEY_SSAVE`` | Shifted Save | ++-------------------+--------------------------------------------+ +| ``KEY_SSUSPEND`` | Shifted Suspend | ++-------------------+--------------------------------------------+ +| ``KEY_SUNDO`` | Shifted Undo | ++-------------------+--------------------------------------------+ +| ``KEY_SUSPEND`` | Suspend | ++-------------------+--------------------------------------------+ +| ``KEY_UNDO`` | Undo | ++-------------------+--------------------------------------------+ +| ``KEY_MOUSE`` | Mouse event has occurred | ++-------------------+--------------------------------------------+ +| ``KEY_RESIZE`` | Terminal resize event | ++-------------------+--------------------------------------------+ +| ``KEY_MAX`` | Maximum key value | ++-------------------+--------------------------------------------+ + +On VT100s and their software emulations, such as X terminal emulators, there are +normally at least four function keys (:const:`KEY_F1`, :const:`KEY_F2`, +:const:`KEY_F3`, :const:`KEY_F4`) available, and the arrow keys mapped to +:const:`KEY_UP`, :const:`KEY_DOWN`, :const:`KEY_LEFT` and :const:`KEY_RIGHT` in +the obvious way. If your machine has a PC keyboard, it is safe to expect arrow +keys and twelve function keys (older PC keyboards may have only ten function +keys); also, the following keypad mappings are standard: + ++------------------+-----------+ +| Keycap | Constant | ++==================+===========+ +| :kbd:`Insert` | KEY_IC | ++------------------+-----------+ +| :kbd:`Delete` | KEY_DC | ++------------------+-----------+ +| :kbd:`Home` | KEY_HOME | ++------------------+-----------+ +| :kbd:`End` | KEY_END | ++------------------+-----------+ +| :kbd:`Page Up` | KEY_NPAGE | ++------------------+-----------+ +| :kbd:`Page Down` | KEY_PPAGE | ++------------------+-----------+ + +The following table lists characters from the alternate character set. These are +inherited from the VT100 terminal, and will generally be available on software +emulations such as X terminals. When there is no graphic available, curses +falls back on a crude printable ASCII approximation. + +.. note:: + + These are available only after :func:`initscr` has been called. + ++------------------+------------------------------------------+ +| ACS code | Meaning | ++==================+==========================================+ +| ``ACS_BBSS`` | alternate name for upper right corner | ++------------------+------------------------------------------+ +| ``ACS_BLOCK`` | solid square block | ++------------------+------------------------------------------+ +| ``ACS_BOARD`` | board of squares | ++------------------+------------------------------------------+ +| ``ACS_BSBS`` | alternate name for horizontal line | ++------------------+------------------------------------------+ +| ``ACS_BSSB`` | alternate name for upper left corner | ++------------------+------------------------------------------+ +| ``ACS_BSSS`` | alternate name for top tee | ++------------------+------------------------------------------+ +| ``ACS_BTEE`` | bottom tee | ++------------------+------------------------------------------+ +| ``ACS_BULLET`` | bullet | ++------------------+------------------------------------------+ +| ``ACS_CKBOARD`` | checker board (stipple) | ++------------------+------------------------------------------+ +| ``ACS_DARROW`` | arrow pointing down | ++------------------+------------------------------------------+ +| ``ACS_DEGREE`` | degree symbol | ++------------------+------------------------------------------+ +| ``ACS_DIAMOND`` | diamond | ++------------------+------------------------------------------+ +| ``ACS_GEQUAL`` | greater-than-or-equal-to | ++------------------+------------------------------------------+ +| ``ACS_HLINE`` | horizontal line | ++------------------+------------------------------------------+ +| ``ACS_LANTERN`` | lantern symbol | ++------------------+------------------------------------------+ +| ``ACS_LARROW`` | left arrow | ++------------------+------------------------------------------+ +| ``ACS_LEQUAL`` | less-than-or-equal-to | ++------------------+------------------------------------------+ +| ``ACS_LLCORNER`` | lower left-hand corner | ++------------------+------------------------------------------+ +| ``ACS_LRCORNER`` | lower right-hand corner | ++------------------+------------------------------------------+ +| ``ACS_LTEE`` | left tee | ++------------------+------------------------------------------+ +| ``ACS_NEQUAL`` | not-equal sign | ++------------------+------------------------------------------+ +| ``ACS_PI`` | letter pi | ++------------------+------------------------------------------+ +| ``ACS_PLMINUS`` | plus-or-minus sign | ++------------------+------------------------------------------+ +| ``ACS_PLUS`` | big plus sign | ++------------------+------------------------------------------+ +| ``ACS_RARROW`` | right arrow | ++------------------+------------------------------------------+ +| ``ACS_RTEE`` | right tee | ++------------------+------------------------------------------+ +| ``ACS_S1`` | scan line 1 | ++------------------+------------------------------------------+ +| ``ACS_S3`` | scan line 3 | ++------------------+------------------------------------------+ +| ``ACS_S7`` | scan line 7 | ++------------------+------------------------------------------+ +| ``ACS_S9`` | scan line 9 | ++------------------+------------------------------------------+ +| ``ACS_SBBS`` | alternate name for lower right corner | ++------------------+------------------------------------------+ +| ``ACS_SBSB`` | alternate name for vertical line | ++------------------+------------------------------------------+ +| ``ACS_SBSS`` | alternate name for right tee | ++------------------+------------------------------------------+ +| ``ACS_SSBB`` | alternate name for lower left corner | ++------------------+------------------------------------------+ +| ``ACS_SSBS`` | alternate name for bottom tee | ++------------------+------------------------------------------+ +| ``ACS_SSSB`` | alternate name for left tee | ++------------------+------------------------------------------+ +| ``ACS_SSSS`` | alternate name for crossover or big plus | ++------------------+------------------------------------------+ +| ``ACS_STERLING`` | pound sterling | ++------------------+------------------------------------------+ +| ``ACS_TTEE`` | top tee | ++------------------+------------------------------------------+ +| ``ACS_UARROW`` | up arrow | ++------------------+------------------------------------------+ +| ``ACS_ULCORNER`` | upper left corner | ++------------------+------------------------------------------+ +| ``ACS_URCORNER`` | upper right corner | ++------------------+------------------------------------------+ +| ``ACS_VLINE`` | vertical line | ++------------------+------------------------------------------+ + +The following table lists the predefined colors: + ++-------------------+----------------------------+ +| Constant | Color | ++===================+============================+ +| ``COLOR_BLACK`` | Black | ++-------------------+----------------------------+ +| ``COLOR_BLUE`` | Blue | ++-------------------+----------------------------+ +| ``COLOR_CYAN`` | Cyan (light greenish blue) | ++-------------------+----------------------------+ +| ``COLOR_GREEN`` | Green | ++-------------------+----------------------------+ +| ``COLOR_MAGENTA`` | Magenta (purplish red) | ++-------------------+----------------------------+ +| ``COLOR_RED`` | Red | ++-------------------+----------------------------+ +| ``COLOR_WHITE`` | White | ++-------------------+----------------------------+ +| ``COLOR_YELLOW`` | Yellow | ++-------------------+----------------------------+ + + +:mod:`curses.textpad` --- Text input widget for curses programs +=============================================================== + +.. module:: curses.textpad + :synopsis: Emacs-like input editing in a curses window. +.. moduleauthor:: Eric Raymond +.. sectionauthor:: Eric Raymond + + +.. versionadded:: 1.6 + +The :mod:`curses.textpad` module provides a :class:`Textbox` class that handles +elementary text editing in a curses window, supporting a set of keybindings +resembling those of Emacs (thus, also of Netscape Navigator, BBedit 6.x, +FrameMaker, and many other programs). The module also provides a +rectangle-drawing function useful for framing text boxes or for other purposes. + +The module :mod:`curses.textpad` defines the following function: + + +.. function:: rectangle(win, uly, ulx, lry, lrx) + + Draw a rectangle. The first argument must be a window object; the remaining + arguments are coordinates relative to that window. The second and third + arguments are the y and x coordinates of the upper left hand corner of the + rectangle to be drawn; the fourth and fifth arguments are the y and x + coordinates of the lower right hand corner. The rectangle will be drawn using + VT100/IBM PC forms characters on terminals that make this possible (including + xterm and most other software terminal emulators). Otherwise it will be drawn + with ASCII dashes, vertical bars, and plus signs. + + +.. _curses-textpad-objects: + +Textbox objects +--------------- + +You can instantiate a :class:`Textbox` object as follows: + + +.. class:: Textbox(win) + + Return a textbox widget object. The *win* argument should be a curses + :class:`WindowObject` in which the textbox is to be contained. The edit cursor + of the textbox is initially located at the upper left hand corner of the + containing window, with coordinates ``(0, 0)``. The instance's + :attr:`stripspaces` flag is initially on. + +:class:`Textbox` objects have the following methods: + + +.. method:: Textbox.edit([validator]) + + This is the entry point you will normally use. It accepts editing keystrokes + until one of the termination keystrokes is entered. If *validator* is supplied, + it must be a function. It will be called for each keystroke entered with the + keystroke as a parameter; command dispatch is done on the result. This method + returns the window contents as a string; whether blanks in the window are + included is affected by the :attr:`stripspaces` member. + + +.. method:: Textbox.do_command(ch) + + Process a single command keystroke. Here are the supported special keystrokes: + + +------------------+-------------------------------------------+ + | Keystroke | Action | + +==================+===========================================+ + | :kbd:`Control-A` | Go to left edge of window. | + +------------------+-------------------------------------------+ + | :kbd:`Control-B` | Cursor left, wrapping to previous line if | + | | appropriate. | + +------------------+-------------------------------------------+ + | :kbd:`Control-D` | Delete character under cursor. | + +------------------+-------------------------------------------+ + | :kbd:`Control-E` | Go to right edge (stripspaces off) or end | + | | of line (stripspaces on). | + +------------------+-------------------------------------------+ + | :kbd:`Control-F` | Cursor right, wrapping to next line when | + | | appropriate. | + +------------------+-------------------------------------------+ + | :kbd:`Control-G` | Terminate, returning the window contents. | + +------------------+-------------------------------------------+ + | :kbd:`Control-H` | Delete character backward. | + +------------------+-------------------------------------------+ + | :kbd:`Control-J` | Terminate if the window is 1 line, | + | | otherwise insert newline. | + +------------------+-------------------------------------------+ + | :kbd:`Control-K` | If line is blank, delete it, otherwise | + | | clear to end of line. | + +------------------+-------------------------------------------+ + | :kbd:`Control-L` | Refresh screen. | + +------------------+-------------------------------------------+ + | :kbd:`Control-N` | Cursor down; move down one line. | + +------------------+-------------------------------------------+ + | :kbd:`Control-O` | Insert a blank line at cursor location. | + +------------------+-------------------------------------------+ + | :kbd:`Control-P` | Cursor up; move up one line. | + +------------------+-------------------------------------------+ + + Move operations do nothing if the cursor is at an edge where the movement is not + possible. The following synonyms are supported where possible: + + +------------------------+------------------+ + | Constant | Keystroke | + +========================+==================+ + | :const:`KEY_LEFT` | :kbd:`Control-B` | + +------------------------+------------------+ + | :const:`KEY_RIGHT` | :kbd:`Control-F` | + +------------------------+------------------+ + | :const:`KEY_UP` | :kbd:`Control-P` | + +------------------------+------------------+ + | :const:`KEY_DOWN` | :kbd:`Control-N` | + +------------------------+------------------+ + | :const:`KEY_BACKSPACE` | :kbd:`Control-h` | + +------------------------+------------------+ + + All other keystrokes are treated as a command to insert the given character and + move right (with line wrapping). + + +.. method:: Textbox.gather() + + This method returns the window contents as a string; whether blanks in the + window are included is affected by the :attr:`stripspaces` member. + + +.. attribute:: Textbox.stripspaces + + This data member is a flag which controls the interpretation of blanks in the + window. When it is on, trailing blanks on each line are ignored; any cursor + motion that would land the cursor on a trailing blank goes to the end of that + line instead, and trailing blanks are stripped when the window contents are + gathered. + + +:mod:`curses.wrapper` --- Terminal handler for curses programs +============================================================== + +.. module:: curses.wrapper + :synopsis: Terminal configuration wrapper for curses programs. +.. moduleauthor:: Eric Raymond +.. sectionauthor:: Eric Raymond + + +.. versionadded:: 1.6 + +This module supplies one function, :func:`wrapper`, which runs another function +which should be the rest of your curses-using application. If the application +raises an exception, :func:`wrapper` will restore the terminal to a sane state +before re-raising the exception and generating a traceback. + + +.. function:: wrapper(func, ...) + + Wrapper function that initializes curses and calls another function, *func*, + restoring normal keyboard/screen behavior on error. The callable object *func* + is then passed the main window 'stdscr' as its first argument, followed by any + other arguments passed to :func:`wrapper`. + +Before calling the hook function, :func:`wrapper` turns on cbreak mode, turns +off echo, enables the terminal keypad, and initializes colors if the terminal +has color support. On exit (whether normally or by exception) it restores +cooked mode, turns on echo, and disables the terminal keypad. + diff --git a/Doc/library/custominterp.rst b/Doc/library/custominterp.rst new file mode 100644 index 0000000..2a9f0a4 --- /dev/null +++ b/Doc/library/custominterp.rst @@ -0,0 +1,20 @@ + +.. _custominterp: + +************************** +Custom Python Interpreters +************************** + +The modules described in this chapter allow writing interfaces similar to +Python's interactive interpreter. If you want a Python interpreter that +supports some special feature in addition to the Python language, you should +look at the :mod:`code` module. (The :mod:`codeop` module is lower-level, used +to support compiling a possibly-incomplete chunk of Python code.) + +The full list of modules described in this chapter is: + + +.. toctree:: + + code.rst + codeop.rst diff --git a/Doc/library/datatypes.rst b/Doc/library/datatypes.rst new file mode 100644 index 0000000..4cd042d --- /dev/null +++ b/Doc/library/datatypes.rst @@ -0,0 +1,37 @@ + +.. _datatypes: + +********** +Data Types +********** + +The modules described in this chapter provide a variety of specialized data +types such as dates and times, fixed-type arrays, heap queues, synchronized +queues, and sets. + +Python also provides some built-in data types, in particular, +:class:`dict`, :class:`list`, :class:`set` and :class:`frozenset`, and +:class:`tuple`. The :class:`str` class can be used to handle binary data +and 8-bit text, and the :class:`unicode` class to handle Unicode text. + +The following modules are documented in this chapter: + + +.. toctree:: + + datetime.rst + calendar.rst + collections.rst + heapq.rst + bisect.rst + array.rst + sched.rst + mutex.rst + queue.rst + weakref.rst + userdict.rst + types.rst + new.rst + copy.rst + pprint.rst + repr.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst new file mode 100644 index 0000000..24d4f69 --- /dev/null +++ b/Doc/library/datetime.rst @@ -0,0 +1,1348 @@ +.. % XXX what order should the types be discussed in? + + +:mod:`datetime` --- Basic date and time types +============================================= + +.. module:: datetime + :synopsis: Basic date and time types. +.. moduleauthor:: Tim Peters +.. sectionauthor:: Tim Peters +.. sectionauthor:: A.M. Kuchling + + +.. versionadded:: 2.3 + +The :mod:`datetime` module supplies classes for manipulating dates and times in +both simple and complex ways. While date and time arithmetic is supported, the +focus of the implementation is on efficient member extraction for output +formatting and manipulation. For related +functionality, see also the :mod:`time` and :mod:`calendar` modules. + +There are two kinds of date and time objects: "naive" and "aware". This +distinction refers to whether the object has any notion of time zone, daylight +saving time, or other kind of algorithmic or political time adjustment. Whether +a naive :class:`datetime` object represents Coordinated Universal Time (UTC), +local time, or time in some other timezone is purely up to the program, just +like it's up to the program whether a particular number represents metres, +miles, or mass. Naive :class:`datetime` objects are easy to understand and to +work with, at the cost of ignoring some aspects of reality. + +For applications requiring more, :class:`datetime` and :class:`time` objects +have an optional time zone information member, :attr:`tzinfo`, that can contain +an instance of a subclass of the abstract :class:`tzinfo` class. These +:class:`tzinfo` objects capture information about the offset from UTC time, the +time zone name, and whether Daylight Saving Time is in effect. Note that no +concrete :class:`tzinfo` classes are supplied by the :mod:`datetime` module. +Supporting timezones at whatever level of detail is required is up to the +application. The rules for time adjustment across the world are more political +than rational, and there is no standard suitable for every application. + +The :mod:`datetime` module exports the following constants: + + +.. data:: MINYEAR + + The smallest year number allowed in a :class:`date` or :class:`datetime` object. + :const:`MINYEAR` is ``1``. + + +.. data:: MAXYEAR + + The largest year number allowed in a :class:`date` or :class:`datetime` object. + :const:`MAXYEAR` is ``9999``. + + +.. seealso:: + + Module :mod:`calendar` + General calendar related functions. + + Module :mod:`time` + Time access and conversions. + + +Available Types +--------------- + + +.. class:: date + + An idealized naive date, assuming the current Gregorian calendar always was, and + always will be, in effect. Attributes: :attr:`year`, :attr:`month`, and + :attr:`day`. + + +.. class:: time + + An idealized time, independent of any particular day, assuming that every day + has exactly 24\*60\*60 seconds (there is no notion of "leap seconds" here). + Attributes: :attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond`, + and :attr:`tzinfo`. + + +.. class:: datetime + + A combination of a date and a time. Attributes: :attr:`year`, :attr:`month`, + :attr:`day`, :attr:`hour`, :attr:`minute`, :attr:`second`, :attr:`microsecond`, + and :attr:`tzinfo`. + + +.. class:: timedelta + + A duration expressing the difference between two :class:`date`, :class:`time`, + or :class:`datetime` instances to microsecond resolution. + + +.. class:: tzinfo + + An abstract base class for time zone information objects. These are used by the + :class:`datetime` and :class:`time` classes to provide a customizable notion of + time adjustment (for example, to account for time zone and/or daylight saving + time). + +Objects of these types are immutable. + +Objects of the :class:`date` type are always naive. + +An object *d* of type :class:`time` or :class:`datetime` may be naive or aware. +*d* is aware if ``d.tzinfo`` is not ``None`` and ``d.tzinfo.utcoffset(d)`` does +not return ``None``. If ``d.tzinfo`` is ``None``, or if ``d.tzinfo`` is not +``None`` but ``d.tzinfo.utcoffset(d)`` returns ``None``, *d* is naive. + +The distinction between naive and aware doesn't apply to :class:`timedelta` +objects. + +Subclass relationships:: + + object + timedelta + tzinfo + time + date + datetime + + +.. _datetime-timedelta: + +:class:`timedelta` Objects +-------------------------- + +A :class:`timedelta` object represents a duration, the difference between two +dates or times. + + +.. class:: timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) + + All arguments are optional and default to ``0``. Arguments may be ints, longs, + or floats, and may be positive or negative. + + Only *days*, *seconds* and *microseconds* are stored internally. Arguments are + converted to those units: + + * A millisecond is converted to 1000 microseconds. + * A minute is converted to 60 seconds. + * An hour is converted to 3600 seconds. + * A week is converted to 7 days. + + and days, seconds and microseconds are then normalized so that the + representation is unique, with + + * ``0 <= microseconds < 1000000`` + * ``0 <= seconds < 3600*24`` (the number of seconds in one day) + * ``-999999999 <= days <= 999999999`` + + If any argument is a float and there are fractional microseconds, the fractional + microseconds left over from all arguments are combined and their sum is rounded + to the nearest microsecond. If no argument is a float, the conversion and + normalization processes are exact (no information is lost). + + If the normalized value of days lies outside the indicated range, + :exc:`OverflowError` is raised. + + Note that normalization of negative values may be surprising at first. For + example, :: + + >>> d = timedelta(microseconds=-1) + >>> (d.days, d.seconds, d.microseconds) + (-1, 86399, 999999) + +Class attributes are: + + +.. attribute:: timedelta.min + + The most negative :class:`timedelta` object, ``timedelta(-999999999)``. + + +.. attribute:: timedelta.max + + The most positive :class:`timedelta` object, ``timedelta(days=999999999, + hours=23, minutes=59, seconds=59, microseconds=999999)``. + + +.. attribute:: timedelta.resolution + + The smallest possible difference between non-equal :class:`timedelta` objects, + ``timedelta(microseconds=1)``. + +Note that, because of normalization, ``timedelta.max`` > ``-timedelta.min``. +``-timedelta.max`` is not representable as a :class:`timedelta` object. + +Instance attributes (read-only): + ++------------------+--------------------------------------------+ +| Attribute | Value | ++==================+============================================+ +| ``days`` | Between -999999999 and 999999999 inclusive | ++------------------+--------------------------------------------+ +| ``seconds`` | Between 0 and 86399 inclusive | ++------------------+--------------------------------------------+ +| ``microseconds`` | Between 0 and 999999 inclusive | ++------------------+--------------------------------------------+ + +Supported operations: + +.. % XXX this table is too wide! + ++--------------------------------+-----------------------------------------------+ +| Operation | Result | ++================================+===============================================+ +| ``t1 = t2 + t3`` | Sum of *t2* and *t3*. Afterwards *t1*-*t2* == | +| | *t3* and *t1*-*t3* == *t2* are true. (1) | ++--------------------------------+-----------------------------------------------+ +| ``t1 = t2 - t3`` | Difference of *t2* and *t3*. Afterwards *t1* | +| | == *t2* - *t3* and *t2* == *t1* + *t3* are | +| | true. (1) | ++--------------------------------+-----------------------------------------------+ +| ``t1 = t2 * i or t1 = i * t2`` | Delta multiplied by an integer or long. | +| | Afterwards *t1* // i == *t2* is true, | +| | provided ``i != 0``. | ++--------------------------------+-----------------------------------------------+ +| | In general, *t1* \* i == *t1* \* (i-1) + *t1* | +| | is true. (1) | ++--------------------------------+-----------------------------------------------+ +| ``t1 = t2 // i`` | The floor is computed and the remainder (if | +| | any) is thrown away. (3) | ++--------------------------------+-----------------------------------------------+ +| ``+t1`` | Returns a :class:`timedelta` object with the | +| | same value. (2) | ++--------------------------------+-----------------------------------------------+ +| ``-t1`` | equivalent to :class:`timedelta`\ | +| | (-*t1.days*, -*t1.seconds*, | +| | -*t1.microseconds*), and to *t1*\* -1. (1)(4) | ++--------------------------------+-----------------------------------------------+ +| ``abs(t)`` | equivalent to +*t* when ``t.days >= 0``, and | +| | to -*t* when ``t.days < 0``. (2) | ++--------------------------------+-----------------------------------------------+ + +Notes: + +(1) + This is exact, but may overflow. + +(2) + This is exact, and cannot overflow. + +(3) + Division by 0 raises :exc:`ZeroDivisionError`. + +(4) + -*timedelta.max* is not representable as a :class:`timedelta` object. + +In addition to the operations listed above :class:`timedelta` objects support +certain additions and subtractions with :class:`date` and :class:`datetime` +objects (see below). + +Comparisons of :class:`timedelta` objects are supported with the +:class:`timedelta` object representing the smaller duration considered to be the +smaller timedelta. In order to stop mixed-type comparisons from falling back to +the default comparison by object address, when a :class:`timedelta` object is +compared to an object of a different type, :exc:`TypeError` is raised unless the +comparison is ``==`` or ``!=``. The latter cases return :const:`False` or +:const:`True`, respectively. + +:class:`timedelta` objects are hashable (usable as dictionary keys), support +efficient pickling, and in Boolean contexts, a :class:`timedelta` object is +considered to be true if and only if it isn't equal to ``timedelta(0)``. + + +.. _datetime-date: + +:class:`date` Objects +--------------------- + +A :class:`date` object represents a date (year, month and day) in an idealized +calendar, the current Gregorian calendar indefinitely extended in both +directions. January 1 of year 1 is called day number 1, January 2 of year 1 is +called day number 2, and so on. This matches the definition of the "proleptic +Gregorian" calendar in Dershowitz and Reingold's book Calendrical Calculations, +where it's the base calendar for all computations. See the book for algorithms +for converting between proleptic Gregorian ordinals and many other calendar +systems. + + +.. class:: date(year, month, day) + + All arguments are required. Arguments may be ints or longs, in the following + ranges: + + * ``MINYEAR <= year <= MAXYEAR`` + * ``1 <= month <= 12`` + * ``1 <= day <= number of days in the given month and year`` + + If an argument outside those ranges is given, :exc:`ValueError` is raised. + +Other constructors, all class methods: + + +.. method:: date.today() + + Return the current local date. This is equivalent to + ``date.fromtimestamp(time.time())``. + + +.. method:: date.fromtimestamp(timestamp) + + Return the local date corresponding to the POSIX timestamp, such as is returned + by :func:`time.time`. This may raise :exc:`ValueError`, if the timestamp is out + of the range of values supported by the platform C :cfunc:`localtime` function. + It's common for this to be restricted to years from 1970 through 2038. Note + that on non-POSIX systems that include leap seconds in their notion of a + timestamp, leap seconds are ignored by :meth:`fromtimestamp`. + + +.. method:: date.fromordinal(ordinal) + + Return the date corresponding to the proleptic Gregorian ordinal, where January + 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= + date.max.toordinal()``. For any date *d*, ``date.fromordinal(d.toordinal()) == + d``. + +Class attributes: + + +.. attribute:: date.min + + The earliest representable date, ``date(MINYEAR, 1, 1)``. + + +.. attribute:: date.max + + The latest representable date, ``date(MAXYEAR, 12, 31)``. + + +.. attribute:: date.resolution + + The smallest possible difference between non-equal date objects, + ``timedelta(days=1)``. + +Instance attributes (read-only): + + +.. attribute:: date.year + + Between :const:`MINYEAR` and :const:`MAXYEAR` inclusive. + + +.. attribute:: date.month + + Between 1 and 12 inclusive. + + +.. attribute:: date.day + + Between 1 and the number of days in the given month of the given year. + +Supported operations: + ++-------------------------------+----------------------------------------------+ +| Operation | Result | ++===============================+==============================================+ +| ``date2 = date1 + timedelta`` | *date2* is ``timedelta.days`` days removed | +| | from *date1*. (1) | ++-------------------------------+----------------------------------------------+ +| ``date2 = date1 - timedelta`` | Computes *date2* such that ``date2 + | +| | timedelta == date1``. (2) | ++-------------------------------+----------------------------------------------+ +| ``timedelta = date1 - date2`` | \(3) | ++-------------------------------+----------------------------------------------+ +| ``date1 < date2`` | *date1* is considered less than *date2* when | +| | *date1* precedes *date2* in time. (4) | ++-------------------------------+----------------------------------------------+ + +Notes: + +(1) + *date2* is moved forward in time if ``timedelta.days > 0``, or backward if + ``timedelta.days < 0``. Afterward ``date2 - date1 == timedelta.days``. + ``timedelta.seconds`` and ``timedelta.microseconds`` are ignored. + :exc:`OverflowError` is raised if ``date2.year`` would be smaller than + :const:`MINYEAR` or larger than :const:`MAXYEAR`. + +(2) + This isn't quite equivalent to date1 + (-timedelta), because -timedelta in + isolation can overflow in cases where date1 - timedelta does not. + ``timedelta.seconds`` and ``timedelta.microseconds`` are ignored. + +(3) + This is exact, and cannot overflow. timedelta.seconds and + timedelta.microseconds are 0, and date2 + timedelta == date1 after. + +(4) + In other words, ``date1 < date2`` if and only if ``date1.toordinal() < + date2.toordinal()``. In order to stop comparison from falling back to the + default scheme of comparing object addresses, date comparison normally raises + :exc:`TypeError` if the other comparand isn't also a :class:`date` object. + However, ``NotImplemented`` is returned instead if the other comparand has a + :meth:`timetuple` attribute. This hook gives other kinds of date objects a + chance at implementing mixed-type comparison. If not, when a :class:`date` + object is compared to an object of a different type, :exc:`TypeError` is raised + unless the comparison is ``==`` or ``!=``. The latter cases return + :const:`False` or :const:`True`, respectively. + +Dates can be used as dictionary keys. In Boolean contexts, all :class:`date` +objects are considered to be true. + +Instance methods: + + +.. method:: date.replace(year, month, day) + + Return a date with the same value, except for those members given new values by + whichever keyword arguments are specified. For example, if ``d == date(2002, + 12, 31)``, then ``d.replace(day=26) == date(2002, 12, 26)``. + + +.. method:: date.timetuple() + + Return a :class:`time.struct_time` such as returned by :func:`time.localtime`. + The hours, minutes and seconds are 0, and the DST flag is -1. ``d.timetuple()`` + is equivalent to ``time.struct_time((d.year, d.month, d.day, 0, 0, 0, + d.weekday(), d.toordinal() - date(d.year, 1, 1).toordinal() + 1, -1))`` + + +.. method:: date.toordinal() + + Return the proleptic Gregorian ordinal of the date, where January 1 of year 1 + has ordinal 1. For any :class:`date` object *d*, + ``date.fromordinal(d.toordinal()) == d``. + + +.. method:: date.weekday() + + Return the day of the week as an integer, where Monday is 0 and Sunday is 6. + For example, ``date(2002, 12, 4).weekday() == 2``, a Wednesday. See also + :meth:`isoweekday`. + + +.. method:: date.isoweekday() + + Return the day of the week as an integer, where Monday is 1 and Sunday is 7. + For example, ``date(2002, 12, 4).isoweekday() == 3``, a Wednesday. See also + :meth:`weekday`, :meth:`isocalendar`. + + +.. method:: date.isocalendar() + + Return a 3-tuple, (ISO year, ISO week number, ISO weekday). + + The ISO calendar is a widely used variant of the Gregorian calendar. See + http://www.phys.uu.nl/ vgent/calendar/isocalendar.htm for a good explanation. + + The ISO year consists of 52 or 53 full weeks, and where a week starts on a + Monday and ends on a Sunday. The first week of an ISO year is the first + (Gregorian) calendar week of a year containing a Thursday. This is called week + number 1, and the ISO year of that Thursday is the same as its Gregorian year. + + For example, 2004 begins on a Thursday, so the first week of ISO year 2004 + begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004, so that + ``date(2003, 12, 29).isocalendar() == (2004, 1, 1)`` and ``date(2004, 1, + 4).isocalendar() == (2004, 1, 7)``. + + +.. method:: date.isoformat() + + Return a string representing the date in ISO 8601 format, 'YYYY-MM-DD'. For + example, ``date(2002, 12, 4).isoformat() == '2002-12-04'``. + + +.. method:: date.__str__() + + For a date *d*, ``str(d)`` is equivalent to ``d.isoformat()``. + + +.. method:: date.ctime() + + Return a string representing the date, for example ``date(2002, 12, + 4).ctime() == 'Wed Dec 4 00:00:00 2002'``. ``d.ctime()`` is equivalent to + ``time.ctime(time.mktime(d.timetuple()))`` on platforms where the native C + :cfunc:`ctime` function (which :func:`time.ctime` invokes, but which + :meth:`date.ctime` does not invoke) conforms to the C standard. + + +.. method:: date.strftime(format) + + Return a string representing the date, controlled by an explicit format string. + Format codes referring to hours, minutes or seconds will see 0 values. See + section :ref:`strftime-behavior`. + + +.. _datetime-datetime: + +:class:`datetime` Objects +------------------------- + +A :class:`datetime` object is a single object containing all the information +from a :class:`date` object and a :class:`time` object. Like a :class:`date` +object, :class:`datetime` assumes the current Gregorian calendar extended in +both directions; like a time object, :class:`datetime` assumes there are exactly +3600\*24 seconds in every day. + +Constructor: + + +.. class:: datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]) + + The year, month and day arguments are required. *tzinfo* may be ``None``, or an + instance of a :class:`tzinfo` subclass. The remaining arguments may be ints or + longs, in the following ranges: + + * ``MINYEAR <= year <= MAXYEAR`` + * ``1 <= month <= 12`` + * ``1 <= day <= number of days in the given month and year`` + * ``0 <= hour < 24`` + * ``0 <= minute < 60`` + * ``0 <= second < 60`` + * ``0 <= microsecond < 1000000`` + + If an argument outside those ranges is given, :exc:`ValueError` is raised. + +Other constructors, all class methods: + + +.. method:: datetime.today() + + Return the current local datetime, with :attr:`tzinfo` ``None``. This is + equivalent to ``datetime.fromtimestamp(time.time())``. See also :meth:`now`, + :meth:`fromtimestamp`. + + +.. method:: datetime.now([tz]) + + Return the current local date and time. If optional argument *tz* is ``None`` + or not specified, this is like :meth:`today`, but, if possible, supplies more + precision than can be gotten from going through a :func:`time.time` timestamp + (for example, this may be possible on platforms supplying the C + :cfunc:`gettimeofday` function). + + Else *tz* must be an instance of a class :class:`tzinfo` subclass, and the + current date and time are converted to *tz*'s time zone. In this case the + result is equivalent to ``tz.fromutc(datetime.utcnow().replace(tzinfo=tz))``. + See also :meth:`today`, :meth:`utcnow`. + + +.. method:: datetime.utcnow() + + Return the current UTC date and time, with :attr:`tzinfo` ``None``. This is like + :meth:`now`, but returns the current UTC date and time, as a naive + :class:`datetime` object. See also :meth:`now`. + + +.. method:: datetime.fromtimestamp(timestamp[, tz]) + + Return the local date and time corresponding to the POSIX timestamp, such as is + returned by :func:`time.time`. If optional argument *tz* is ``None`` or not + specified, the timestamp is converted to the platform's local date and time, and + the returned :class:`datetime` object is naive. + + Else *tz* must be an instance of a class :class:`tzinfo` subclass, and the + timestamp is converted to *tz*'s time zone. In this case the result is + equivalent to + ``tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))``. + + :meth:`fromtimestamp` may raise :exc:`ValueError`, if the timestamp is out of + the range of values supported by the platform C :cfunc:`localtime` or + :cfunc:`gmtime` functions. It's common for this to be restricted to years in + 1970 through 2038. Note that on non-POSIX systems that include leap seconds in + their notion of a timestamp, leap seconds are ignored by :meth:`fromtimestamp`, + and then it's possible to have two timestamps differing by a second that yield + identical :class:`datetime` objects. See also :meth:`utcfromtimestamp`. + + +.. method:: datetime.utcfromtimestamp(timestamp) + + Return the UTC :class:`datetime` corresponding to the POSIX timestamp, with + :attr:`tzinfo` ``None``. This may raise :exc:`ValueError`, if the timestamp is + out of the range of values supported by the platform C :cfunc:`gmtime` function. + It's common for this to be restricted to years in 1970 through 2038. See also + :meth:`fromtimestamp`. + + +.. method:: datetime.fromordinal(ordinal) + + Return the :class:`datetime` corresponding to the proleptic Gregorian ordinal, + where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 + <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and + microsecond of the result are all 0, and :attr:`tzinfo` is ``None``. + + +.. method:: datetime.combine(date, time) + + Return a new :class:`datetime` object whose date members are equal to the given + :class:`date` object's, and whose time and :attr:`tzinfo` members are equal to + the given :class:`time` object's. For any :class:`datetime` object *d*, ``d == + datetime.combine(d.date(), d.timetz())``. If date is a :class:`datetime` + object, its time and :attr:`tzinfo` members are ignored. + + +.. method:: datetime.strptime(date_string, format) + + Return a :class:`datetime` corresponding to *date_string*, parsed according to + *format*. This is equivalent to ``datetime(*(time.strptime(date_string, + format)[0:6]))``. :exc:`ValueError` is raised if the date_string and format + can't be parsed by :func:`time.strptime` or if it returns a value which isn't a + time tuple. + + .. versionadded:: 2.5 + +Class attributes: + + +.. attribute:: datetime.min + + The earliest representable :class:`datetime`, ``datetime(MINYEAR, 1, 1, + tzinfo=None)``. + + +.. attribute:: datetime.max + + The latest representable :class:`datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, + 59, 999999, tzinfo=None)``. + + +.. attribute:: datetime.resolution + + The smallest possible difference between non-equal :class:`datetime` objects, + ``timedelta(microseconds=1)``. + +Instance attributes (read-only): + + +.. attribute:: datetime.year + + Between :const:`MINYEAR` and :const:`MAXYEAR` inclusive. + + +.. attribute:: datetime.month + + Between 1 and 12 inclusive. + + +.. attribute:: datetime.day + + Between 1 and the number of days in the given month of the given year. + + +.. attribute:: datetime.hour + + In ``range(24)``. + + +.. attribute:: datetime.minute + + In ``range(60)``. + + +.. attribute:: datetime.second + + In ``range(60)``. + + +.. attribute:: datetime.microsecond + + In ``range(1000000)``. + + +.. attribute:: datetime.tzinfo + + The object passed as the *tzinfo* argument to the :class:`datetime` constructor, + or ``None`` if none was passed. + +Supported operations: + ++---------------------------------------+-------------------------------+ +| Operation | Result | ++=======================================+===============================+ +| ``datetime2 = datetime1 + timedelta`` | \(1) | ++---------------------------------------+-------------------------------+ +| ``datetime2 = datetime1 - timedelta`` | \(2) | ++---------------------------------------+-------------------------------+ +| ``timedelta = datetime1 - datetime2`` | \(3) | ++---------------------------------------+-------------------------------+ +| ``datetime1 < datetime2`` | Compares :class:`datetime` to | +| | :class:`datetime`. (4) | ++---------------------------------------+-------------------------------+ + +(1) + datetime2 is a duration of timedelta removed from datetime1, moving forward in + time if ``timedelta.days`` > 0, or backward if ``timedelta.days`` < 0. The + result has the same :attr:`tzinfo` member as the input datetime, and datetime2 - + datetime1 == timedelta after. :exc:`OverflowError` is raised if datetime2.year + would be smaller than :const:`MINYEAR` or larger than :const:`MAXYEAR`. Note + that no time zone adjustments are done even if the input is an aware object. + +(2) + Computes the datetime2 such that datetime2 + timedelta == datetime1. As for + addition, the result has the same :attr:`tzinfo` member as the input datetime, + and no time zone adjustments are done even if the input is aware. This isn't + quite equivalent to datetime1 + (-timedelta), because -timedelta in isolation + can overflow in cases where datetime1 - timedelta does not. + +(3) + Subtraction of a :class:`datetime` from a :class:`datetime` is defined only if + both operands are naive, or if both are aware. If one is aware and the other is + naive, :exc:`TypeError` is raised. + + If both are naive, or both are aware and have the same :attr:`tzinfo` member, + the :attr:`tzinfo` members are ignored, and the result is a :class:`timedelta` + object *t* such that ``datetime2 + t == datetime1``. No time zone adjustments + are done in this case. + + If both are aware and have different :attr:`tzinfo` members, ``a-b`` acts as if + *a* and *b* were first converted to naive UTC datetimes first. The result is + ``(a.replace(tzinfo=None) - a.utcoffset()) - (b.replace(tzinfo=None) - + b.utcoffset())`` except that the implementation never overflows. + +(4) + *datetime1* is considered less than *datetime2* when *datetime1* precedes + *datetime2* in time. + + If one comparand is naive and the other is aware, :exc:`TypeError` is raised. + If both comparands are aware, and have the same :attr:`tzinfo` member, the + common :attr:`tzinfo` member is ignored and the base datetimes are compared. If + both comparands are aware and have different :attr:`tzinfo` members, the + comparands are first adjusted by subtracting their UTC offsets (obtained from + ``self.utcoffset()``). + + .. note:: + + In order to stop comparison from falling back to the default scheme of comparing + object addresses, datetime comparison normally raises :exc:`TypeError` if the + other comparand isn't also a :class:`datetime` object. However, + ``NotImplemented`` is returned instead if the other comparand has a + :meth:`timetuple` attribute. This hook gives other kinds of date objects a + chance at implementing mixed-type comparison. If not, when a :class:`datetime` + object is compared to an object of a different type, :exc:`TypeError` is raised + unless the comparison is ``==`` or ``!=``. The latter cases return + :const:`False` or :const:`True`, respectively. + +:class:`datetime` objects can be used as dictionary keys. In Boolean contexts, +all :class:`datetime` objects are considered to be true. + +Instance methods: + + +.. method:: datetime.date() + + Return :class:`date` object with same year, month and day. + + +.. method:: datetime.time() + + Return :class:`time` object with same hour, minute, second and microsecond. + :attr:`tzinfo` is ``None``. See also method :meth:`timetz`. + + +.. method:: datetime.timetz() + + Return :class:`time` object with same hour, minute, second, microsecond, and + tzinfo members. See also method :meth:`time`. + + +.. method:: datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) + + Return a datetime with the same members, except for those members given new + values by whichever keyword arguments are specified. Note that ``tzinfo=None`` + can be specified to create a naive datetime from an aware datetime with no + conversion of date and time members. + + +.. method:: datetime.astimezone(tz) + + Return a :class:`datetime` object with new :attr:`tzinfo` member *tz*, adjusting + the date and time members so the result is the same UTC time as *self*, but in + *tz*'s local time. + + *tz* must be an instance of a :class:`tzinfo` subclass, and its + :meth:`utcoffset` and :meth:`dst` methods must not return ``None``. *self* must + be aware (``self.tzinfo`` must not be ``None``, and ``self.utcoffset()`` must + not return ``None``). + + If ``self.tzinfo`` is *tz*, ``self.astimezone(tz)`` is equal to *self*: no + adjustment of date or time members is performed. Else the result is local time + in time zone *tz*, representing the same UTC time as *self*: after ``astz = + dt.astimezone(tz)``, ``astz - astz.utcoffset()`` will usually have the same date + and time members as ``dt - dt.utcoffset()``. The discussion of class + :class:`tzinfo` explains the cases at Daylight Saving Time transition boundaries + where this cannot be achieved (an issue only if *tz* models both standard and + daylight time). + + If you merely want to attach a time zone object *tz* to a datetime *dt* without + adjustment of date and time members, use ``dt.replace(tzinfo=tz)``. If you + merely want to remove the time zone object from an aware datetime *dt* without + conversion of date and time members, use ``dt.replace(tzinfo=None)``. + + Note that the default :meth:`tzinfo.fromutc` method can be overridden in a + :class:`tzinfo` subclass to affect the result returned by :meth:`astimezone`. + Ignoring error cases, :meth:`astimezone` acts like:: + + def astimezone(self, tz): + if self.tzinfo is tz: + return self + # Convert self to UTC, and attach the new time zone object. + utc = (self - self.utcoffset()).replace(tzinfo=tz) + # Convert from UTC to tz's local time. + return tz.fromutc(utc) + + +.. method:: datetime.utcoffset() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.utcoffset(self)``, and raises an exception if the latter doesn't + return ``None``, or a :class:`timedelta` object representing a whole number of + minutes with magnitude less than one day. + + +.. method:: datetime.dst() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.dst(self)``, and raises an exception if the latter doesn't return + ``None``, or a :class:`timedelta` object representing a whole number of minutes + with magnitude less than one day. + + +.. method:: datetime.tzname() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.tzname(self)``, raises an exception if the latter doesn't return + ``None`` or a string object, + + +.. method:: datetime.timetuple() + + Return a :class:`time.struct_time` such as returned by :func:`time.localtime`. + ``d.timetuple()`` is equivalent to ``time.struct_time((d.year, d.month, d.day, + d.hour, d.minute, d.second, d.weekday(), d.toordinal() - date(d.year, 1, + 1).toordinal() + 1, dst))`` The :attr:`tm_isdst` flag of the result is set + according to the :meth:`dst` method: :attr:`tzinfo` is ``None`` or :meth:`dst` + returns ``None``, :attr:`tm_isdst` is set to ``-1``; else if :meth:`dst` + returns a non-zero value, :attr:`tm_isdst` is set to ``1``; else ``tm_isdst`` is + set to ``0``. + + +.. method:: datetime.utctimetuple() + + If :class:`datetime` instance *d* is naive, this is the same as + ``d.timetuple()`` except that :attr:`tm_isdst` is forced to 0 regardless of what + ``d.dst()`` returns. DST is never in effect for a UTC time. + + If *d* is aware, *d* is normalized to UTC time, by subtracting + ``d.utcoffset()``, and a :class:`time.struct_time` for the normalized time is + returned. :attr:`tm_isdst` is forced to 0. Note that the result's + :attr:`tm_year` member may be :const:`MINYEAR`\ -1 or :const:`MAXYEAR`\ +1, if + *d*.year was ``MINYEAR`` or ``MAXYEAR`` and UTC adjustment spills over a year + boundary. + + +.. method:: datetime.toordinal() + + Return the proleptic Gregorian ordinal of the date. The same as + ``self.date().toordinal()``. + + +.. method:: datetime.weekday() + + Return the day of the week as an integer, where Monday is 0 and Sunday is 6. + The same as ``self.date().weekday()``. See also :meth:`isoweekday`. + + +.. method:: datetime.isoweekday() + + Return the day of the week as an integer, where Monday is 1 and Sunday is 7. + The same as ``self.date().isoweekday()``. See also :meth:`weekday`, + :meth:`isocalendar`. + + +.. method:: datetime.isocalendar() + + Return a 3-tuple, (ISO year, ISO week number, ISO weekday). The same as + ``self.date().isocalendar()``. + + +.. method:: datetime.isoformat([sep]) + + Return a string representing the date and time in ISO 8601 format, + YYYY-MM-DDTHH:MM:SS.mmmmmm or, if :attr:`microsecond` is 0, + YYYY-MM-DDTHH:MM:SS + + If :meth:`utcoffset` does not return ``None``, a 6-character string is + appended, giving the UTC offset in (signed) hours and minutes: + YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if :attr:`microsecond` is 0 + YYYY-MM-DDTHH:MM:SS+HH:MM + + The optional argument *sep* (default ``'T'``) is a one-character separator, + placed between the date and time portions of the result. For example, :: + + >>> from datetime import tzinfo, timedelta, datetime + >>> class TZ(tzinfo): + ... def utcoffset(self, dt): return timedelta(minutes=-399) + ... + >>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ') + '2002-12-25 00:00:00-06:39' + + +.. method:: datetime.__str__() + + For a :class:`datetime` instance *d*, ``str(d)`` is equivalent to + ``d.isoformat(' ')``. + + +.. method:: datetime.ctime() + + Return a string representing the date and time, for example ``datetime(2002, 12, + 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'``. ``d.ctime()`` is + equivalent to ``time.ctime(time.mktime(d.timetuple()))`` on platforms where the + native C :cfunc:`ctime` function (which :func:`time.ctime` invokes, but which + :meth:`datetime.ctime` does not invoke) conforms to the C standard. + + +.. method:: datetime.strftime(format) + + Return a string representing the date and time, controlled by an explicit format + string. See section :ref:`strftime-behavior`. + + +.. _datetime-time: + +:class:`time` Objects +--------------------- + +A time object represents a (local) time of day, independent of any particular +day, and subject to adjustment via a :class:`tzinfo` object. + + +.. class:: time(hour[, minute[, second[, microsecond[, tzinfo]]]]) + + All arguments are optional. *tzinfo* may be ``None``, or an instance of a + :class:`tzinfo` subclass. The remaining arguments may be ints or longs, in the + following ranges: + + * ``0 <= hour < 24`` + * ``0 <= minute < 60`` + * ``0 <= second < 60`` + * ``0 <= microsecond < 1000000``. + + If an argument outside those ranges is given, :exc:`ValueError` is raised. All + default to ``0`` except *tzinfo*, which defaults to :const:`None`. + +Class attributes: + + +.. attribute:: time.min + + The earliest representable :class:`time`, ``time(0, 0, 0, 0)``. + + +.. attribute:: time.max + + The latest representable :class:`time`, ``time(23, 59, 59, 999999)``. + + +.. attribute:: time.resolution + + The smallest possible difference between non-equal :class:`time` objects, + ``timedelta(microseconds=1)``, although note that arithmetic on :class:`time` + objects is not supported. + +Instance attributes (read-only): + + +.. attribute:: time.hour + + In ``range(24)``. + + +.. attribute:: time.minute + + In ``range(60)``. + + +.. attribute:: time.second + + In ``range(60)``. + + +.. attribute:: time.microsecond + + In ``range(1000000)``. + + +.. attribute:: time.tzinfo + + The object passed as the tzinfo argument to the :class:`time` constructor, or + ``None`` if none was passed. + +Supported operations: + +* comparison of :class:`time` to :class:`time`, where *a* is considered less + than *b* when *a* precedes *b* in time. If one comparand is naive and the other + is aware, :exc:`TypeError` is raised. If both comparands are aware, and have + the same :attr:`tzinfo` member, the common :attr:`tzinfo` member is ignored and + the base times are compared. If both comparands are aware and have different + :attr:`tzinfo` members, the comparands are first adjusted by subtracting their + UTC offsets (obtained from ``self.utcoffset()``). In order to stop mixed-type + comparisons from falling back to the default comparison by object address, when + a :class:`time` object is compared to an object of a different type, + :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The + latter cases return :const:`False` or :const:`True`, respectively. + +* hash, use as dict key + +* efficient pickling + +* in Boolean contexts, a :class:`time` object is considered to be true if and + only if, after converting it to minutes and subtracting :meth:`utcoffset` (or + ``0`` if that's ``None``), the result is non-zero. + +Instance methods: + + +.. method:: time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) + + Return a :class:`time` with the same value, except for those members given new + values by whichever keyword arguments are specified. Note that ``tzinfo=None`` + can be specified to create a naive :class:`time` from an aware :class:`time`, + without conversion of the time members. + + +.. method:: time.isoformat() + + Return a string representing the time in ISO 8601 format, HH:MM:SS.mmmmmm or, if + self.microsecond is 0, HH:MM:SS If :meth:`utcoffset` does not return ``None``, a + 6-character string is appended, giving the UTC offset in (signed) hours and + minutes: HH:MM:SS.mmmmmm+HH:MM or, if self.microsecond is 0, HH:MM:SS+HH:MM + + +.. method:: time.__str__() + + For a time *t*, ``str(t)`` is equivalent to ``t.isoformat()``. + + +.. method:: time.strftime(format) + + Return a string representing the time, controlled by an explicit format string. + See section :ref:`strftime-behavior`. + + +.. method:: time.utcoffset() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.utcoffset(None)``, and raises an exception if the latter doesn't + return ``None`` or a :class:`timedelta` object representing a whole number of + minutes with magnitude less than one day. + + +.. method:: time.dst() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.dst(None)``, and raises an exception if the latter doesn't return + ``None``, or a :class:`timedelta` object representing a whole number of minutes + with magnitude less than one day. + + +.. method:: time.tzname() + + If :attr:`tzinfo` is ``None``, returns ``None``, else returns + ``self.tzinfo.tzname(None)``, or raises an exception if the latter doesn't + return ``None`` or a string object. + + +.. _datetime-tzinfo: + +:class:`tzinfo` Objects +----------------------- + +:class:`tzinfo` is an abstract base clase, meaning that this class should not be +instantiated directly. You need to derive a concrete subclass, and (at least) +supply implementations of the standard :class:`tzinfo` methods needed by the +:class:`datetime` methods you use. The :mod:`datetime` module does not supply +any concrete subclasses of :class:`tzinfo`. + +An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the +constructors for :class:`datetime` and :class:`time` objects. The latter objects +view their members as being in local time, and the :class:`tzinfo` object +supports methods revealing offset of local time from UTC, the name of the time +zone, and DST offset, all relative to a date or time object passed to them. + +Special requirement for pickling: A :class:`tzinfo` subclass must have an +:meth:`__init__` method that can be called with no arguments, else it can be +pickled but possibly not unpickled again. This is a technical requirement that +may be relaxed in the future. + +A concrete subclass of :class:`tzinfo` may need to implement the following +methods. Exactly which methods are needed depends on the uses made of aware +:mod:`datetime` objects. If in doubt, simply implement all of them. + + +.. method:: tzinfo.utcoffset(self, dt) + + Return offset of local time from UTC, in minutes east of UTC. If local time is + west of UTC, this should be negative. Note that this is intended to be the + total offset from UTC; for example, if a :class:`tzinfo` object represents both + time zone and DST adjustments, :meth:`utcoffset` should return their sum. If + the UTC offset isn't known, return ``None``. Else the value returned must be a + :class:`timedelta` object specifying a whole number of minutes in the range + -1439 to 1439 inclusive (1440 = 24\*60; the magnitude of the offset must be less + than one day). Most implementations of :meth:`utcoffset` will probably look + like one of these two:: + + return CONSTANT # fixed-offset class + return CONSTANT + self.dst(dt) # daylight-aware class + + If :meth:`utcoffset` does not return ``None``, :meth:`dst` should not return + ``None`` either. + + The default implementation of :meth:`utcoffset` raises + :exc:`NotImplementedError`. + + +.. method:: tzinfo.dst(self, dt) + + Return the daylight saving time (DST) adjustment, in minutes east of UTC, or + ``None`` if DST information isn't known. Return ``timedelta(0)`` if DST is not + in effect. If DST is in effect, return the offset as a :class:`timedelta` object + (see :meth:`utcoffset` for details). Note that DST offset, if applicable, has + already been added to the UTC offset returned by :meth:`utcoffset`, so there's + no need to consult :meth:`dst` unless you're interested in obtaining DST info + separately. For example, :meth:`datetime.timetuple` calls its :attr:`tzinfo` + member's :meth:`dst` method to determine how the :attr:`tm_isdst` flag should be + set, and :meth:`tzinfo.fromutc` calls :meth:`dst` to account for DST changes + when crossing time zones. + + An instance *tz* of a :class:`tzinfo` subclass that models both standard and + daylight times must be consistent in this sense: + + ``tz.utcoffset(dt) - tz.dst(dt)`` + + must return the same result for every :class:`datetime` *dt* with ``dt.tzinfo == + tz`` For sane :class:`tzinfo` subclasses, this expression yields the time + zone's "standard offset", which should not depend on the date or the time, but + only on geographic location. The implementation of :meth:`datetime.astimezone` + relies on this, but cannot detect violations; it's the programmer's + responsibility to ensure it. If a :class:`tzinfo` subclass cannot guarantee + this, it may be able to override the default implementation of + :meth:`tzinfo.fromutc` to work correctly with :meth:`astimezone` regardless. + + Most implementations of :meth:`dst` will probably look like one of these two:: + + def dst(self): + # a fixed-offset class: doesn't account for DST + return timedelta(0) + + or :: + + def dst(self): + # Code to set dston and dstoff to the time zone's DST + # transition times based on the input dt.year, and expressed + # in standard local time. Then + + if dston <= dt.replace(tzinfo=None) < dstoff: + return timedelta(hours=1) + else: + return timedelta(0) + + The default implementation of :meth:`dst` raises :exc:`NotImplementedError`. + + +.. method:: tzinfo.tzname(self, dt) + + Return the time zone name corresponding to the :class:`datetime` object *dt*, as + a string. Nothing about string names is defined by the :mod:`datetime` module, + and there's no requirement that it mean anything in particular. For example, + "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all + valid replies. Return ``None`` if a string name isn't known. Note that this is + a method rather than a fixed string primarily because some :class:`tzinfo` + subclasses will wish to return different names depending on the specific value + of *dt* passed, especially if the :class:`tzinfo` class is accounting for + daylight time. + + The default implementation of :meth:`tzname` raises :exc:`NotImplementedError`. + +These methods are called by a :class:`datetime` or :class:`time` object, in +response to their methods of the same names. A :class:`datetime` object passes +itself as the argument, and a :class:`time` object passes ``None`` as the +argument. A :class:`tzinfo` subclass's methods should therefore be prepared to +accept a *dt* argument of ``None``, or of class :class:`datetime`. + +When ``None`` is passed, it's up to the class designer to decide the best +response. For example, returning ``None`` is appropriate if the class wishes to +say that time objects don't participate in the :class:`tzinfo` protocols. It +may be more useful for ``utcoffset(None)`` to return the standard UTC offset, as +there is no other convention for discovering the standard offset. + +When a :class:`datetime` object is passed in response to a :class:`datetime` +method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can +rely on this, unless user code calls :class:`tzinfo` methods directly. The +intent is that the :class:`tzinfo` methods interpret *dt* as being in local +time, and not need worry about objects in other timezones. + +There is one more :class:`tzinfo` method that a subclass may wish to override: + + +.. method:: tzinfo.fromutc(self, dt) + + This is called from the default :class:`datetime.astimezone()` implementation. + When called from that, ``dt.tzinfo`` is *self*, and *dt*'s date and time members + are to be viewed as expressing a UTC time. The purpose of :meth:`fromutc` is to + adjust the date and time members, returning an equivalent datetime in *self*'s + local time. + + Most :class:`tzinfo` subclasses should be able to inherit the default + :meth:`fromutc` implementation without problems. It's strong enough to handle + fixed-offset time zones, and time zones accounting for both standard and + daylight time, and the latter even if the DST transition times differ in + different years. An example of a time zone the default :meth:`fromutc` + implementation may not handle correctly in all cases is one where the standard + offset (from UTC) depends on the specific date and time passed, which can happen + for political reasons. The default implementations of :meth:`astimezone` and + :meth:`fromutc` may not produce the result you want if the result is one of the + hours straddling the moment the standard offset changes. + + Skipping code for error cases, the default :meth:`fromutc` implementation acts + like:: + + def fromutc(self, dt): + # raise ValueError error if dt.tzinfo is not self + dtoff = dt.utcoffset() + dtdst = dt.dst() + # raise ValueError if dtoff is None or dtdst is None + delta = dtoff - dtdst # this is self's standard offset + if delta: + dt += delta # convert to standard local time + dtdst = dt.dst() + # raise ValueError if dtdst is None + if dtdst: + return dt + dtdst + else: + return dt + +Example :class:`tzinfo` classes: + +.. literalinclude:: ../includes/tzinfo-examples.py + + +Note that there are unavoidable subtleties twice per year in a :class:`tzinfo` +subclass accounting for both standard and daylight time, at the DST transition +points. For concreteness, consider US Eastern (UTC -0500), where EDT begins the +minute after 1:59 (EST) on the first Sunday in April, and ends the minute after +1:59 (EDT) on the last Sunday in October:: + + UTC 3:MM 4:MM 5:MM 6:MM 7:MM 8:MM + EST 22:MM 23:MM 0:MM 1:MM 2:MM 3:MM + EDT 23:MM 0:MM 1:MM 2:MM 3:MM 4:MM + + start 22:MM 23:MM 0:MM 1:MM 3:MM 4:MM + + end 23:MM 0:MM 1:MM 1:MM 2:MM 3:MM + +When DST starts (the "start" line), the local wall clock leaps from 1:59 to +3:00. A wall time of the form 2:MM doesn't really make sense on that day, so +``astimezone(Eastern)`` won't deliver a result with ``hour == 2`` on the day DST +begins. In order for :meth:`astimezone` to make this guarantee, the +:meth:`rzinfo.dst` method must consider times in the "missing hour" (2:MM for +Eastern) to be in daylight time. + +When DST ends (the "end" line), there's a potentially worse problem: there's an +hour that can't be spelled unambiguously in local wall time: the last hour of +daylight time. In Eastern, that's times of the form 5:MM UTC on the day +daylight time ends. The local wall clock leaps from 1:59 (daylight time) back +to 1:00 (standard time) again. Local times of the form 1:MM are ambiguous. +:meth:`astimezone` mimics the local clock's behavior by mapping two adjacent UTC +hours into the same local hour then. In the Eastern example, UTC times of the +form 5:MM and 6:MM both map to 1:MM when converted to Eastern. In order for +:meth:`astimezone` to make this guarantee, the :meth:`tzinfo.dst` method must +consider times in the "repeated hour" to be in standard time. This is easily +arranged, as in the example, by expressing DST switch times in the time zone's +standard local time. + +Applications that can't bear such ambiguities should avoid using hybrid +:class:`tzinfo` subclasses; there are no ambiguities when using UTC, or any +other fixed-offset :class:`tzinfo` subclass (such as a class representing only +EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). + + +.. _strftime-behavior: + +:meth:`strftime` Behavior +------------------------- + +:class:`date`, :class:`datetime`, and :class:`time` objects all support a +``strftime(format)`` method, to create a string representing the time under the +control of an explicit format string. Broadly speaking, ``d.strftime(fmt)`` +acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` +although not all objects support a :meth:`timetuple` method. + +For :class:`time` objects, the format codes for year, month, and day should not +be used, as time objects have no such values. If they're used anyway, ``1900`` +is substituted for the year, and ``0`` for the month and day. + +For :class:`date` objects, the format codes for hours, minutes, and seconds +should not be used, as :class:`date` objects have no such values. If they're +used anyway, ``0`` is substituted for them. + +For a naive object, the ``%z`` and ``%Z`` format codes are replaced by empty +strings. + +For an aware object: + +``%z`` + :meth:`utcoffset` is transformed into a 5-character string of the form +HHMM or + -HHMM, where HH is a 2-digit string giving the number of UTC offset hours, and + MM is a 2-digit string giving the number of UTC offset minutes. For example, if + :meth:`utcoffset` returns ``timedelta(hours=-3, minutes=-30)``, ``%z`` is + replaced with the string ``'-0330'``. + +``%Z`` + If :meth:`tzname` returns ``None``, ``%Z`` is replaced by an empty string. + Otherwise ``%Z`` is replaced by the returned value, which must be a string. + +The full set of format codes supported varies across platforms, because Python +calls the platform C library's :func:`strftime` function, and platform +variations are common. The documentation for Python's :mod:`time` module lists +the format codes that the C standard (1989 version) requires, and those work on +all platforms with a standard C implementation. Note that the 1999 version of +the C standard added additional format codes. + +The exact range of years for which :meth:`strftime` works also varies across +platforms. Regardless of platform, years before 1900 cannot be used. + +.. % %% This example is obsolete, since strptime is now supported by datetime. +.. % +.. % \subsection{Examples} +.. % +.. % \subsubsection{Creating Datetime Objects from Formatted Strings} +.. % +.. % The \class{datetime} class does not directly support parsing formatted time +.. % strings. You can use \function{time.strptime} to do the parsing and create +.. % a \class{datetime} object from the tuple it returns: +.. % +.. % \begin{verbatim} +.. % >>> s = "2005-12-06T12:13:14" +.. % >>> from datetime import datetime +.. % >>> from time import strptime +.. % >>> datetime(*strptime(s, "%Y-%m-%dT%H:%M:%S")[0:6]) +.. % datetime.datetime(2005, 12, 6, 12, 13, 14) +.. % \end{verbatim} +.. % + diff --git a/Doc/library/dbhash.rst b/Doc/library/dbhash.rst new file mode 100644 index 0000000..b5c9590 --- /dev/null +++ b/Doc/library/dbhash.rst @@ -0,0 +1,114 @@ + +:mod:`dbhash` --- DBM-style interface to the BSD database library +================================================================= + +.. module:: dbhash + :synopsis: DBM-style interface to the BSD database library. +.. sectionauthor:: Fred L. Drake, Jr. + + +.. index:: module: bsddb + +The :mod:`dbhash` module provides a function to open databases using the BSD +``db`` library. This module mirrors the interface of the other Python database +modules that provide access to DBM-style databases. The :mod:`bsddb` module is +required to use :mod:`dbhash`. + +This module provides an exception and a function: + + +.. exception:: error + + Exception raised on database errors other than :exc:`KeyError`. It is a synonym + for :exc:`bsddb.error`. + + +.. function:: open(path[, flag[, mode]]) + + Open a ``db`` database and return the database object. The *path* argument is + the name of the database file. + + The *flag* argument can be: + + +---------+-------------------------------------------+ + | Value | Meaning | + +=========+===========================================+ + | ``'r'`` | Open existing database for reading only | + | | (default) | + +---------+-------------------------------------------+ + | ``'w'`` | Open existing database for reading and | + | | writing | + +---------+-------------------------------------------+ + | ``'c'`` | Open database for reading and writing, | + | | creating it if it doesn't exist | + +---------+-------------------------------------------+ + | ``'n'`` | Always create a new, empty database, open | + | | for reading and writing | + +---------+-------------------------------------------+ + + For platforms on which the BSD ``db`` library supports locking, an ``'l'`` + can be appended to indicate that locking should be used. + + The optional *mode* parameter is used to indicate the Unix permission bits that + should be set if a new database must be created; this will be masked by the + current umask value for the process. + + +.. seealso:: + + Module :mod:`anydbm` + Generic interface to ``dbm``\ -style databases. + + Module :mod:`bsddb` + Lower-level interface to the BSD ``db`` library. + + Module :mod:`whichdb` + Utility module used to determine the type of an existing database. + + +.. _dbhash-objects: + +Database Objects +---------------- + +The database objects returned by :func:`open` provide the methods common to all +the DBM-style databases and mapping objects. The following methods are +available in addition to the standard methods. + + +.. method:: dbhash.first() + + It's possible to loop over every key/value pair in the database using this + method and the :meth:`next` method. The traversal is ordered by the databases + internal hash values, and won't be sorted by the key values. This method + returns the starting key. + + +.. method:: dbhash.last() + + Return the last key/value pair in a database traversal. This may be used to + begin a reverse-order traversal; see :meth:`previous`. + + +.. method:: dbhash.next() + + Returns the key next key/value pair in a database traversal. The following code + prints every key in the database ``db``, without having to create a list in + memory that contains them all:: + + print db.first() + for i in range(1, len(db)): + print db.next() + + +.. method:: dbhash.previous() + + Returns the previous key/value pair in a forward-traversal of the database. In + conjunction with :meth:`last`, this may be used to implement a reverse-order + traversal. + + +.. method:: dbhash.sync() + + This method forces any unwritten data to be written to the disk. + diff --git a/Doc/library/dbm.rst b/Doc/library/dbm.rst new file mode 100644 index 0000000..52923e8 --- /dev/null +++ b/Doc/library/dbm.rst @@ -0,0 +1,74 @@ + +:mod:`dbm` --- Simple "database" interface +==========================