7 ms·
I've never understood peoples confusion about function defaults. They are part of function definition, they aren't in the function body. You should expect them
by njharman 2y ago
I've never understood peoples confusion about function defaults.
They are part of function definition, they aren't in the function body. You should expect them to be "executed" when the function is defined.
- Scarblac 2y agoOr they could have been part of the function call, and run when the function is called without that argument.
- klyrs 2y agoYou want Python to be how much slower now?
- Scarblac 2y agoThis isn't about what I want, just noting that the other way around could sound just as intuitive. Anyway, it's awfully slow already, how much can it hurt ;-)
- kerkeslager 2y agoThis is a terrible excuse. Quickly doing the wrong thing isn't optimization.
- klyrs 2y agoThe language spec isn't wrong, you just don't like it.
- kerkeslager 2y agoThe language spec isn't right you just like it. Sure, there are a lot of subjective aesthetics that go into the spec, but in this case, there are objective reasons for not liking this. It's a well-known footgun that causes bugs. And it's almost never what you want, so you end up doing something like this: def f(xs = None): # Are these two lines actually faster than the # interpreter creating defaults at call time? if xs is None: xs = [] ... Do you have any reasons at all for defending this decision?
- klyrs 2y ago> # Are these two lines actually faster than the # interpreter creating defaults at call time? You're proposing that the interpreter add a check for every default parameter in every function signature; that it should optionally fire off arbitrary code for each and every one. And when you consider that high-performance Python involves writing C extensions, your proposal would be to move that check out of the compiled code and into the slow interpreted space is, yes, a major performance hit.
- kerkeslager 2y ago> You're proposing that the interpreter add a check for every default parameter in every function signature No, that's not what I'm proposing. Why would it check anything? Just evaluate the given default expression at call time. If you don't want the overhead of an expression, don't put a default. You can also do defaults like: LIST_OF_X = [] def foo(xs = LIST_OF_X): ... ...if you want the other behavior. This does add a variable lookup (oh no!).
- klyrs 2y agoYour list there is mutable. Isn't that what you meant to solve with this?
- kerkeslager 2y agoUgh. You're just ignoring my entire post except the one part where you (wrongly) think you can correct me? The code I posted is showing how you can explicitly get the mutable behavior if you want it when the default expressions are evaluated at call time. That is to say, if you evaluate default expressions at call time, you can get either behavior by being explicit with minimal loss in performance: def foo(xs = []): xs.append(1) print(xs) # always prints [1] DEFAULT = [] def bar(xs = DEFAULT): xs.append(1) print(xs) # prints [1], [1,1], [1,1,1], etc. To reiterate, the above code is what would happen if default expressions were evaluated at function call time. You're clearly not as knowledgeable as you think you are on this and you're just cherry picking things you don't understand to feel smart.