On Thu, 2021-05-20 at 19:00 +0100, Paul Moore wrote:
On Thu, 20 May 2021 at 18:13, Luciano Ramalho email@example.com 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. 
 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 -- firstname.lastname@example.org To unsubscribe send an email to email@example.com https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://firstname.lastname@example.org/message/ZGMZRGHF... Code of Conduct: http://python.org/psf/codeofconduct/