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,
Interesting -- do you know what ... means in that context?
In NumPy, the ellipsis means "fill in as many dimensions as needed (with full range)".
I am in the same boat here in that until now I saw Ellipsis as a thing used by numpy and adjacent libraries in slicing. I don't think I have ever written a slice with "..." in it so please forgive any ignorance but wasn't the reason for having Ellipsis originally that None already had a special meaning to the slice object and a different sentinel was needed? In other words the normal case of a missing argument being None caused specific side effects that needed to be skipped, so a sentinel was created to distinguish these cases, just like we are discussing for other objects? It seems to me the current situation has more in common than not. Numpy could have created its own Sentinel object for its own use in these sliceses, just as it now creates its own Sentinel for NoValue, but somewhere along the way it was determined to be in the better interest of the community to have this object defined in the standard library so it could be shared by multiple scientific libraries without additional dependency burden, even though it had no use to CPython.
I think there was perhaps a time when Ellipsis was so closely tied to the scientific libraries that recommending its use anywhere else would have been a poor idea, probably mostly because of the body of existing teaching around its use; but I also think that association is no longer as strong. "..." is being adopted across the typing landscape with several PEPs, such as 483, outlining their special meaning in annotations. In addition, stub files have since the beginning normalized on putting "..." as the function body despite already having the working conventions of `pass` `NotImplemented` or just a good old empty docstring """""" filling the same purpose in standard python files.