[Python-3000] default argument surprises

Chris Rebert cvrebert at gmail.com
Wed Aug 27 20:25:07 CEST 2008


On Wed, Aug 27, 2008 at 11:01 AM, Brett Cannon <brett at python.org> wrote:
> On Wed, Aug 27, 2008 at 9:29 AM, Sam Bishop <samuel.j.bishop at gmail.com> wrote:
>> On Tue, Aug 26, 2008 at 8:31 PM, Chris Rebert <cvrebert at gmail.com> wrote:
>>> You might then be interested in the following related discussions from
>>> last year wherein I proposed something extremely similar:
>>>
>>> [Python-ideas] proto-PEP: Fixing Non-constant Default Arguments
>>> http://mail.python.org/pipermail/python-ideas/2007-January/000121.html
>>>
>>> [Python-3000] pre-PEP: Default Argument Expressions
>>> http://mail.python.org/pipermail/python-3000/2007-February/005712.html
>>
>> Hmm...  That's too bad.  I like your PEP.  :)
>>
>> I disagree with Guido's comment about this being related to class
>> variables, from a newbie's point of view anyway.  Classes introduce a
>> namespace and functions introduce a scope.  What surprises me is that
>> functions seem to introduce two scopes: one for variables declared as
>> formal parameters and one for variables assigned to within the
>> function.
>>
>
> But the point is that this is a newbie POV that is based on a
> misunderstanding. It's going to be nearly impossible to remove all
> possible gotchas from the language based on what a proto-typical
> newbie might get tripped up on when it is based on a misunderstanding.
> If you don't view everything but function/method bodies as executed
> code, then you have a misconception about how Python works.
>
> Perhaps this can be better explained in the tutorial or language
> reference. But because something is not being communicated well by the
> documentation does not mean it needs to be changed.
>
> -Brett
>

Normally I'd agree, but in this case there seems to be no significant
advantage to the current behavior over the hypothetical behavior
beyond simply inertia and a slight possible performance advantage.
While the hypothetical behavior would obviate the extremely common
"x=None): if x is None: x = foo" idiom AND prevent the sorts of
confusion that the OP experienced, the current behavior is mostly only
advantageous when using function arguments as caches, except that
there are much better and clearer ways to do these caches!

But anyway, Python 3.0 is already basically closed to further language
modifications, so this discussion is more or less moot. :)

- Chris
========
Follow the path of the Iguana...
Rebertia: http://rebertia.com
Blog: http://blog.rebertia.com


More information about the Python-3000 mailing list