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


Groups > comp.lang.python > #48902

Re: Default Value

Path csiph.com!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder2.hal-mli.net!newsfeed.xs4all.nl!newsfeed3.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail
Return-Path <ian.g.kelly@gmail.com>
X-Original-To python-list@python.org
Delivered-To python-list@mail.python.org
X-Spam-Status OK 0.000
X-Spam-Evidence '*H*': 1.00; '*S*': 0.00; 'programmer': 0.03; 'argument': 0.05; 'explicitly': 0.05; 'mrab': 0.05; 'tree': 0.05; '21,': 0.07; 'cache': 0.07; 'correct.': 0.07; 'method.': 0.07; 'nicely': 0.07; 'pursuing': 0.07; 'see:': 0.07; 'variables': 0.07; '[0,': 0.09; '[1,': 0.09; 'already.': 0.09; 'arguments': 0.09; 'arguments,': 0.09; 'benefits,': 0.09; 'calls.': 0.09; 'falls': 0.09; 'happens.': 0.09; 'literal': 0.09; 'logic': 0.09; 'lst': 0.09; 'means,': 0.09; 'override': 0.09; 'thrown': 0.09; 'type,': 0.09; 'python': 0.11; 'def': 0.12; 'language,': 0.12; 'assume': 0.14; '(unlike': 0.16; 'already,': 0.16; 'approaches.': 0.16; 'buggy': 0.16; 'callable': 0.16; 'child.': 0.16; 'confuse': 0.16; 'dict': 0.16; 'dictionary,': 0.16; 'docs.': 0.16; 'effect,': 0.16; 'enlighten': 0.16; 'example?': 0.16; 'fine.': 0.16; 'fits': 0.16; 'foo()': 0.16; 'hashable,': 0.16; "he'll": 0.16; 'hell.': 0.16; 'iterating': 0.16; 'iteration': 0.16; 'loop.': 0.16; 'loops': 0.16; 'merely': 0.16; 'mutable': 0.16; 'readability': 0.16; 'scope.': 0.16; 'simple.': 0.16; 'subroutine': 0.16; 'successive': 0.16; 'surprises': 0.16; 'typeerror:': 0.16; 'unhashable': 0.16; 'user-defined': 0.16; 'exception': 0.16; 'modification': 0.16; ':-)': 0.16; 'ignore': 0.16; 'language': 0.16; 'fix': 0.17; 'wrote:': 0.18; 'trying': 0.19; "python's": 0.19; 'work,': 0.20; 'seems': 0.21; '>>>': 0.22; 'this?': 0.23; "aren't": 0.24; 'exists': 0.24; 'finally,': 0.24; 'passes': 0.24; "shouldn't": 0.24; 'question': 0.24; "i've": 0.25; 'second': 0.26; 'pass': 0.26; 'certain': 0.27; 'values': 0.27; 'header:In-Reply-To:1': 0.27; 'point': 0.28; 'function': 0.29; 'correct': 0.29; '[1]': 0.29; 'nature': 0.30; 'relative': 0.30; 'then.': 0.30; 'waste': 0.30; 'especially': 0.30; 'message-id:@mail.gmail.com': 0.30; "i'm": 0.30; 'url:mailman': 0.30; 'code': 0.31; '"",': 0.31; '"do': 0.31; 'argue': 0.31; 'breaking': 0.31; 'default,': 0.31; 'equality': 0.31; 'explained': 0.31; 'keys': 0.31; 'file': 0.32; 'class': 0.32; 'interface': 0.32; 'another': 0.32; 'quite': 0.32; 'believe': 0.68; 'brain': 0.68; 'lose': 0.68; 'readers': 0.68; 'reads': 0.68; 'default': 0.69; 'fact,': 0.69; 'enjoy': 0.71; 'safe': 0.72; 'behavior': 0.77; 'hand': 0.80; '"one': 0.84; '(is': 0.84; 'beside': 0.84; 'buddies': 0.84; 'dict()': 0.84; 'does?': 0.84; 'hardly': 0.84; 'idiotic': 0.84; 'rage.': 0.84; 'subject:Value': 0.84; 'wrong!': 0.84; 'yet?': 0.84; 'gift': 0.85; 'happen:': 0.91; 'lazy': 0.91; 'yes!': 0.91; 'imagine': 0.93; 'refuse': 0.93; 'rick': 0.93; 'reproduction': 0.95; '2013': 0.98
DKIM-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=0DzphzqCunGvPc5w6My9mymrrxweIjG/lcqrbedQgzY=; b=m7ozZY076vp3JJ8091cIihCO3xA5kAh+PH5+ji3SIjN2FCeu10N/ZHHcW4AyM0PfRp H3/qTXGjQ+I1HJWab9dNOG3Yk/nlKtDPHfXUJevBhxPkK/I0L+yICqfgAJCm17c3yFL9 hNbBBcFFN0i9eTDLhoKgWoVWlmHChi3qIb56RamQPrt4cdlP3lzzLTg3kflrhnV6zipe L40H5cbVqlALA521MiASSsp+n5xy+hgPJD5+oVLsyxgWX04y0Uwj1R+2+RDf5G5cDJ7/ UcVCdqRnuHzO6NEQsxpGIi5Z7zRuHrg+qkjPL/oShjhu8rlWVRmNt8Xo3WSEXDBVFa/N Yljw==
X-Received by 10.68.247.101 with SMTP id yd5mr14739835pbc.57.1371865141151; Fri, 21 Jun 2013 18:39:01 -0700 (PDT)
MIME-Version 1.0
In-Reply-To <46567a60-bb75-4f22-b968-bf3ccbf35afb@googlegroups.com>
References <7e6361d5-6619-4aaa-adda-8b5f01bde57f@googlegroups.com> <b3d90d37-896c-4c80-8f94-9e046453927c@googlegroups.com> <447dd1c6-1bb2-4276-a109-78d7a067b442@d8g2000pbe.googlegroups.com> <2e92b4c7-31be-40d2-a906-ab19f3630dfa@googlegroups.com> <mailman.3627.1371742717.3114.python-list@python.org> <baf4de3c-e4ff-42c0-8d65-2f6cf825735c@googlegroups.com> <51c477dd$0$29999$c3e8da3$5496439d@news.astraweb.com> <565a1c8f-6fd9-4bab-9834-076eaea527f8@googlegroups.com> <kq23at$i39$1@dont-email.me> <7e1ed740-df18-4978-b11d-8ca9c4b5bd04@googlegroups.com> <kq2o0k$vng$1@dont-email.me> <46567a60-bb75-4f22-b968-bf3ccbf35afb@googlegroups.com>
From Ian Kelly <ian.g.kelly@gmail.com>
Date Fri, 21 Jun 2013 19:38:21 -0600
Subject Re: Default Value
To Python <python-list@python.org>
Content-Type text/plain; charset=ISO-8859-1
X-BeenThere python-list@python.org
X-Mailman-Version 2.1.15
Precedence list
List-Id General discussion list for the Python programming language <python-list.python.org>
List-Unsubscribe <http://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive <http://mail.python.org/pipermail/python-list/>
List-Post <mailto:python-list@python.org>
List-Help <mailto:python-list-request@python.org?subject=help>
List-Subscribe <http://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe>
Newsgroups comp.lang.python
Message-ID <mailman.3680.1371865594.3114.python-list@python.org> (permalink)
Lines 209
NNTP-Posting-Host 2001:888:2000:d::a6
X-Trace 1371865594 news.xs4all.nl 15907 [2001:888:2000:d::a6]:51338
X-Complaints-To abuse@xs4all.nl
Xref csiph.com comp.lang.python:48902

Show key headers only | View raw


On Fri, Jun 21, 2013 at 7:15 PM, Rick Johnson
<rantingrickjohnson@gmail.com> wrote:
>> > Let's imagine for a second if Python allowed mutable keys in
>> > a dictionary,
>> which it does
>
> Am i just to take your word for this? You cannot provide an
> example? Here, allow me to "break the ice":
>
>     # Literal
>     py> d = {[1]:2}
>     Traceback (most recent call last):
>       File "<pyshell#0>", line 1, in <module>
>         d = {[1]:2}
>     TypeError: unhashable type: 'list'
>     # Symbol
>     py> lst = [1]
>     py> d = {lst:2}
>     Traceback (most recent call last):
>       File "<pyshell#2>", line 1, in <module>
>         d = {lst:2}
>     TypeError: unhashable type: 'list'
>
> Hmm, maybe only certain mutables work? Great, more esoteric
> rules! Feel free to enlighten me since i'm not going to
> waste one second of my time pursuing the docs just to learn
> about ANOTHER unintuitive PyWart i have no use for.

The answer to this conundrum is staring you in the face.  Note that
the TypeError complains that you passed it an "unhashable" type, and
not that you passed it a "mutable" type.  If you want to take a
mutable type and make it hashable, just add a __hash__ method.

class HashableList(list):
    def __hash__(self):
        return 42

>>> d = dict()
>>> hl = HashableList(range(5))
>>> hl2 = HashableList(range(6, 10))
>>> d[hl] = 10
>>> d[hl2] = 20
>>> d
{[0, 1, 2, 3, 4]: 10, [6, 7, 8, 9]: 20}

Additionally, instances of user-defined classes are, by default, both
mutable and hashable.  This is safe because equality and hashing for
such objects are by default based on identity.  If you override the
__eq__ method though, then you lose hashability unless you explicitly
override __hash__ as well.
>
>> Now, I don't really believe that you think that the user
>> shouldn't be protected from doing one idiotic thing with
>> mutable dict keys but should be protected from doing
>> another idiotic thing with mutable default arguments,
>> especially as you've already been given a use case for the
>> latter. So I assume that The Benevolent Approach is not
>> the approach you would have gone for if you had designed
>> the language, right? If so then let's ignore it.
>
> You are correct. Finally, we can agree on something.
>
>> > ============================================================
>> >   The Apathetic Approach:
>> > ============================================================
>> > I could just assume that a programmer is responsible for the
>> > code he writes. If he passes mutables into a function as
>> > default arguments, and then mutates the mutable later, too
>> > bad, he'll understand the value of writing solid code after
>> > a few trips to exception Hell.
>>
>> It seems to me that this is exactly what currently happens.
>
> (is this lazy readers day? I swear i explained this earlier)
>
> And here is where you are wrong. In the current implementation
> python functions carry the state of mutable default arguments
> between successive calls. That's a flaw. Observe:
>
>     py> def foo(arg=[]):
>     ...     arg.append(1)
>     ...     print(arg)
>     ...
>     py> foo()
>     [1]
>     py> foo()
>     [1, 1]
>     py> foo()
>     [1, 1, 1]
>
> No, no, NO! That's wrong! Subroutines should be stateless.
> That means that an empty mutable default argument will
> ALWAYS be empty at each call of the subroutine.  This is
> what should happen:
>
>     py> def foo(arg=[]):
>     ...     arg.append(1)
>     ...     print(arg)
>     ...
>     py> foo()
>     [1]
>     py> foo()
>     [1]
>     py> foo()
>     [1]
>
> Yes, Yes, YES! That is intuitive! That is sane! Now, what if
> we pass a reference to a mutable object? What then. Well, let's
> see:
>
>     py> lst = range(5)
>     py> lst
>     [0, 1, 2, 3, 4]
>     py> def foo(arg=lst):
>     ...     arg.append(1)
>     ...     print(arg)
>     ...
>     py> foo()
>     [0, 1, 2, 3, 4, 1]
>     py> foo()
>     [0, 1, 2, 3, 4, 1, 1]
>
> That's fine. Because the object was already created OUTSIDE
> the subroutine. So therefore, modifications to the mutable
> are not breaking the fundamental of statelessness INSIDE
> subroutines. The modification is merely a side effect, and
> the subroutine is unconcerned with anything that exists
> beyond it's own scope.
>
> IS ALL THIS REGISTERING YET? DO YOU UNDERSTAND?
>
>> > ============================================================
>> >   The Malevolent Approach (disguised as beneva-loon-icy):
>> > ============================================================
>> > I could use early binding to confuse the hell out of him and
>> > enjoy the laughs with all my ivory tower buddies as he falls
>> > into fits of confusion and rage. Then enjoy again when he
>> > reads the docs. Ahh, the gift that just keeps on giving!
>> My question was about how you think the language should
>> work, not about what your buddies should or shouldn't
>> enjoy.
>
> My buddies? This design flaw is NOT my brain child. Your
> barking up the wrong tree pal.
>
>> In terms of how a language actually works, is there
>> any difference between The Malevolent Approach and The
>> Apathetic Approach? And is there any difference between
>> either of them and what Python currently does?
>
> I explained this to MRAB already.
>
>> Of course using a mutable default as a cache can be
>> reproduced by other means, as can another common use case
>> that I don't think anyone's mentioned yet (defining
>> functions parametrised by variables whose values aren't
>> known until runtime). That's hardly an argument against it
>> - you might as well argue that Python shouldn't have
>> decorators, or that it shouldn't have for loops because
>> their behaviour can be reproduced with while loops.
>
> Nice attempt at sleight of hand but your logic is clumsy.
>
> Your trying to argue that my use of a "custom callable state
> object" (to avoid the esoteric and unintuitive nature of the
> current implementation of Python "mutable function
> arguments") is somehow only a mere reproduction of the
> function behavior and has no positive benefits, when in
> fact, it has a HUGE direct benefit:
>
>  * AVOIDING A FLAW IN THE LANGUAGE
>
> It also has quite a few positive side effects:
>
>  * CODE ENCAPSULATION
>  * INTERFACE
>  * USING THE CORRECT TOOL FOR THE JOB++
>  * READABILITY
>  * NO HIDDEN SURPRISES
>  * LESS BUGGY
>
> How much more justification do you need?
>
>> or that it shouldn't have for loops because their
>> behaviour can be reproduced with while loops.
>
> Yes, iterating a sequence can be achieved using a "while
> loop", but "for loops" should not be thrown out because they
> offer a specific type of iteration that nicely complements a
> while loop. Plus, for loops do not have any strange side
> effects (unlike Python functions). They do one thing and
> they do damn well! So stop picking on for loops :-)
>
> I want Python functions to also "do one thing and do it
> well", and what is that "one thing" you ask, execute
> subprograms.
>
>> But this is beside the point anyway, until you present an
>> alternative to Python's current behavior. If you do so
>> then we can start debating the relative merits of the two
>> approaches.
>
> The fix is simple. No more "magical Python functions", only
> stateless routines. I've explained this ad nauseam already,
> and until you provide more specific questions on the matter,
> i refuse to reply to any more bombastically general questions.
>
> --
> http://mail.python.org/mailman/listinfo/python-list

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Default Value Ahmed Abdulshafy <abdulshafy@gmail.com> - 2013-06-19 12:17 -0700
  Re: Default Value Jussi Piitulainen <jpiitula@ling.helsinki.fi> - 2013-06-19 22:35 +0300
  Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-19 12:38 -0700
    Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-20 05:57 -0700
      Re: Default Value Roy Smith <roy@panix.com> - 2013-06-20 09:19 -0400
        Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-20 06:31 -0700
        Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 00:17 +0000
          Re: Default Value Roy Smith <roy@panix.com> - 2013-06-20 20:25 -0400
      Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-20 07:49 -0700
        Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-21 01:38 +1000
          Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-20 11:05 -0700
            Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 00:57 +0000
              Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-20 20:16 -0700
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-21 17:10 +1000
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 07:32 -0700
                Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 16:22 +0000
            Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 15:57 +0000
              Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 10:01 -0700
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-21 18:47 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 11:26 -0700
                Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 18:37 +0000
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 12:18 -0700
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 12:35 -0700
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-22 05:07 +1000
                Re: Default Value Neil Cerutti <neilc@norwich.edu> - 2013-06-21 19:20 +0000
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 13:27 -0700
                Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-22 01:31 +0000
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-22 11:40 +1000
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 18:42 -0700
                Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-22 03:04 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 19:32 -0700
                Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-22 20:36 +0100
                Re: Default Value Dennis Lee Bieber <wlfraed@ix.netcom.com> - 2013-06-22 18:51 -0400
                Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-21 19:43 -0700
                Re: Default Value Mark Lawrence <breamoreboy@yahoo.co.uk> - 2013-06-22 09:26 +0100
                Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-21 20:25 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 13:44 -0700
                Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-21 23:49 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 16:51 -0700
                Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-22 02:54 +0100
                Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-22 01:15 +0000
                Re: Default Value Ian Kelly <ian.g.kelly@gmail.com> - 2013-06-21 19:27 -0600
                Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-21 19:32 -0700
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 19:55 -0700
                Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-21 23:23 -0700
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-22 08:07 -0700
                Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-22 08:31 -0700
                Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-22 09:11 -0700
                Re: Default Value Grant Edwards <invalid@invalid.invalid> - 2013-06-24 14:22 +0000
                Re: [SPAM] Re: Default Value MRAB <python@mrabarnett.plus.com> - 2013-06-24 16:22 +0100
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-22 11:41 +1000
                Re: Default Value Michael Torrie <torriem@gmail.com> - 2013-06-21 20:46 -0600
                Re: Default Value Antoon Pardon <antoon.pardon@rece.vub.ac.be> - 2013-06-22 16:40 +0200
                Re: Default Value Dennis Lee Bieber <wlfraed@ix.netcom.com> - 2013-06-22 12:49 -0400
                Re: Default Value Ian Kelly <ian.g.kelly@gmail.com> - 2013-06-22 12:57 -0600
                Re: Default Value Dennis Lee Bieber <wlfraed@ix.netcom.com> - 2013-06-22 18:48 -0400
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-22 00:40 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 18:15 -0700
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-22 11:37 +1000
                Re: Default Value Ian Kelly <ian.g.kelly@gmail.com> - 2013-06-21 19:42 -0600
                Re: Default Value Ian Kelly <ian.g.kelly@gmail.com> - 2013-06-21 19:38 -0600
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 19:40 -0700
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-22 03:01 +0100
                Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-22 12:18 +1000
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-22 03:25 +0100
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-22 18:19 +0100
                Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-22 11:49 -0700
                Re: Default Value Rotwang <sg552@hotmail.co.uk> - 2013-06-23 01:49 +0100
        Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-20 10:12 -0700
          Re: Default Value Chris Angelico <rosuav@gmail.com> - 2013-06-21 03:19 +1000
            Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-20 10:30 -0700
          Re: Default Value Ian Kelly <ian.g.kelly@gmail.com> - 2013-06-20 11:57 -0600
            Re: Default Value rusi <rustompmody@gmail.com> - 2013-06-20 11:15 -0700
            Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 01:08 +0000
              Re: Default Value Tim Chase <python.list@tim.thechases.com> - 2013-06-20 20:26 -0500
                Re: Default Value Roy Smith <roy@panix.com> - 2013-06-20 21:40 -0400
                Re: Default Value Tim Chase <python.list@tim.thechases.com> - 2013-06-20 21:02 -0500
          Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-20 11:07 -0700
            Re: Default Value alex23 <wuwei23@gmail.com> - 2013-06-21 10:55 +1000
          Re: Default Value 88888 Dihedral <dihedral88888@gmail.com> - 2013-06-20 19:18 -0700
          Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 02:26 +0000
          Re: Default Value "Lefavor, Matthew (GSFC-582.0)[MICROTEL LLC]" <matthew.lefavor@nasa.gov> - 2013-06-20 17:28 -0500
            Re: Default Value Rick Johnson <rantingrickjohnson@gmail.com> - 2013-06-21 08:17 -0700
        Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-21 01:28 +0000
  Re: Default Value Gary Herron <gherron@digipen.edu> - 2013-06-19 12:57 -0700
  Re: Default Value Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2013-06-20 01:17 +0000

csiph-web