Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #16467 > unrolled thread

Clever hack or code abomination?

Started byRoy Smith <roy@panix.com>
First post2011-11-30 22:15 -0500
Last post2011-12-02 09:20 -0800
Articles 17 — 10 participants

Back to article view | Back to comp.lang.python


Contents

  Clever hack or code abomination? Roy Smith <roy@panix.com> - 2011-11-30 22:15 -0500
    Re: Clever hack or code abomination? Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2011-12-01 03:38 +0000
    Re: Clever hack or code abomination? Matt Joiner <anacrolix@gmail.com> - 2011-12-01 14:49 +1100
    Re: Clever hack or code abomination? Chris Angelico <rosuav@gmail.com> - 2011-12-01 19:21 +1100
      Re: Clever hack or code abomination? John Ladasky <ladasky@my-deja.com> - 2011-12-06 11:19 -0800
    Re: Clever hack or code abomination? Arnaud Delobelle <arnodel@gmail.com> - 2011-12-01 08:35 +0000
    Re: Clever hack or code abomination? Vito 'ZeD' De Tullio <zak.mc.kraken@libero.it> - 2011-12-01 21:35 +0100
    Re: Clever hack or code abomination? "Martin P. Hellwig" <martin.hellwig@gmail.com> - 2011-12-01 21:13 +0000
      Re: Clever hack or code abomination? Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2011-12-02 00:15 +0000
        Re: Clever hack or code abomination? Chris Angelico <rosuav@gmail.com> - 2011-12-02 13:07 +1100
          Re: Clever hack or code abomination? Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2011-12-02 05:34 +0000
            Re: Clever hack or code abomination? Chris Angelico <rosuav@gmail.com> - 2011-12-02 17:02 +1100
              Re: Clever hack or code abomination? Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2011-12-02 08:54 +0000
                Re: Clever hack or code abomination? Chris Angelico <rosuav@gmail.com> - 2011-12-02 20:16 +1100
    Re: Clever hack or code abomination? Terry Reedy <tjreedy@udel.edu> - 2011-12-01 21:49 -0500
    Re: Clever hack or code abomination? Matt Joiner <anacrolix@gmail.com> - 2011-12-02 16:11 +1100
    Re: Clever hack or code abomination? Chris Hulan <chris.hulan@gmail.com> - 2011-12-02 09:20 -0800

#16467 — Clever hack or code abomination?

FromRoy Smith <roy@panix.com>
Date2011-11-30 22:15 -0500
SubjectClever hack or code abomination?
Message-ID<roy-A03C06.22152730112011@news.panix.com>
I need to try a bunch of names in sequence until I find one that works 
(definition of "works" is unimportant).  The algorithm is:

1) Given a base name, "foo", first see if just plain "foo" works.

2) If not, try "foo-1", "foo-2", and so on

3) If you reach "foo-20", give up.

What would you say if you saw this:

for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:

It generates the right sequence of strings.  But, if you came upon that 
code, would it make sense to you, or would you spend half the afternoon 
trying to figure out what it did and the other half of the afternoon 
ranting about the deranged lunatic who wrote it?

[toc] | [next] | [standalone]


#16468

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2011-12-01 03:38 +0000
Message-ID<4ed6f6a5$0$29986$c3e8da3$5496439d@news.astraweb.com>
In reply to#16467
On Wed, 30 Nov 2011 22:15:27 -0500, Roy Smith wrote:

> I need to try a bunch of names in sequence until I find one that works
> (definition of "works" is unimportant).  The algorithm is:
> 
> 1) Given a base name, "foo", first see if just plain "foo" works.
> 
> 2) If not, try "foo-1", "foo-2", and so on
> 
> 3) If you reach "foo-20", give up.
> 
> What would you say if you saw this:
> 
> for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:
> 
> It generates the right sequence of strings.  But, if you came upon that
> code, would it make sense to you, or would you spend half the afternoon
> trying to figure out what it did and the other half of the afternoon
> ranting about the deranged lunatic who wrote it?

Nah, it's fine. Not exactly the clearest piece of code in the world, but 
hardly worth a rant.

I'd be more likely to write that as:

for suffix in [''] + ["-%d" % i for i in range(1, 21)]:

or if I needed to do it more than once, as a generator:

def suffixes(max=20):
    yield ""
    for i in range(1, max+1):
        yield "-%d" % i



-- 
Steven

[toc] | [prev] | [next] | [standalone]


#16470

FromMatt Joiner <anacrolix@gmail.com>
Date2011-12-01 14:49 +1100
Message-ID<mailman.3186.1322711411.27778.python-list@python.org>
In reply to#16467
def possible_names():
    yield "foo"
    for i in range(20):
        yield "foo-" + str(i)

ಠ_ಠ

On Thu, Dec 1, 2011 at 2:15 PM, Roy Smith <roy@panix.com> wrote:
> I need to try a bunch of names in sequence until I find one that works
> (definition of "works" is unimportant).  The algorithm is:
>
> 1) Given a base name, "foo", first see if just plain "foo" works.
>
> 2) If not, try "foo-1", "foo-2", and so on
>
> 3) If you reach "foo-20", give up.
>
> What would you say if you saw this:
>
> for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:
>
> It generates the right sequence of strings.  But, if you came upon that
> code, would it make sense to you, or would you spend half the afternoon
> trying to figure out what it did and the other half of the afternoon
> ranting about the deranged lunatic who wrote it?
> --
> http://mail.python.org/mailman/listinfo/python-list

[toc] | [prev] | [next] | [standalone]


#16483

FromChris Angelico <rosuav@gmail.com>
Date2011-12-01 19:21 +1100
Message-ID<mailman.3191.1322727673.27778.python-list@python.org>
In reply to#16467
On Thu, Dec 1, 2011 at 2:15 PM, Roy Smith <roy@panix.com> wrote:
> for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:
>
> It generates the right sequence of strings.  But, if you came upon that
> code, would it make sense to you, or would you spend half the afternoon
> trying to figure out what it did and the other half of the afternoon
> ranting about the deranged lunatic who wrote it?

That's a self-contained piece of code.If I came upon it, I'd probably
copy and paste it to IDLE, see what it comes up with, and proceed from
there. Deranged you may be, but so long as code can be dropped into an
interactive interpreter, it's fine.

ChrisA

[toc] | [prev] | [next] | [standalone]


#16752

FromJohn Ladasky <ladasky@my-deja.com>
Date2011-12-06 11:19 -0800
Message-ID<a2cacda5-886c-435d-a673-bed0fcc1197d@q16g2000yqn.googlegroups.com>
In reply to#16483
On Dec 1, 12:21 am, Chris Angelico <ros...@gmail.com> wrote:
> On Thu, Dec 1, 2011 at 2:15 PM, Roy Smith <r...@panix.com> wrote:

> That's a self-contained piece of code.If I came upon it, I'd probably
> copy and paste it to IDLE, see what it comes up with, and proceed from
> there.

+1.  That was going to be my comment exactly.

[toc] | [prev] | [next] | [standalone]


#16484

FromArnaud Delobelle <arnodel@gmail.com>
Date2011-12-01 08:35 +0000
Message-ID<mailman.3192.1322728518.27778.python-list@python.org>
In reply to#16467
On 1 December 2011 03:15, Roy Smith <roy@panix.com> wrote:
> I need to try a bunch of names in sequence until I find one that works
> (definition of "works" is unimportant).  The algorithm is:
>
> 1) Given a base name, "foo", first see if just plain "foo" works.
>
> 2) If not, try "foo-1", "foo-2", and so on
>
> 3) If you reach "foo-20", give up.
>
> What would you say if you saw this:
>
> for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:
>

It's a little obfuscated ;) I would go for the simple:

for i in xrange(21):
    suffix = "-%s" % i if i else ""
    ....

-- 
Arnaud

[toc] | [prev] | [next] | [standalone]


#16512

FromVito 'ZeD' De Tullio <zak.mc.kraken@libero.it>
Date2011-12-01 21:35 +0100
Message-ID<mailman.3208.1322771722.27778.python-list@python.org>
In reply to#16467
Arnaud Delobelle wrote:

> On 1 December 2011 03:15, Roy Smith <roy@panix.com> wrote:
>> I need to try a bunch of names in sequence until I find one that works
>> (definition of "works" is unimportant).  The algorithm is:
>>
>> 1) Given a base name, "foo", first see if just plain "foo" works.
>>
>> 2) If not, try "foo-1", "foo-2", and so on
>>
>> 3) If you reach "foo-20", give up.
>>
>> What would you say if you saw this:
>>
>> for suffix in [''] + [str(i) for i in xrange(-1, -20, -1)]:
>>
> 
> It's a little obfuscated ;) I would go for the simple:
> 
> for i in xrange(21):
>     suffix = "-%s" % i if i else ""
>     ....
> 

obfuscated for obfuscated, you can merge the two ideas:

for suffix in ('-%s' % i if i else '' for i in xrange(21)):
    ...


-- 
By ZeD

[toc] | [prev] | [next] | [standalone]


#16514

From"Martin P. Hellwig" <martin.hellwig@gmail.com>
Date2011-12-01 21:13 +0000
Message-ID<jb8qmd$56l$1@dont-email.me>
In reply to#16467
On 01/12/2011 03:15, Roy Smith wrote:
<cut>
Well, I have seen much worse, so the WTFs/minute(*) count won't be too bad.

However, as  general rule for readability; If you think you have to ask, 
don't bother asking, spend that time rethinking and write a more 
readable solution.


*) http://www.osnews.com/story/19266/WTFs_m

-- 
mph

[toc] | [prev] | [next] | [standalone]


#16515

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2011-12-02 00:15 +0000
Message-ID<4ed818bb$0$29988$c3e8da3$5496439d@news.astraweb.com>
In reply to#16514
On Thu, 01 Dec 2011 21:13:51 +0000, Martin P. Hellwig wrote:

> On 01/12/2011 03:15, Roy Smith wrote: <cut>
> Well, I have seen much worse, so the WTFs/minute(*) count won't be too
> bad.
> 
> However, as  general rule for readability; If you think you have to ask,
> don't bother asking, spend that time rethinking and write a more
> readable solution.

That's generally good advice, but in this case, I don't know why Roy 
Smith thought he had to ask. His initial snippet was pretty much standard 
vanilla Python: a for loop over a list. The list was made by adding a 
list containing a single element '', and a second list made from a list 
comprehension that converted a bunch of numbers into strings. It uses no 
advanced features like generators. A newbie to Python could work it out.

In my opinion, if anyone thinks that's "obfuscated" (as opposed to merely 
"not quite idiomatic"), either their standards for readability are 
impossibly high, or they just can't read Python code.

Try this on for size.


def obfuscated_prefixes(q=20):
    c = str()
    while isinstance(type(c), type(type)):
        yield None or c
        while isinstance(c, object):
            try:
                f = type(q)(c[c.index(chr(45))+1:])+type(q)(1)
            except ValueError:
                c = str.join('\n', list(map(chr, (45, 48))) + [c])[::2]
            else:
                break
        if f <= q: pass
        else: break
        try:
            c = (lambda a,b: a+b)(c[:c.index(chr(45))+1], type(c)(f))
        except IndexError:
            c = c[1::]
    


-- 
Steven

[toc] | [prev] | [next] | [standalone]


#16519

FromChris Angelico <rosuav@gmail.com>
Date2011-12-02 13:07 +1100
Message-ID<mailman.3211.1322791680.27778.python-list@python.org>
In reply to#16515
On Fri, Dec 2, 2011 at 11:15 AM, Steven D'Aprano
<steve+comp.lang.python@pearwood.info> wrote:
> Try this on for size.
>
>
>                f = type(q)(c[c.index(chr(45))+1:])+type(q)(1)
>                c = str.join('\n', list(map(chr, (45, 48))) + [c])[::2]
>            c = (lambda a,b: a+b)(c[:c.index(chr(45))+1], type(c)(f))

I would consider integer representations of ASCII to be code smell.
It's not instantly obvious that 45 means '-', even if you happen to
know the ASCII table by heart (which most people won't). This is one
thing that I like about C's quote handling; double quotes for a
string, or single quotes for an integer with that character's value.
It's clearer than the Python (and other) requirement to have an actual
function call:

for (int i=0;i<10;++i) {
    digit[i]='0'+i;
    letter[i]='A'+i;
}

versus

for i in range(10):
    digit[i]=chr(ord('0')+i)
    letter[i]=chr(ord('A')+i)

Ignoring the fact that you'd probably use a list comp in Python, this
is imho a win for C.

ChrisA

[toc] | [prev] | [next] | [standalone]


#16528

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2011-12-02 05:34 +0000
Message-ID<4ed86358$0$29988$c3e8da3$5496439d@news.astraweb.com>
In reply to#16519
On Fri, 02 Dec 2011 13:07:57 +1100, Chris Angelico wrote:

> On Fri, Dec 2, 2011 at 11:15 AM, Steven D'Aprano
> <steve+comp.lang.python@pearwood.info> wrote:
>> Try this on for size.
>>
>>
>>                f = type(q)(c[c.index(chr(45))+1:])+type(q)(1) c
>>                = str.join('\n', list(map(chr, (45, 48))) +
>>                [c])[::2]
>>            c = (lambda a,b: a+b)(c[:c.index(chr(45))+1],
>>            type(c)(f))
> 
> I would consider integer representations of ASCII to be code smell. It's
> not instantly obvious that 45 means '-', even if you happen to know the
> ASCII table by heart (which most people won't). This is one thing that I
> like about C's quote handling; double quotes for a string, or single
> quotes for an integer with that character's value. It's clearer than the
> Python (and other) requirement to have an actual function call:
> 
> for (int i=0;i<10;++i) {
>     digit[i]='0'+i;
>     letter[i]='A'+i;
> }

I would disagree that this is clear at all. You're adding what looks like 
a character, but is actually an integer, with an integer. And then just 
to add insult to injury, you're storing integers into arrays that are 
named as if they were characters. In what mad universe would you describe 
65 as a letter?

To say nothing of the fact that C's trick only works (for some definition 
of works) for ASCII. Take for example one of the many EBCDIC encodings, 
cp500. If you expect 'I' + 1 to equal 'J', you will be sorely 
disappointed:

py> u'I'.encode('cp500')
'\xc9'
py> u'J'.encode('cp500')
'\xd1'

Characters are not integers, and C conflates them, to the disservice of 
all. If fewer people learned C, fewer people would have such trouble 
understanding Unicode.

Anyone unfamiliar with C's model would have trouble guessing what 'A' + 1 
should mean. Should it be?

-  an error
-  'B'
-  'A1'
-  the numeric value of variable A plus 1
-  66  (assuming ascii encoding)
-  194  (assuming cp500 encoding)
-  some other number
-  something else?

How about 1000 + 'A'?

> versus
> 
> for i in range(10):
>     digit[i]=chr(ord('0')+i)
>     letter[i]=chr(ord('A')+i)

It's a tad more verbose, but it's explicit about what is being done. Take 
the character '0', find out what ordinal value it encodes to, add 1 to 
that value, re-encode back to a character. That's exactly what C does, 
only it does it explicitly.

Note that this still doesn't work the way we might like in EBCDIC, but 
the very fact that you are forced to think about explicit conversion 
steps means you are less likely to make unwarranted assumptions about 
what characters convert to.

Better than both, I would say, would be for string objects to have 
successor and predecessor methods, that skip ahead (or back) the 
specified number of code points (defaulting to 1):

'A'.succ()  => 'B'
'A'.succ(5)  => 'F'

with appropriate exceptions if you try to go below 0 or above the largest 
code point.



-- 
Steven

[toc] | [prev] | [next] | [standalone]


#16531

FromChris Angelico <rosuav@gmail.com>
Date2011-12-02 17:02 +1100
Message-ID<mailman.3219.1322805724.27778.python-list@python.org>
In reply to#16528
On Fri, Dec 2, 2011 at 4:34 PM, Steven D'Aprano
<steve+comp.lang.python@pearwood.info> wrote:
> On Fri, 02 Dec 2011 13:07:57 +1100, Chris Angelico wrote:
>> I would consider integer representations of ASCII to be code smell. It's
>> not instantly obvious that 45 means '-', even if you happen to know the
>> ASCII table by heart (which most people won't).

Note, I'm not saying that C's way is perfect; merely that using the
integer 45 to represent a hyphen is worse.

> In what mad universe would you describe
> 65 as a letter?

I dunno, this universe looks pretty mad from where I am... wait, where
am I? Oh, right. Rutledge's Private Clinic... nice soft walls they
have here...

> To say nothing of the fact that C's trick only works (for some definition
> of works) for ASCII. Take for example one of the many EBCDIC encodings,
> cp500. If you expect 'I' + 1 to equal 'J', you will be sorely
> disappointed:
>
> py> u'I'.encode('cp500')
> '\xc9'
> py> u'J'.encode('cp500')
> '\xd1'

Nothing to do with C, this is a feature of ASCII. Anything involving
arithmetic on ordinals depends on your encoding, regardless of
conflation of int and char.

> Anyone unfamiliar with C's model would have trouble guessing what 'A' + 1
> should mean. Should it be?
>
> -  an error
> -  'B'
> -  'A1'
> -  the numeric value of variable A plus 1
> -  66  (assuming ascii encoding)
> -  194  (assuming cp500 encoding)
> -  some other number
> -  something else?

Agreed. But implicit casting is both a minefield and a source of
immense amounts of clarity. Imagine if you couldn't implicitly cast
int to float - it'd stop you from losing precision on large integers,
but it would get in the way any time you want to work with integers
and floating point together.

> Note that this still doesn't work the way we might like in EBCDIC, but
> the very fact that you are forced to think about explicit conversion
> steps means you are less likely to make unwarranted assumptions about
> what characters convert to.

I don't know about that. Anyone brought up on ASCII and moving to
EBCDIC will likely have trouble with this, no matter how many function
calls it takes.

> Better than both, I would say, would be for string objects to have
> successor and predecessor methods, that skip ahead (or back) the
> specified number of code points (defaulting to 1):
>
> 'A'.succ()  => 'B'
> 'A'.succ(5)  => 'F'
>
> with appropriate exceptions if you try to go below 0 or above the largest
> code point.

... and this still has that same issue. Arithmetic on codepoints
depends on that.

I'd be fine with a simple syntax that gives a Unicode codepoint,
rather than an ASCII one; at least that's standardized. Being able to
work with characters as though they're integers is a huge advantage in
low-level code, but not so vital in Python. But if you're going to do
it, you may as well do it without all the syntactic salt of explicit
conversion functions.

ChrisA

[toc] | [prev] | [next] | [standalone]


#16533

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2011-12-02 08:54 +0000
Message-ID<4ed8923f$0$29988$c3e8da3$5496439d@news.astraweb.com>
In reply to#16531
On Fri, 02 Dec 2011 17:02:01 +1100, Chris Angelico wrote:

> On Fri, Dec 2, 2011 at 4:34 PM, Steven D'Aprano
> <steve+comp.lang.python@pearwood.info> wrote:
>> On Fri, 02 Dec 2011 13:07:57 +1100, Chris Angelico wrote:
>>> I would consider integer representations of ASCII to be code smell.
>>> It's not instantly obvious that 45 means '-', even if you happen to
>>> know the ASCII table by heart (which most people won't).
> 
> Note, I'm not saying that C's way is perfect; merely that using the
> integer 45 to represent a hyphen is worse.

Dude, it was deliberately obfuscated code. I even named the function 
"obfuscated_prefixes". I thought that would have been a hint <wink>

It's kinda scary that of all the sins against readability committed in my 
function, including isinstance(type(c), type(type)) which I was 
particularly proud of, the only criticism you came up with was that 
chr(45) is hard to read. I'm impressed <grins like a mad thing>

[...]
>> Note that this still doesn't work the way we might like in EBCDIC, but
>> the very fact that you are forced to think about explicit conversion
>> steps means you are less likely to make unwarranted assumptions about
>> what characters convert to.
> 
> I don't know about that. Anyone brought up on ASCII and moving to EBCDIC
> will likely have trouble with this, no matter how many function calls it
> takes.

Of course you will, because EBCDIC is a pile of festering garbage :)

But IMAO you're less likely to have trouble with with Unicode if you 
haven't been trained to treat characters as synonymous with integers.

And besides, given how rare such byte-manipulations on ASCII characters 
are in Python, it would be a shame to lose the ability to use '' and "" 
for strings just to avoid calling ord and chr functions.


>> Better than both, I would say, would be for string objects to have
>> successor and predecessor methods, that skip ahead (or back) the
>> specified number of code points (defaulting to 1):
>>
>> 'A'.succ()  => 'B'
>> 'A'.succ(5)  => 'F'
>>
>> with appropriate exceptions if you try to go below 0 or above the
>> largest code point.
> 
> ... and this still has that same issue. Arithmetic on codepoints depends
> on that.

We shouldn't be doing arithmetic on code points. Or at least we shouldn't 
unless we are writing a Unicode library that *needs* to care about the 
implementation. We should only care about the interface, that the 
character after 'A' is 'B'. Implementation-wise, we shouldn't care 
whether A and B are represented in memory by 0x0041 and 0x0042, or by 
0x14AF and 0x9B30. All we really need to know is that B comes immediately 
after A. Everything else is implementation.

But I fear that the idea of working with chr and ord is far to ingrained 
now to get rid of it.



-- 
Steven

[toc] | [prev] | [next] | [standalone]


#16535

FromChris Angelico <rosuav@gmail.com>
Date2011-12-02 20:16 +1100
Message-ID<mailman.3220.1322817418.27778.python-list@python.org>
In reply to#16533
On Fri, Dec 2, 2011 at 7:54 PM, Steven D'Aprano
<steve+comp.lang.python@pearwood.info> wrote:
> Dude, it was deliberately obfuscated code. I even named the function
> "obfuscated_prefixes". I thought that would have been a hint <wink>
>
> It's kinda scary that of all the sins against readability committed in my
> function, including isinstance(type(c), type(type)) which I was
> particularly proud of, the only criticism you came up with was that
> chr(45) is hard to read. I'm impressed <grins like a mad thing>

Heh! I know it was obfuscated, and that's why I didn't bother
mentioning the obvious.

> And besides, given how rare such byte-manipulations on ASCII characters
> are in Python, it would be a shame to lose the ability to use '' and ""
> for strings just to avoid calling ord and chr functions.

Agreed. That flexibility is a _huge_ advantage. Definitely not worth
changing anything.

ChrisA

[toc] | [prev] | [next] | [standalone]


#16521

FromTerry Reedy <tjreedy@udel.edu>
Date2011-12-01 21:49 -0500
Message-ID<mailman.3213.1322794170.27778.python-list@python.org>
In reply to#16467
On 11/30/2011 10:49 PM, Matt Joiner wrote:
> def possible_names():
>      yield "foo"
>      for i in range(20):
>          yield "foo-" + str(i)

This is my favorite -- crystal clear with only the variable part 
variable. And it works in both 2.x and 3.x.

-- 
Terry Jan Reedy

[toc] | [prev] | [next] | [standalone]


#16527

FromMatt Joiner <anacrolix@gmail.com>
Date2011-12-02 16:11 +1100
Message-ID<mailman.3217.1322802691.27778.python-list@python.org>
In reply to#16467
Thank you. ಠ_ಠ

On Fri, Dec 2, 2011 at 1:49 PM, Terry Reedy <tjreedy@udel.edu> wrote:
> On 11/30/2011 10:49 PM, Matt Joiner wrote:
>>
>> def possible_names():
>>     yield "foo"
>>     for i in range(20):
>>         yield "foo-" + str(i)
>
>
> This is my favorite -- crystal clear with only the variable part variable.
> And it works in both 2.x and 3.x.
>
> --
> Terry Jan Reedy
>
> --
> http://mail.python.org/mailman/listinfo/python-list

[toc] | [prev] | [next] | [standalone]


#16558

FromChris Hulan <chris.hulan@gmail.com>
Date2011-12-02 09:20 -0800
Message-ID<31721129.458.1322846439035.JavaMail.geo-discussion-forums@prjr26>
In reply to#16467
I'd just look a the unit tests for clarification/examples

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web