Closed
Description
Referenced from python/mypy#7818
We use an Ellipsis as an easy-to-understand, easy-to-import sentinel value to mean "everything else".
But it's not possible to use fully with type checking, since mypy doesn't exclude it from a type when it's been excluded with an if
, as it does for None
, or Enum
s per #240). I've moved the issue here since it's apparently a python typing issue rather than a mypy implementation.
I've included below a MCVE of the behavior below, and here's an example of how we use it, given @gvanrossum has already asked whether it's important to use an Ellipsis:
For example, to transpose an array, these are equivalent:
In [1]: import xarray as xr
In [2]: ds = xr.tutorial.scatter_example_dataset()
In [3]: ds
Out[3]:
<xarray.Dataset>
Dimensions: (w: 4, x: 3, y: 11, z: 4)
Coordinates:
* x (x) int64 0 1 2
* y (y) float64 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
* z (z) int64 0 1 2 3
* w (w) <U5 'one' 'two' 'three' 'five'
Data variables:
A (x, y, z, w) float64 0.02074 0.04807 -0.1059 ... -0.1809 -0.04862
B (x, y, z, w) float64 0.0 0.0 0.0 0.0 ... 1.406 1.414 1.368 1.408
In [4]: ds.transpose('w','x','y','z')
Out[4]:
<xarray.Dataset>
Dimensions: (w: 4, x: 3, y: 11, z: 4)
Coordinates:
* x (x) int64 0 1 2
* y (y) float64 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
* z (z) int64 0 1 2 3
* w (w) <U5 'one' 'two' 'three' 'five'
Data variables:
A (w, x, y, z) float64 0.02074 0.02074 0.02074 ... -0.03076 -0.04862
B (w, x, y, z) float64 0.0 0.002074 0.004147 ... 1.403 1.405 1.408
In [5]: ds.transpose('w',...) # use an Ellipsis to indicate 'all other dimensions'
Out[5]:
<xarray.Dataset>
Dimensions: (w: 4, x: 3, y: 11, z: 4)
Coordinates:
* x (x) int64 0 1 2
* y (y) float64 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
* z (z) int64 0 1 2 3
* w (w) <U5 'one' 'two' 'three' 'five'
Data variables:
A (w, x, y, z) float64 0.02074 0.02074 0.02074 ... -0.03076 -0.04862
B (w, x, y, z) float64 0.0 0.002074 0.004147 ... 1.403 1.405 1.408
Code example with existing mypy:
import builtins
from typing import List, Union
def fun(x: Union[builtins.ellipsis, List], y: List):
if x is not Ellipsis:
y = x # error: Incompatible types in assignment (expression has type "Union[ellipsis, List[Any]]", variable has type "List[Any]")
return y
# another attempt:
def fun2(x: Union[Ellipsis, List], y: List): # error: Variable "builtins.Ellipsis" is not valid as a type
if x is not Ellipsis:
y = x
return y
Thank you!