On Thu, 2021-05-20 at 19:00 +0100, Paul Moore wrote: > On Thu, 20 May 2021 at 18:13, Luciano Ramalho <luci...@ramalho.org> > wrote: > > > > I'd like to learn about use cases where `...` (a.k.a. `Ellipsis`) > > is > > not a good sentinel. It's a pickable singleton testable with `is`, > > readily available, and extremely unlikely to appear in a data > > stream. > > Its repr is "Ellipsis". > > Personally, I'm quite tempted by the idea of using ellipsis. It just > sort of feels reasonable (and in the context `def f(x, > optional_arg=...)` it even looks pretty natural). > > But it nevertheless feels like a bit of an abuse - the original point > of ellipsis was for indexing, and in particular complex slices like > a[1:20:2, ..., 3:5]. That usage is common in numpy, as I understand > it, even if it's relatively rare in everyday Python. So while I like > the idea in principle, I'm mildly worried that it's not "the right > thing to do". > > I can't put my ambivalence about the idea any more precisely than > this, unfortunately.
In NumPy we use a "missing argument" sentinel currently. Mainly for things roughly like: def mean(arr, *, axis=np._NoValue): if not hasattr(arr, "mean"): # Not a duck that defines `mean`, coerce to ndarray: arr = np.asarray(arr) if axis is np._NoValue: return arr.mean() return arr.mean(axis=axis) This allows us to add new keyword arguments without breaking backward compatibility. I do not remember if we had particularly important reasons for not wanting to drop the default `None`, or it was just erring on the safe side. In any case, I tend to agree that `Ellipsis` should be considered "user-facing" value. And in the above code, we do not expect anyone to ever call `np.mean(something, axis=np._NoValue)` – its not even accessible – but if the value was `...` then I would expect users to be encouraged to write `np.mean(arr, axis=...)` in normal code. More importantly, I can think of a reasonable "meaning" for `axis=...`! In NumPy `axis=None` (default) returns a scalar, `axis=...` could return a 0-D array. This would borrow meanings that `Ellipsis` carries in indexing. [1] Cheers, Sebastian [1] In such a mental model, it would mean the same as `axis=range(arr.ndim)`. To be clear, NumPy doesn't do this, its just a plausible meaning if it has to continue to juggle scalars and 0-D arrays and wants to be "clearer" about it. > > Paul > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to python-dev-le...@python.org > https://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/ZGMZRGHFXQQZZLKBBZKXXAO65TRB6VYX/ > Code of Conduct: http://python.org/psf/codeofconduct/ > _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/M2X6VMEDFNZ4GA3CLXKXMA56SNCEPX4O/ Code of Conduct: http://python.org/psf/codeofconduct/