Thanks, I rephrased "returns" to "received". I meant the argument received.
In your class B above, you are implicitly assuming that individual indices cannot be tuple:
B()[(1,2) (3,4)] will detect it is multi-index (it receives a len 2 nested tuple),
but B()[(1,2)] will believe it received 2 indices, while it actually was passed only 1 index of size 2.
I am comparing to function, foo(**args) vs. foo[**args], because they are mathematically equivalent (indexing is a function from index space), and share a similar "argument (un)packing" functional feature (and because in the end both are written as methods)
I understand that 1-length tuples have been identified with their scalar value (its single entry), but I find it weird and can't understand why
it makes packing quite different than for usual functions
You can not tell if arguments are "n indices" versus "a single n-tuple index", but python finds that a[1] and a[1,] are different. So if I cannot distinguish and base a decision on, why would others ?
I do not see the problem if getitem was always receiving a tuple regardless of the indexer dimension (keep scalar index wrapped)
So I see what you lose and don't guess what you gain.