IDLE Extension: CallTips

Mark Hammond MHammond at skippinet.com.au
Wed Jun 2 09:25:14 CEST 1999


Humming the mantra "Release early and release often", I humbly submit my
first attempt at an IDLE extension.

Some of you may be wondering if I have a) seen the light, or b) lost my
mind, depending on your viewpoint <wink> But fear not - Guido and I have
been working on allowing IDLE extensions to exist in Pythonwin, so this
extension will indeed be used by the next version of Pythonwin (in fact, was
ported from the Pythonwin version)

CallTips is an extension that uses a pop-up window similar to "Tool Tips" or
"Balloon Help", and displays the parameter description for functions as you
open a paren.  The text for the description is derived from the function
object itself if possible, and the function's docstring.

It has the following problems:

* It is not incredibly smart about determining the function to use to
display the tips.  Simple things like "string.split" and "os.path.split"
work correctly, but many other function calls, such as "self.foo" will not
invoke any help at all.

* The tips may hang around longer than you expect.  Specifically,
back-spacing after the window is open, or moving to a new location with the
mouse will not close the window.  Almost all other cursor movement keys
will, so it should not hang around too long.  Any Tkinter experts with
advice on how to fix this would be appreciated!

* Only been tested on WinNT, but has absolutely no Windows specific code -
should work fine on any IDLE platform.  The CallTip window code is based on
Guido's ToolTips.py, which is based on PySol - so it should work anywhere!

* Doesn't handle nested calls correctly - eg, closing a nested function call
will not re-display the help for the outer call.  This is slowly being
addressed.

* No way to disable the CallTips or delay their display (other than to
remove the extension, of course)

For all this, I still find it incredibly useful.  Plus the code is small
enough to attach :-)

The instructions are very simple:
* Copy the attached files to your IDLE directory.
* Open extend.py, and add "CallTips" to the list of extensions.  See
extend.txt for details
* Restart IDLE.  From the PyShell window type "string.split(" and see it do
it's stuff!

All comments and enhancements appreciated!

Mark.


begin 666 CallTipWindow.py
M(R!!($-A;&Q4:7 @=VEN9&]W(&-L87-S(&9O<B!4:VEN=&5R+TE$3$4N#0HC
M($%F=&5R(%1O;VQ4:7 N<'DL('=H:6-H('5S97,@:61E87, at 9VQE86YE9"!F
M<F]M(%!Y4V]L#0H-"B, at 57-E9"!B>2!T:&4 at 0V%L;%1I<', at 241,12!E>'1E
M;G-I;VXN#0II;7!O<G0@;W,-"F9R;VT at 5&MI;G1E<B!I;7!O<G0@*@T*#0IC
M;&%S<R!#86QL5&EP. at T*#0H@(" @9&5F(%]?:6YI=%]?*'-E;&8L('=I9&=E
M="DZ#0H@(" @(" @('-E;&8N=VED9V5T(#T@=VED9V5T#0H@(" @(" @('-E
M;&8N=&EP=VEN9&]W(#T at 3F]N90T*(" @(" @("!S96QF+FED(#T at 3F]N90T*
M(" @(" @("!S96QF+G@@/2!S96QF+GD@/2 P#0H-"B @("!D968@<VAO=W1I
M<"AS96QF+"!T97AT*3H-"B @(" @(" @<V5L9BYT97AT(#T@=&5X= T*(" @
M(" @("!I9B!S96QF+G1I<'=I;F1O=R!O<B!N;W0@<V5L9BYT97AT. at T*(" @
M(" @(" @(" @<F5T=7)N#0H@(" @(" @('-E;&8N=VED9V5T+G-E92 at B:6YS
M97)T(BD-"B @(" @(" @>"P@>2P at 8W@L(&-Y(#T@<V5L9BYW:61G970N8F)O
M>"@B:6YS97)T(BD-"B @(" @(" @>" ]('@@*R!S96QF+G=I9&=E="YW:6YF
M;U]R;V]T>"@I("L@, at T*(" @(" @("!Y(#T@>2 K(&-Y("L@<V5L9BYW:61G
M970N=VEN9F]?<F]O='DH*0T*(" @(" @("!S96QF+G1I<'=I;F1O=R ]('1W
M(#T at 5&]P;&5V96PH<V5L9BYW:61G970I#0H@(" @(" @('1W+G=M7V]V97)R
M:61E<F5D:7)E8W0H,2D-"B @(" @(" @='<N=VU?9V5O;65T<GDH(BLE9"LE
M9"(@)2 H>"P@>2DI#0H@(" @(" @(&QA8F5L(#T at 3&%B96PH='<L('1E>'0]
M<V5L9BYT97AT+"!J=7-T:69Y/4Q%1E0L#0H@(" @(" @(" @(" @(" @(" @
M(" @8F%C:V=R;W5N9#TB(V9F9F9E,"(L(')E;&EE9CU33TQ)1"P at 8F]R9&5R
M=VED=&@],2P-"B @(" @(" @(" @(" @(" @(" @("!F;VYT/2)#;W5R:65R
M(#@B*0T*(" @(" @("!L86)E;"YP86-K*"D-"B @(" @(" @(" @(" @(" @
M(" @(" -"B @("!D968@:&ED971I<"AS96QF*3H-"B @(" @(" @='<@/2!S
M96QF+G1I<'=I;F1O=PT*(" @(" @("!S96QF+G1I<'=I;F1O=R ]($YO;F4-
M"B @(" @(" @:68@='<Z#0H@(" @(" @(" @("!T=RYD97-T<F]Y*"D-"@T*
M#0HC(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C#0HC#0HC(%1E<W0@
M0V]D90T*(PT*8VQA<W, at 8V]N=&%I;F5R.B C($-O;F-E<'1U86QL>2!A;B!E
M9&ET;W)?=VEN9&]W#0H@(" @9&5F(%]?:6YI=%]?*'-E;&8I. at T*(" @(" @
M("!R;V]T(#T at 5&LH*0T*(" @(" @("!T97AT(#T@<V5L9BYT97AT(#T at 5&5X
M="AR;V]T*0T*(" @(" @("!T97AT+G!A8VLH<VED93U,1494+"!F:6QL/4)/
M5$@L(&5X<&%N9#TQ*0T*(" @(" @("!T97AT+FEN<V5R="@B:6YS97)T(BP@
M(G-T<FEN9RYS<&QI="(I#0H@(" @(" @(')O;W0N=7!D871E*"D-"B @(" @
M(" @<V5L9BYC86QL=&EP(#T at 0V%L;%1I<"AT97AT*0T*#0H@(" @(" @('1E
M>'0N979E;G1?861D*"(\/&-A;&QT:7 M<VAO=SX^(BP@(B at B*0T*(" @(" @
M("!T97AT+F5V96YT7V%D9"@B/#QC86QL=&EP+6AI9&4^/B(L("(I(BD-"B @
M(" @(" @=&5X="YB:6YD*"(\/&-A;&QT:7 M<VAO=SX^(BP@<V5L9BYC86QL
M=&EP7W-H;W<I#0H@(" @(" @('1E>'0N8FEN9"@B/#QC86QL=&EP+6AI9&4^
M/B(L('-E;&8N8V%L;'1I<%]H:61E*0T*(" @(" @(" -"B @(" @(" @=&5X
M="YF;V-U<U]S970H*0T*(" @(" @(" C(')O;W0N;6%I;FQO;W H*2 C(&YO
M="!I;B!I9&QE#0H-"B @("!D968 at 8V%L;'1I<%]S:&]W*'-E;&8L(&5V96YT
M*3H-"B @(" @(" @<V5L9BYC86QL=&EP+G-H;W=T:7 H(DAE;&QO('=O<FQD
M(BD-"@T*(" @(&1E9B!C86QL=&EP7VAI9&4H<V5L9BP at 979E;G0I. at T*(" @
M(" @("!S96QF+F-A;&QT:7 N:&ED971I<"@I#0H-"F1E9B!M86EN*"DZ#0H@
M(" @(R!497-T(&-O9&4-"B @("!C/6-O;G1A:6YE<B at I#0H-"FEF(%]?;F%M
>95]?/3TG7U]M86EN7U\G. at T*(" @(&UA:6XH*0T*
`
end

begin 666 CallTips.py
M:6UP;W)T('-T<FEN9PT*:6UP;W)T('-Y<PT*:6UP;W)T('1Y<&5S#0H-"B,@
M5&AE<V4@:V5Y<R!C:&5C:R!I9B!C86YC96QL871I;VX@:7,@;F5S97-S87)Y
M+ at T*7V-H96-K7V-A;F-E;%]K97ES(#T at 6R),969T(BP@(E)I9VAT(ET-"@T*
M(R!4:&5S92!K97ES("AW:71H('1H92!M;V1I9FEE<G,I(&-A;&P at 8V%N8V5L
M('5N8V]N9&ET:6]N86QL>2X-"E]C86YC96Q?:V5Y<U]B87-E(#T at 6R)5<"(L
M(")$;W=N(BP@(DYE>'0B+" B4')I;W(B+" B2&]M92)=#0I?8V%N8V5L7VME
M>7-?;6]D:69I97)S(#T at 6R=+97DM)RP@)T-O;G1R;VPM)RP@)U-H:69T+2<L
M("=#;VYT<F]L+5-H:69T+2==#0H-"E]C86YC96Q?:V5Y<R ](%M=#0IF;W(@
M:V5Y(&EN(%]C86YC96Q?:V5Y<U]B87-E. at T*(" @(&9O<B!M;V0@:6X at 7V-A
M;F-E;%]K97ES7VUO9&EF:65R<SH-"B @(" @(" @7V-A;F-E;%]K97ES+F%P
M<&5N9"AM;V0K:V5Y*0T*#0IC;&%S<R!#86QL5&EP<SH-"@T*(" @(&UE;G5D
M969S(#T at 6PT*(" @(%T-"@T*(" @(&ME>61E9G,@/2![#0H@(" @(" @("<\
M/'!A<F5N+6]P96X^/B<Z(%LG/$ME>2TH/B==+ T*(" @(" @(" G/#QP87)E
M;BUC;&]S93X^)SH at 6R<\2V5Y+2D^)UTL#0H@(" @(" @("<\/&-H96-K+6-A
M;&QT:7 M8V%N8V5L/CXG.B!M87 H;&%M8F1A(&ME>3H@(CQ+97DM)7,^(B E
M(&ME>2P at 7V-H96-K7V-A;F-E;%]K97ES*2P-"B @(" @(" @)SP\8V%L;'1I
M<"UC86YC96P^/B<Z(&UA<"AL86UB9&$@:V5Y.B B/"5S/B(@)2!K97DL(%]C
M86YC96Q?:V5Y<RDL#0H@(" @?0T*#0H@(" @=VEN9&]W<U]K97ED969S(#T@
M>PT*(" @('T-"@T*(" @('5N:7A?:V5Y9&5F<R ]('L-"B @("!]#0H-"B @
M("!D968 at 7U]I;FET7U\H<V5L9BP at 961I='=I;BDZ#0H@(" @(" @('-E;&8N
M961I='=I;B ](&5D:71W:6X-"B @(" @(" @<V5L9BYT97AT(#T at 961I='=I
M;BYT97AT#0H@(" @(" @('-E;&8N8V%L;'1I<" ]($YO;F4-"B @(" @(" @
M:68@:&%S871T<BAS96QF+G1E>'0L(")M86ME7V-A;&QT:7!?=VEN9&]W(BDZ
M#0H@(" @(" @(" @("!S96QF+E]M86ME7V-A;&QT:7!?=VEN9&]W(#T@<V5L
M9BYT97AT+FUA:V5?8V%L;'1I<%]W:6YD;W<-"B @(" @(" @96QS93H-"B @
M(" @(" @(" @('-E;&8N7VUA:V5?8V%L;'1I<%]W:6YD;W<@/2!S96QF+E]M
M86ME7W1K7V-A;&QT:7!?=VEN9&]W#0H@(" @(" @( T*(" @(&1E9B!?;6%K
M95]T:U]C86QL=&EP7W=I;F1O=RAS96QF*3H-"B @(" @(" @:6UP;W)T($-A
M;&Q4:7!7:6YD;W<-"B @(" @(" @<F5T=7)N($-A;&Q4:7!7:6YD;W<N0V%L
M;%1I<"AS96QF+G1E>'0I#0H-"B @("!D968 at 7W)E;6]V95]C86QL=&EP7W=I
M;F1O=RAS96QF*3H-"B @(" @(" @:68@<V5L9BYC86QL=&EP. at T*(" @(" @
M(" @(" @<V5L9BYC86QL=&EP+FAI9&5T:7 H*0T*(" @(" @(" @(" @<V5L
M9BYC86QL=&EP(#T at 3F]N90T*(" @(" @(" -"B @("!D968@<&%R96Y?;W!E
M;E]E=F5N="AS96QF+"!E=F5N="DZ#0H@(" @(" @('-E;&8N7W)E;6]V95]C
M86QL=&EP7W=I;F1O=R at I#0H@(" @(" @(&%R9U]T97AT(#T at 9V5T7V%R9U]T
M97AT*'-E;&8N9V5T7V]B:F5C=%]A=%]C=7)S;W(H*2D-"B @(" @(" @:68@
M87)G7W1E>'0Z#0H@(" @(" @(" @("!S96QF+F-A;&QT:7!?<W1A<G0@/2!S
M96QF+G1E>'0N:6YD97 at H(FEN<V5R="(I#0H@(" @(" @(" @("!S96QF+F-A
M;&QT:7 @/2!S96QF+E]M86ME7V-A;&QT:7!?=VEN9&]W*"D-"B @(" @(" @
M(" @('-E;&8N8V%L;'1I<"YS:&]W=&EP*&%R9U]T97AT*0T*(" @(" @("!R
M971U<FX@(B(@(W-O('1H92!E=F5N="!I<R!H86YD;&5D(&YO<FUA;&QY+ at T*
M#0H@(" @9&5F('!A<F5N7V-L;W-E7V5V96YT*'-E;&8L(&5V96YT*3H-"B @
M(" @(" @(R!.;W<@:G5S="!H:61E<RP at 8G5T(&QA=&5R('=E('-H;W5L9"!C
M:&5C:R!I9B!O=&AE<@T*(" @(" @(" C('!A<F5N)V0 at 97AP<F5S<VEO;G,@
M<F5M86EN(&]P96XN#0H@(" @(" @('-E;&8N7W)E;6]V95]C86QL=&EP7W=I
M;F1O=R at I#0H@(" @(" @(')E='5R;B B(B C<V\@=&AE(&5V96YT(&ES(&AA
M;F1L960@;F]R;6%L;'DN#0H-"B @("!D968 at 8VAE8VM?8V%L;'1I<%]C86YC
M96Q?979E;G0H<V5L9BP at 979E;G0I. at T*(" @(" @(" C(%1H:7, at 9&]E<VYT
M('%U:71E('=O<FL at 8V]R<F5C=&QY(&%S(&ET(&ES('!R;V-E<W-E9 T*(" @
M(" @(" C(%]B969O<F5?('1H92!K97D@:7,@:&%N9&QE9"X@(%1H=7,L('=H
M96X@=&AE(")5<"(@:V5Y#0H@(" @(" @(",@:7,@<')E<W-E9"P@=&AI<R!T
M97-T(&AA<'!E;G, at 8F5F;W)E('1H92!C=7)S;W(@:7,@;6]V960N#0H@(" @
M(" @(", at 5&AI<R!W:6QL(&1O(&9O<B!N;W<N#0H@(" @(" @(&EF('-E;&8N
M8V%L;'1I<#H-"B @(" @(" @(" @(", at 268@=V4@:&%V92!M;W9E9"!B969O
M<F4@=&AE('-T87)T(&]F('1H92!C86QL=&EP+ T*(" @(" @(" @(" @(R!O
M<B!O9F8@=&AE(&-A;&QT:7 @;&EN92P@=&AE;B!C86YC96P@=&AE('1I<"X-
M"B @(" @(" @(" @(",@*$QA=&5R(&YE960@=&\@8F4@<VUA<G1E<B!A8F]U
M="!M=6QT:2UL:6YE+"!E=&,I#0H@(" @(" @(" @("!I9B!S96QF+G1E>'0N
M8V]M<&%R92 at B:6YS97)T(BP@(CP](BP@<V5L9BYC86QL=&EP7W-T87)T*2!O
M<B!<#0H@(" @(" @(" @(" @("!S96QF+G1E>'0N8V]M<&%R92 at B:6YS97)T
M(BP@(CXB+"!S96QF+F-A;&QT:7!?<W1A<G0@*R B(&QI;F5E;F0B*3H-"B @
M(" @(" @(" @(" @("!S96QF+E]R96UO=F5?8V%L;'1I<%]W:6YD;W<H*0T*
M(" @(" @("!R971U<FX@(B(@(W-O('1H92!E=F5N="!I<R!H86YD;&5D(&YO
M<FUA;&QY+ at T*#0H@(" @9&5F(&-A;&QT:7!?8V%N8V5L7V5V96YT*'-E;&8L
M(&5V96YT*3H-"B @(" @(" @<V5L9BY?<F5M;W9E7V-A;&QT:7!?=VEN9&]W
M*"D-"B @(" @(" @<F5T=7)N("(B("-S;R!T:&4 at 979E;G0@:7,@:&%N9&QE
M9"!N;W)M86QL>2X-"@T*(" @(&1E9B!G971?;V)J96-T7V%T7V-U<G-O<BAS
M96QF+ T*(" @(" @(" @(" @(" @(" @(" @(" @(" @("!W;W)D8VAA<G,]
M(BY?(B K('-T<FEN9RYU<'!E<F-A<V4@*R!S=')I;F<N;&]W97)C87-E("L@
M<W1R:6YG+F1I9VET<RDZ#0H@(" @(" @(", at 6%A8("T at 5&AI<R!N965D('1O
M(&)E(&UO=F5D('1O(&$@8F5T=&5R('!L86-E#0H@(" @(" @(", at 87,@=&AE
M("(N(B!A='1R:6)U=&4@;&]O:W5P(&-O9&4 at 8V%N(&%L<V\@=7-E(&ET+ at T*
M(" @(" @("!T97AT(#T@<V5L9BYT97AT#0H@(" @(" @(&-H87)S(#T@=&5X
M="YG970H(FEN<V5R="!L:6YE<W1A<G0B+" B:6YS97)T(BD-"B @(" @(" @
M:2 ](&QE;BAC:&%R<RD-"B @(" @(" @=VAI;&4@:2!A;F0 at 8VAA<G-;:2TQ
M72!I;B!W;W)D8VAA<G,Z#0H@(" @(" @(" @("!I(#T@:2TQ#0H@(" @(" @
M('=O<F0@/2!C:&%R<UMI.ET-"B @(" @(" @:68@=V]R9#H-"B @(" @(" @
M(" @(", at 2&]W(&ES('1H:7, at 9F]R(&$@:&%C:R$-"B @(" @(" @(" @(&EM
M<&]R="!S>7,L(%]?;6%I;E]?#0H@(" @(" @(" @("!N86UE<W!A8V4@/2!S
M>7,N;6]D=6QE<RYC;W!Y*"D-"B @(" @(" @(" @(&YA;65S<&%C92YU<&1A
M=&4H7U]M86EN7U\N7U]D:6-T7U\I#0H@(" @(" @(" @("!T<GDZ#0H@(" @
M(" @(" @(" @(" @(" @(')E='5R;B!E=F%L*'=O<F0L(&YA;65S<&%C92D-
M"B @(" @(" @(" @(&5X8V5P=#H-"B @(" @(" @(" @(" @(" @(" @<&%S
M<PT*(" @(" @("!R971U<FX at 3F]N92 C($-A;B=T(&9I;F0 at 86X@;V)J96-T
M+ at T*#0ID968 at 9V5T7V%R9U]T97AT*&]B*3H-"B @(" C($=E="!A('-T<FEN
M9R!D97-C<FEB:6YG('1H92!A<F=U;65N=', at 9F]R('1H92!G:79E;B!O8FIE
M8W0N#0H@(" @87)G5&5X=" ]("(B#0H@(" @:68@;V(@:7,@;F]T($YO;F4Z
M#0H@(" @(" @(&%R9T]F9G-E=" ](# -"B @(" @(" @(R!B:70@;V8 at 82!H
M86-K(&9O<B!M971H;V1S("T@='5R;B!I="!I;G1O(&$@9G5N8W1I;VX-"B @
M(" @(" @(R!B=70@=V4 at 9')O<"!T:&4@(G-E;&8B('!A<F%M+ at T*(" @(" @
M("!I9B!T>7!E*&]B*3T]='EP97,N365T:&]D5'EP93H-"B @(" @(" @(" @
M(&]B(#T@;V(N:6U?9G5N8PT*(" @(" @(" @(" @87)G3V9F<V5T(#T@,0T*
M(" @(" @(" C(%1R>2!A;F0 at 8G5I;&0@;VYE(&9O<B!0>71H;VX at 9&5F:6YE
M9"!F=6YC=&EO;G,-"B @(" @(" @:68@='EP92AO8BD@:6X at 6W1Y<&5S+D9U
M;F-T:6]N5'EP92P@='EP97,N3&%M8F1A5'EP95TZ#0H@(" @(" @(" @("!T
M<GDZ#0H@(" @(" @(" @(" @(" @<F5A;$%R9W,@/2!O8BYF=6YC7V-O9&4N
M8V]?=F%R;F%M97-;87)G3V9F<V5T.F]B+F9U;F-?8V]D92YC;U]A<F=C;W5N
M=%T-"B @(" @(" @(" @(" @("!D969A=6QT<R ](&]B+F9U;F-?9&5F875L
M=',@;W(@6UT-"B @(" @(" @(" @(" @("!D969A=6QT<R ](&QI<W0H;6%P
M*&QA;6)D82!N86UE.B B/25S(B E(&YA;64L(&1E9F%U;'1S*2D-"B @(" @
M(" @(" @(" @("!D969A=6QT<R ](%LB(ET@*B H;&5N*')E86Q!<F=S*2UL
M96XH9&5F875L=',I*2 K(&1E9F%U;'1S#0H@(" @(" @(" @(" @(" @87)G
M5&5X=" ]('-T<FEN9RYJ;VEN*"!M87 H;&%M8F1A(&%R9RP at 9&9L=#H at 87)G
M*V1F;'0L(')E86Q!<F=S+"!D969A=6QT<RDL("(L("(I#0H@(" @(" @(" @
M(" @(" @:68@;&5N*')E86Q!<F=S*2MA<F=/9F9S970@/" H;&5N*&]B+F9U
M;F-?8V]D92YC;U]V87)N86UE<RD at +2!L96XH;V(N9G5N8U]C;V1E+F-O7VYA
M;65S*2 I. at T*(" @(" @(" @(" @(" @(" @("!I9B!A<F=497AT.B!A<F=4
M97AT(#T at 87)G5&5X=" K("(L("(-"B @(" @(" @(" @(" @(" @(" @87)G
M5&5X=" ](&%R9U1E>'0@*R B+BXN(@T*(" @(" @(" @(" @(" @(&%R9U1E
M>'0@/2 B*"5S*2(@)2!A<F=497AT#0H@(" @(" @(" @("!E>&-E<'0Z#0H@
M(" @(" @(" @(" @(" @<&%S<PT*(" @(" @(" C($-A;B=T(&)U:6QD(&%N
M(&%R9W5M96YT(&QI<W0 at +2!S964@:68@=V4 at 8V%N('5S92!A(&1O8W-T<FEN
M9RX-"B @(" @(" @:68@:&%S871T<BAO8BP@(E]?9&]C7U\B*2!A;F0@;V(N
M7U]D;V-?7SH-"B @(" @(" @(" @('!O<R ]('-T<FEN9RYF:6YD*&]B+E]?
M9&]C7U\L(")<;B(I#0H@(" @(" @(" @("!I9B!P;W,\,"!O<B!P;W,^-S Z
M('!O<STW, T*(" @(" @(" @(" @:68 at 87)G5&5X=#H at 87)G5&5X=" ](&%R
M9U1E>'0@*R B7&XB#0H@(" @(" @(" @("!A<F=497AT(#T at 87)G5&5X=" K
M(&]B+E]?9&]C7U];.G!O<UT-"@T*(" @(')E='5R;B!A<F=497AT#0H-"B,C
M(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C
M(R,-"B,-"B, at 5&5S="!C;V1E#0HC#0II9B!?7VYA;65?7ST])U]?;6%I;E]?
M)SH-"@T*(" @(&1E9B!T,2 at I.B B*"DB#0H@(" @9&5F('0R*&$L(&(]3F]N
M92DZ("(H82P at 8CU.;VYE*2(-"B @("!D968@=#,H82P@*F%R9W,I.B B*&$L
M("XN+BDB#0H@(" @9&5F('0T*"IA<F=S*3H@(B at N+BXI(@T*(" @(&1E9B!T
M-2AA+" J87)G<RDZ("(H82P at +BXN*2(-"B @("!D968@=#8H82P at 8CU.;VYE
M+" J87)G<RP@*BIK=RDZ("(H82P at 8CU.;VYE+" N+BXI(@T*#0H@(" @8VQA
M<W, at 5$,Z#0H@(" @(" @(&1E9B!T,2AS96QF*3H@(B at I(@T*(" @(" @("!D
M968@=#(H<V5L9BP at 82P@8CU.;VYE*3H@(BAA+"!B/4YO;F4I(@T*(" @(" @
M("!D968@=#,H<V5L9BP at 82P@*F%R9W,I.B B*&$L("XN+BDB#0H@(" @(" @
M(&1E9B!T-"AS96QF+" J87)G<RDZ("(H+BXN*2(-"B @(" @(" @9&5F('0U
M*'-E;&8L(&$L("IA<F=S*3H@(BAA+" N+BXI(@T*(" @(" @("!D968@=#8H
M<V5L9BP at 82P@8CU.;VYE+" J87)G<RP@*BIK=RDZ("(H82P at 8CU.;VYE+" N
M+BXI(@T*#0H@(" @9&5F('1E<W0H('1E<W1S("DZ#0H@(" @(" @(&9A:6QE
M9#U;70T*(" @(" @("!F;W(@="!I;B!T97-T<SH-"B @(" @(" @(" @(&EF
M(&=E=%]A<F=?=&5X="AT*2 A/2!T+E]?9&]C7U\@*R B7&XB("L@="Y?7V1O
M8U]?. at T*(" @(" @(" @(" @(" @(&9A:6QE9"YA<'!E;F0H="D-"B @(" @
M(" @(" @(" @("!P<FEN=" B)7, at +2!E>'!E8W1E9" E<RP at 8G5T(&=O=" E
M<R(@)2 H="P at 8'0N7U]D;V-?7V L(&!G971?87)G7W1E>'0H="E@*0T*(" @
M(" @("!P<FEN=" B)60@;V8@)60@=&5S=', at 9F%I;&5D(B E("AL96XH9F%I
M;&5D*2P@;&5N*'1E<W1S*2D-"@T*(" @('1C(#T at 5$,H*0T*(" @('1E<W1S
M(#T@=#$L('0R+"!T,RP@=#0L('0U+"!T-BP at 7 T*(" @(" @(" @(" @=&,N
M=#$L('1C+G0R+"!T8RYT,RP@=&,N=#0L('1C+G0U+"!T8RYT- at T*#0H@(" @
-=&5S="AT97-T<RD-"@``
`
end





More information about the Python-list mailing list