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/4821#issuecomment-860244940,https://api.github.com/repos/pydata/xarray/issues/4821,860244940,MDEyOklzc3VlQ29tbWVudDg2MDI0NDk0MA==,5635139,2021-06-13T17:28:13Z,2021-06-13T17:28:13Z,MEMBER,"Yes, we want to replace that test with your test — either in the same test function or a new test function. Though it maybe it should still be a `KeyError`, I think probably it should be. But feel free to submit the PR and it's easiest to review there. Thanks!","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-860240046,https://api.github.com/repos/pydata/xarray/issues/4821,860240046,MDEyOklzc3VlQ29tbWVudDg2MDI0MDA0Ng==,37740986,2021-06-13T16:49:05Z,2021-06-13T16:51:36Z,CONTRIBUTOR,"Ok, I think I understand better now Almost finished, I just have one test that fails currently, it is this one: https://github.com/pydata/xarray/blob/e17cf595c84dffdd73c668f6d945c1b0eeba13d6/xarray/tests/test_dataset.py#L3299-L3306 The error changed from a KeyError to the error that I wrote in the constructor : ``` > raise TypeError(f'The dimension provided is a tuple, you may intended to pass a list') E TypeError: The dimension provided is a tuple, you may intended to pass a list ``` I am not sure what I should do with it, should I delete it ? (Thanks for your help :))","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-859802038,https://api.github.com/repos/pydata/xarray/issues/4821,859802038,MDEyOklzc3VlQ29tbWVudDg1OTgwMjAzOA==,14808389,2021-06-11T19:45:26Z,2021-06-11T19:45:26Z,MEMBER,"here's an example: ```python In [2]: xr.Dataset({""a"": ([(""a"", ""b"")], [1])}) Out[2]: Dimensions: (('a', 'b'): 1) Dimensions without coordinates: ('a', 'b') Data variables: a (('a', 'b')) int64 1 ```","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-859736218,https://api.github.com/repos/pydata/xarray/issues/4821,859736218,MDEyOklzc3VlQ29tbWVudDg1OTczNjIxOA==,37740986,2021-06-11T17:35:28Z,2021-06-11T17:35:28Z,CONTRIBUTOR,"I think I am quite confused by the fact that 'one' dimension can be a tuple (also I couldn't find a way to successfully create a dataset with a dim being a tuple, even by tweaking your example using list) Was it what you imagined for the dataset construction ? (If I understand right, a virtual variable can't be a tuple) ``` def _construct_dataarray(self, name: Hashable) -> ""DataArray"": """"""Construct a DataArray by indexing this dataset"""""" from .dataarray import DataArray try: variable = self._variables[name] except KeyError: if isinstance(name, tuple): raise TypeError(f'The dimension ""{name}"" provided is a tuple, you may be intended to pass it as a list') else: _, name, variable = _get_virtual_variable( self._variables, name, self._level_coords, self.dims ) ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-859690070,https://api.github.com/repos/pydata/xarray/issues/4821,859690070,MDEyOklzc3VlQ29tbWVudDg1OTY5MDA3MA==,5635139,2021-06-11T16:14:15Z,2021-06-11T16:14:15Z,MEMBER,"> If you allow explicitly tuple, doesn't it mean I need to edit this part Yes! > (I find it a little bit weird to give dimensions in list, no ? I thought that generally tuples were more adapted to provide dims) Yes, I feel similarly. For one `xr.Dataset(dict(var=(('a','b'), np.random.rand(3))))` is an error, rather than a one-dimensioned dataset with a single dim called `('a','b')`. But OTOH I can very much empathize with accepting any Hashable for dim names most functions, which includes tuples. So I am fine formalizing this (apart from the constructor). > Can you tell me which test-case I can implement to fulfill all the requirements needed ? I can't think of test cases that I can implement except the one suggested first, and that one passes with the first modification How about a test that checks the example above suggests a list, rather than raising a vanilla `KeyError`? Cheers @thomashirtz ","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-859678312,https://api.github.com/repos/pydata/xarray/issues/4821,859678312,MDEyOklzc3VlQ29tbWVudDg1OTY3ODMxMg==,37740986,2021-06-11T15:56:22Z,2021-06-11T15:56:22Z,CONTRIBUTOR,"You seemed to all agree on the solution 1: > Explicitly allow tuples as dimension and variable names. This is probably the most mypy-compatible, since we use Hashable in lots of places If you allow explicitly tuple, doesn't it mean I need to edit this part (as mentioned by @mathause) : ``` if not isinstance(variables, (list, tuple)): variables = [variables] ``` (I tried and it works well) But you said after : > If it's a tuple, that message can suggest passing it as a list. (I find it a little bit weird to give dimensions in list, no ? I thought that generally tuples were more adapted to provide dims) Can you tell me which test-case I can implement to fulfill all the requirements needed ? I can't think of test cases that I can implement except the one suggested first, and that one passes with the first modification Also the code you mentioned is for one dim, but in this case we can have a list of dims, it does means that I need to do a 'for loop' for checking the existence of the dims, right ? ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-856538266,https://api.github.com/repos/pydata/xarray/issues/4821,856538266,MDEyOklzc3VlQ29tbWVudDg1NjUzODI2Ng==,8579156,2021-06-08T07:43:43Z,2021-06-08T07:43:43Z,CONTRIBUTOR,@thomashirtz Feel free to work on it.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-855287336,https://api.github.com/repos/pydata/xarray/issues/4821,855287336,MDEyOklzc3VlQ29tbWVudDg1NTI4NzMzNg==,5635139,2021-06-05T19:49:24Z,2021-06-05T19:51:19Z,MEMBER,"Great, agree @dcherian . So maybe we: - Check whether the dim exists (there could be a dim with tuple), which is already done in 1371 below - If it doesn't exist, then check whether it's a string before passing it to `_get_virtual_variable` below. If it's a tuple, that message can suggest passing it as a list. - Or we do the check _in_ `_get_virtual_variable`? ```python 1366 def _construct_dataarray(self, name: Hashable) -> ""DataArray"": 1367 """"""Construct a DataArray by indexing this dataset"""""" 1368 from .dataarray import DataArray 1369 1370 try: 1371 variable = self._variables[name] 1372 except KeyError: -> 1373 _, name, variable = _get_virtual_variable( 1374 self._variables, name, self._level_coords, self.dims 1375 ) ``` @thomashirtz changing the labels back! Thanks in advance!","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-855286432,https://api.github.com/repos/pydata/xarray/issues/4821,855286432,MDEyOklzc3VlQ29tbWVudDg1NTI4NjQzMg==,2448579,2021-06-05T19:41:34Z,2021-06-05T19:41:34Z,MEMBER,"I think 2 and 3 become really confusing with `swap_dims` (for e.g.) So my vote is for 1. In all three cases, the solution to this issue is to suggest passing lists in the error message?","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-855278196,https://api.github.com/repos/pydata/xarray/issues/4821,855278196,MDEyOklzc3VlQ29tbWVudDg1NTI3ODE5Ng==,37740986,2021-06-05T18:31:00Z,2021-06-05T19:07:03Z,CONTRIBUTOR,"(@max-sixty , I originally took this one because I wanted to do one more ~easy PR. I just saw you modified the tags, lmk if this one is problematic or if you know other issues I could tackle)","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-855276547,https://api.github.com/repos/pydata/xarray/issues/4821,855276547,MDEyOklzc3VlQ29tbWVudDg1NTI3NjU0Nw==,5635139,2021-06-05T18:16:38Z,2021-06-05T18:16:38Z,MEMBER,"Any thoughts from others on what we should do, of the three options above? CC @pydata/xarray ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-855201627,https://api.github.com/repos/pydata/xarray/issues/4821,855201627,MDEyOklzc3VlQ29tbWVudDg1NTIwMTYyNw==,37740986,2021-06-05T07:54:57Z,2021-06-05T07:54:57Z,CONTRIBUTOR,"@mesejo Do you still work on it ? If not, I am interested to work on it","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-766234825,https://api.github.com/repos/pydata/xarray/issues/4821,766234825,MDEyOklzc3VlQ29tbWVudDc2NjIzNDgyNQ==,14808389,2021-01-23T23:50:40Z,2021-01-23T23:50:53Z,MEMBER,"All of these options are breaking changes so we would probably have to go through a deprecation cycle. 1 might be the most consistent and least confusing, but if we want to keep the current behavior we could require wrapping a `tuple` in another sequence to access dimension names.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-766166088,https://api.github.com/repos/pydata/xarray/issues/4821,766166088,MDEyOklzc3VlQ29tbWVudDc2NjE2NjA4OA==,5635139,2021-01-23T19:26:54Z,2021-01-23T19:26:54Z,MEMBER,"I would propose we either: - Explicitly allow tuples as dimension and variable names. This is probably the most mypy-compatible, since we use `Hashable` in lots of places - Force dimension names to be strings, but allow variable names to be `Hashable`. This might be the most practical. - Disallow tuples for dimension names, but otherwise allow `Hashable`. Then tuples work the same as lists when supplied as arguments.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-765891555,https://api.github.com/repos/pydata/xarray/issues/4821,765891555,MDEyOklzc3VlQ29tbWVudDc2NTg5MTU1NQ==,8579156,2021-01-23T08:55:42Z,2021-01-23T08:55:42Z,CONTRIBUTOR,I would like to work on this,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-762710092,https://api.github.com/repos/pydata/xarray/issues/4821,762710092,MDEyOklzc3VlQ29tbWVudDc2MjcxMDA5Mg==,10194086,2021-01-19T09:17:07Z,2021-01-19T09:17:07Z,MEMBER,"Ah yes you are right... However, we are not consistent with this, e.g. that works for reductions `air.mean((""lat"", ""lon""))`","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-762523614,https://api.github.com/repos/pydata/xarray/issues/4821,762523614,MDEyOklzc3VlQ29tbWVudDc2MjUyMzYxNA==,14808389,2021-01-19T00:11:25Z,2021-01-19T00:12:04Z,MEMBER,"I think it's the way it is because `tuple` is hashable, so it can be used as a name: ```python ds = xr.Dataset({(""a"", 0): (""x"", [1, 0])}) ds.sortby((""a"", 0)) ``` not sure if there's a particular use case where supporting this is crucial","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449 https://github.com/pydata/xarray/issues/4821#issuecomment-762521955,https://api.github.com/repos/pydata/xarray/issues/4821,762521955,MDEyOklzc3VlQ29tbWVudDc2MjUyMTk1NQ==,10194086,2021-01-19T00:04:30Z,2021-01-19T00:04:30Z,MEMBER,"Yes, I am marking that as a bug. The problem is here: https://github.com/pydata/xarray/blob/295606707a0464cd13727794a979f5b709cd92a1/xarray/core/dataset.py#L5612-L5613 as the tuple is not a list it ends up as `[('x', 'y')]`. That should probably be ```python if isinstance(variables, str): variables = [variables] ``` or ```python if not isinstance(variables, (list, tuple)): variables = [variables] ``` ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787847449