html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/issues/3959#issuecomment-612598462,https://api.github.com/repos/pydata/xarray/issues/3959,612598462,MDEyOklzc3VlQ29tbWVudDYxMjU5ODQ2Mg==,14808389,2020-04-12T11:11:26Z,2020-04-12T22:18:31Z,MEMBER,"> Is there any reason not to put the name of the type into `attrs` and just switch on that rather than the keys in `data_vars`? Not really, I just thought the variables in the dataset were a way to uniquely identify its variant (i.e. do the validation of the dataset's structure). If you have different means to do so, of course you can use that instead. Re `TypedDict`: the PEP introducing `TypedDict` especially mentions that it is only intended for `Dict[str, Any]` (so no subclasses of `Dict` for `TypedDict`). However, looking at the [code of `TypedDict`](https://github.com/python/cpython/blob/3e0dd3730b5eff7e9ae6fb921aa77cd26efc9e3a/Lib/typing.py#L1795-L1905), we should be able to do something similar for `Dataset`. Edit: we'd still need to convince `mypy` that the custom `TypedDict` is a type... > so I'm curious if that has been discussed much I don't think so? There were a few discussions about subclassing, but I couldn't find anything about static type analysis. It's definitely worth having this discussion, either here (repurposing this issue) or in a new issue.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,597475005 https://github.com/pydata/xarray/issues/3959#issuecomment-612076605,https://api.github.com/repos/pydata/xarray/issues/3959,612076605,MDEyOklzc3VlQ29tbWVudDYxMjA3NjYwNQ==,14808389,2020-04-10T15:23:08Z,2020-04-10T15:56:08Z,MEMBER,"you could emulate the availability of the accessors by checking your variables in the constructor of the accessor using ```python dataset_types = { frozenset(""variable1"", ""variable2""): ""type1"", frozenset(""variable2"", ""variable3""): ""type2"", frozenset(""variable1"", ""variable3""): ""type3"", } def _dataset_type(ds): data_vars = frozenset(ds.data_vars.keys()) return dataset_types[data_vars] @xr.register_dataset_accessor(""type1"") class Type1Accessor: def __init__(self, ds): if _dataset_type(ds) != ""type1"": raise AttributeError(""not a type1 dataset"") self.dataset = ds ``` though now that we have a ""type"" registry, we could also have one accessor, and pass a `kind` parameter to your `analyze` function: ```python def analyze(self, kind=""auto""): analyzers = { ""type1"": _analyze_type1, ""type2"": _analyze_type2, } if kind == ""auto"": kind = self.dataset_type return analyzers.get(kind)(self.dataset) ``` If you just wanted to use static code analysis using e.g. `mypy`, consider using `TypedDict`. I don't know anything about `mypy`, though, so I wasn't able to get it to accept `Dataset` objects instead of `dict`. If someone actually gets this to work, we might be able to provide a `xarray.typing` module to allow something like (but depending on the amount of code needed, this could also fit in the `Cookbook` docs section): ```python from xarray.typing as DatasetType, Coordinate, ArrayType, Int64Type, FloatType class Dataset1(DatasetType): longitude : Coordinate[ArrayType[Float64Type]] latitude : Coordinate[ArrayType[Float64Type]] temperature : ArrayType[Float64Type] def function(ds : Dataset1): # ... return ds ``` and have the type checker validate the structure of the dataset.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,597475005 https://github.com/pydata/xarray/issues/3959#issuecomment-611997039,https://api.github.com/repos/pydata/xarray/issues/3959,611997039,MDEyOklzc3VlQ29tbWVudDYxMTk5NzAzOQ==,14808389,2020-04-10T11:49:32Z,2020-04-10T11:49:32Z,MEMBER,"do you have any control on how the datasets are created? If so, you could provide a factory function (maybe pass in arrays via required kwargs?) that does the checks and describes the required dataset structure in its docstring. >> If you have other questions about dtypes in xarray then please feel free to raise another issue about that. > > Will do. This probably won't happen in the near future, though, since the custom dtypes for `numpy` are still a work in progress ([NEP-40](https://numpy.org/neps/nep-0040-legacy-datatype-impl.html), etc.)","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,597475005