default value in __init__

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Oct 11 05:41:17 EDT 2008


On Fri, 10 Oct 2008 06:20:35 -0700, bearophileHUGS wrote:

>> I don't think simply re-executing the default argument expression on
>> each call works either: that would confuse at least as many people as
>> the current system.
> 
> May I ask you why? I think I don't agree, but I am not sure.

x = 100
def foo(a, b=x):
    return a+b

first = foo(1)
x = 101
second = foo(1)

assert first == second


I think people will be rightly surprised that this fails.




>> It would be possible, but extremely annoying to limit default arguments
>> to being literal constants,
> 
> This is a possible solution, beside re-executing the default argument
> expression on each call.

That's no solution at all, because default arguments should not be 
limited to literal constants. That's unacceptable in my opinion.



>> unless you invent some kind of scheme for declaring that a type is safe
>> to use as a default argument.
> 
> Well, it seems functional-style programming may become more common in
> the future, and seeing languages like Scala, etc, maybe it can be useful
> to add to Python some way to define immutable classes (in an explicit
> way). Maybe subclasses of Immutable?

You're still assuming that the behaviour is a bug. It's not, it's a 
feature.


>> Even if you could change the behaviour of default arguments we would
>> still get equivalent regular questions from the people who initialise
>> class attributes with lists or dictionaries.
> 
> I have seen professional programmers too use class attributes instead of
> instance ones...

That's only a mistake if you don't mean to use class attributes instead 
of instance attributes.



-- 
Steven



More information about the Python-list mailing list