Steven D'Aprano ""If param is missing **or None**, the default if blah..."
I reject Chris' characterisation of this as a hack. There are function parameters where None will *never* in any conceivable circumstances become a valid argument value, and it is safe to use it as a sentinel." Yes, we know *why* the hack works. We're all familiar with it. That doesn't mean it's not a hack. The bottom line is: you *don't actually* want the parameter to default to the value of a sentinel. you *have* to use that hack because you can't express what you want the default to actually be. You're doing something misleading to work around a shortcoming of the language. That's a hack. You have to write something that you don't actually intend. On Wednesday, December 1, 2021 at 9:39:12 PM UTC-6 Steven D'Aprano wrote: > On Wed, Dec 01, 2021 at 05:16:34PM +1100, Chris Angelico wrote: > > > 1) If this feature existed in Python 3.11 exactly as described, would > > you use it? > > Yes I would, but probably not as often as counting cases of the "if > param is None: ..." idiom might lead you to expect. > > The problem is, as Neil also pointed out, that it becomes tricky to > explicitly ask for the default behaviour except by leaving the argument > out altogether. Not impossible, as Chris mentions elsewhere, you can > mess about with `*args` or `**kwargs`, but it is decidedly less > convenient, more verbose, and likely to have a performance hit. > > So if I were messing about in the interactive interpreter, I would > totally use this for the convenience: > > def func(L=>[]): ... > > but if I were writing a library, I reckon that probably at least half > the time I'll stick to the old idiom so I can document the parameter: > > "If param is missing **or None**, the default if blah..." > > I reject Chris' characterisation of this as a hack. There are function > parameters where None will *never* in any conceivable circumstances > become a valid argument value, and it is safe to use it as a sentinel. > > For example, I have a function that takes a `collation=None` parameter. > The collation is a sequence of characters, usually a string. Using None > to indicate "use the default collation" will never conflict with some > possible future use of "use None as the actual collation" because None > is not a sequence of characters. > > In this specific case, my function's current signature is: > > def itoa(n, base, > collation=None, > plus='', > minus='-', > width=0, > ): > > I could re-write it as: > > def itoa(n, base, > collation=>_default_collation(base), > plus='', > minus='-', > width=0, > ): > > but that would lose the ability to explicitly say "use the default > collation" by passing None. So I think that, on balance, I would > likely stick to the existing idiom for this function. > > On the other hand, if None were a valid value, so the signature used a > private and undocumented sentinel: > > collation=_MISSING > > (and I've used that many times in other functions) then I would be > likely to swap to this feature and drop the private sentinel. > > > > 2) Independently: Is the syntactic distinction between "=" and "=>" a > > cognitive burden? > > I think you know my opinion on the `=>` syntax :-) > > I shall not belabour it further here. I reserve the right to belabour it > later on :-) > > > > 3) If "yes" to question 1, would you use it for any/all of (a) mutable > > defaults, (b) referencing things that might have changed, (c) > > referencing other arguments, (d) something else? > > Any of the above. > > > > > 4) If "no" to question 1, is there some other spelling or other small > > change that WOULD mean you would use it? (Some examples in the PEP.) > > There's lots of Python features that I use even though I don't like the > spelling. Not a day goes by that I don't wish we spelled the base class > of the object hierarchy "Object", so it were easier to distinguish > between Object the base class and object as a generic term for any > object. > > If the Steering Council loves your `=>` syntax then I would disagree > with their decision but still use it. > > > -- > Steve > _______________________________________________ > Python-ideas mailing list -- python...@python.org > To unsubscribe send an email to python-id...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python...@python.org/message/G3V47ST6INLI7Y3C5RZSWVXFLNUTELQT/ > > <https://mail.python.org/archives/list/python-ideas@python.org/message/G3V47ST6INLI7Y3C5RZSWVXFLNUTELQT/> > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/5ZUI2HBXUPXUXSI66YKUFRFRA74DJXOA/ Code of Conduct: http://python.org/psf/codeofconduct/