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/939#issuecomment-300838234,https://api.github.com/repos/pydata/xarray/issues/939,300838234,MDEyOklzc3VlQ29tbWVudDMwMDgzODIzNA==,221526,2017-05-11T16:08:19Z,2017-05-11T16:08:19Z,CONTRIBUTOR,"I agree that having too many keyword arguments is poor design; it's representative of either failing to abstract anything away or having the object/function just do too much. For a specific example, this jumps out to me as a problem:
```python
ds = conventions.decode_cf(
store, mask_and_scale=mask_and_scale, decode_times=decode_times,
concat_characters=concat_characters, decode_coords=decode_coords,
drop_variables=drop_variables)
```
Already `open_dataset` takes 5 parameters just to pass on directly to another function. This means to add a 6th to `decode_cf`, you have to update the code and doctstring there, and then make those same changes to `open_dataset`. Now, you could argue that they're used again within the function *within* `open_dataset`
```python
token = tokenize(file_arg, group, decode_cf, mask_and_scale,
decode_times, concat_characters, decode_coords,
engine, chunks, drop_variables)
```
but again you're using all of these parameters together. If all of these variable values are needed to define the state, you already have an implicit object in your code; you're just not using the language syntax to help you by encapsulating it.
I'd be in favor of having lightweight classes (essentially mutable named tuples) vs. dictionaries. The former allows more discoverability to the interface (i.e. tab completion in IPython) as well as better up-front error checking (you could use `__slots__` to permit only certain attributes). My experience with assembling dictionaries for options is a world of typo-prone pain; trying to prevent that is especially important when teaching new users. You could still give this class the right hooks (e.g. `__iter__`, `asdict`) to allow it to be passed as `**kwargs` to `decode_cf`.","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,169274464