Re: PEP 671 (late-bound arg defaults), next round of discussion!
There was a typo in my post and I want to avoid getting into a pedantic tangent about how to properly indent multi-line function signatures, so hopefully this will "nip it in the bud", so to speak. When I wrote: def my_func( param: Annotation[stuff], other_param: MoreAnnotation[things], another_param: SomeType = default_value, yet_another_param: EvenMoreAnnotation = another_default) -> ReturnType: # code goes here ... I meant the parameter list to be at two indentation levels so it's visually distinguishable from the function body at one indentation level. I accidentally put the parameter list at three indentation levels which happen to align with the open parentheses after `def my_func` which is not what I wanted to suggest as good practice because then functions with long names would have their parameter list indented way far over and it would hurt readability. The following is closer to what I intended: *def my_func( param: Annotation[stuff], other_param: MoreAnnotation[things], another_param: SomeType = default_value, yet_another_param: EvenMoreAnnotation = another_default) -> ReturnType: # code goes here ...* On Thursday, December 2, 2021 at 5:56:36 PM UTC-6 abed...@gmail.com wrote:
If the coder's intent is to have an optional parameter default to an empty
list, the most EXPLICIT way to encode that intent would be to have the optional parameter default to an empty list. It's categorically LESS EXPLICIT to bind the parameter to None and add boilerplate code to the body of the function to correct that.
I think it's a nearly philosophical distinction but right now there is no such thing as “an optional parameter defaulting to an empty list”. Or rather there is, but it's not what you really want “a different empty list for every call of the function”.
It's not philosophical. It's pretty cut and dry: If you want a parameter to default to an empty list, it's objectively more explicit to make the parameter default to an empty list than to make it default to a sentinel value and assign it to an empty list later. Of course that capability doesn't exist yet, that's what this whole discussion is about.
To me, it's not absurd that “creating a new object and binding the
parameter to it” is sufficiently complex that we don't cram it into the function signature. It's fine to just have code in the function body...
It may not be absurd to you, but to me, the function signature is the correct place to put all things related to the function signature, the function body is for business logic. You're argument about "cramming things in the function signature" is more about practical constraints like keeping things on one line which is less important to me than putting things where they belong. You can always expand the signature, which is a practice I wish more people did.
Instead of this:
def my_func(param: Annotation[stuff], other_param: MoreAnnotation[things], another_param: SomeType = default_value, yet_another_param: EvenMoreAnnotation = another_default) -> ReturnType: # code goes here ...
just do this:
def my_func( param: Annotation[stuff], other_param: MoreAnnotation[things], another_param: SomeType = default_value, yet_another_param: EvenMoreAnnotation = another_default) -> ReturnType: # code goes here ...
The repulsion against "cram[ing] [defaults] into the function signature" is more a problem with long function signatures than anything else. You can always use the usual suspects to make it more readable:
instead of this:
def my_func(param: SomeType => long and complicated logic that's hard to read and fits too much in one line) -> ReturnValue: ...
just do this:
def _provide_default() -> SomeType: the same logic as above but more readable and better organized
def my_func(param: SomeType => _provide_default()) -> ReturnValue: ...
especially since there does not seem to be an overwhelming consensus for
either the concept or the proposed syntaxes.
The above explanation of why it's objectively more explicit is not subject to the consensus of the python ideas list. It's a refutation of the argument that current familiar work-arounds are somehow more explicit. That somehow binding to a sentinel is actually an explicit way of "telling the function you want it to provide a default value" rather than a work-around that's so familiar that you no longer even question if it's all that explicit in the first place.
(Also maybe not calling what we have been happily (at least for some of
us) doing for years "a hack" would be a good way to have a more civil discussion)
Why? It's not a personal attack. The whole point is to prod people into rethinking what they've become inured to.
On Thu, Dec 2, 2021 at 3:11 PM Evpok Padding <evpok....@gmail.com> wrote:
On Thu, 2 Dec 2021, 21:48 abed...@gmail.com, <abed...@gmail.com> wrote:
Nicholas Cole "There is nothing that this proposal makes possible that is not already possible with more explicit code."
There's nothing any of Python's syntax makes possible that is not already possible with Brainfuck or any other language that's Turing complete. The current hacks used to get around the lack of late-bound optional parameters aren't more explicit. They just require more code. If the coder's intent is to have an optional parameter default to an empty list, the most EXPLICIT way to encode that intent would be to have the optional parameter default to an empty list. It's categorically LESS EXPLICIT to bind the parameter to None and add boilerplate code to the body of the function to correct that.
I think it's a nearly philosophical distinction but right now there is no such thing as “an optional parameter defaulting to an empty list”. Or rather there is, but it's not what you really want “a different empty list for every call of the function”. To me, it's not absurd that “creating a new object and binding the parameter to it” is sufficiently complex that we don't cram it into the function signature. It's fine to just have code in the function body, especially since there does not seem to be an overwhelming consensus for either the concept or the proposed syntaxes.
(Also maybe not calling what we have been happily (at least for some of us) doing for years "a hack" would be a good way to have a more civil discussion)
Best
E
participants (1)
-
abed...@gmail.com