issue_comments
15 rows where issue = 485708282 sorted by updated_at descending
This data as json, CSV (advanced)
Suggested facets: reactions, created_at (date), updated_at (date)
issue 1
- Stateful user-defined accessors · 15 ✖
id | html_url | issue_url | node_id | user | created_at | updated_at ▲ | author_association | body | reactions | performed_via_github_app | issue |
---|---|---|---|---|---|---|---|---|---|---|---|
539465775 | https://github.com/pydata/xarray/issues/3268#issuecomment-539465775 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzOTQ2NTc3NQ== | gmaze 1956032 | 2019-10-08T11:13:25Z | 2019-10-08T11:13:25Z | CONTRIBUTOR | Alright, I think I get it, thanks for the clarification @crusaderky |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
539463105 | https://github.com/pydata/xarray/issues/3268#issuecomment-539463105 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzOTQ2MzEwNQ== | crusaderky 6213168 | 2019-10-08T11:04:06Z | 2019-10-08T11:04:06Z | MEMBER | Thing is, the whole thing is undefined. What does the accessor state contain? As a xarray developer, I don't know. Is it variable names? Is it references to objects that make up the Dataset, e.g. Variables or the attrs dict? Is it objects whose contents rely on the current state of the Dataset, e.g. aggregated measures? Is it objects whose contents rely on historical events (like in your case)? Dataset.copy() will create a copy of everything up to and excluding the numpy arrays. In order to allow you to retain accessor state, we'd need to plant a hook in it and invoke some agreed duck-type API in your object that basically states, "I called copy(), and this is the new object I created, please create a copy of yourself accordingly making extra sure you don't retain references to components of the previous object". And then there are all the other methods that currently nuke the accessor state - including many in-place ones - because they could potentially invalidate it. What should they do? Invoke a special API on the accessor? If not, why should copy() trigger special accessor API and e.g. roll() shouldn't? Planting accessor-refresher hooks in every single method that currently just wipes it away is out of question as it would need to be almost everywhere and - more importantly - it would be born broken. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
539383066 | https://github.com/pydata/xarray/issues/3268#issuecomment-539383066 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzOTM4MzA2Ng== | gmaze 1956032 | 2019-10-08T07:28:07Z | 2019-10-08T07:28:07Z | CONTRIBUTOR | Ok, I get it. Probably the accessor is not the best solution in my case. And yes, an attribute was in fact my first implementation of the add/clean idea. But I was afraid it would be less reliable than the internal list over a long term perspective (but that was before getting in the troubles described above). But why is asking accessor developers to define a copy method an issue ? That wouldn't be mandatory but only required in situations where propagating functional informations could be useful. Sorry if that's a naive question for you guys. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
539240950 | https://github.com/pydata/xarray/issues/3268#issuecomment-539240950 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzOTI0MDk1MA== | crusaderky 6213168 | 2019-10-07T23:03:28Z | 2019-10-07T23:04:25Z | MEMBER |
It's been discussed above in this same thread. It's impossible without breaking the accessor API, as it would require you (the accessor developer) to define a copy method. The more high level discussion is that the statefulness of the accessor is something that is OK to use for caching and performance improvements, and not OK for storing functional information like yours. Have you considered storing a flag in ```python
``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
539174999 | https://github.com/pydata/xarray/issues/3268#issuecomment-539174999 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzOTE3NDk5OQ== | gmaze 1956032 | 2019-10-07T19:49:41Z | 2019-10-07T19:49:41Z | CONTRIBUTOR | @crusaderky thanks for the explanation, that's a solution to my pb. Although I understand that since accessor will be created from scratch, a dataset copy won't propagate the accessor properties (in this case the list of added variables): ```python ds = xarray.Dataset() ds['ext_data'] = xarray.DataArray(1.) my_estimator = BaseEstimator() # With "clean" method from @crusaderky ds.my_accessor.fit(my_estimator, x=2.) ds.my_accessor.transform(my_estimator, y=3.) ds2 = ds.copy() ds = ds.my_accessor.clean() ds2 = ds2.my_accessor.clean() print(ds.data_vars)
print(ds2.data_vars)
Would that make any sense that the xr.DataSet.copy() method also return a copy of the accessors ? |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
538577126 | https://github.com/pydata/xarray/issues/3268#issuecomment-538577126 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzODU3NzEyNg== | crusaderky 6213168 | 2019-10-04T22:14:38Z | 2019-10-04T22:16:03Z | MEMBER | @gmaze |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
538461456 | https://github.com/pydata/xarray/issues/3268#issuecomment-538461456 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUzODQ2MTQ1Ng== | gmaze 1956032 | 2019-10-04T16:07:21Z | 2019-10-04T16:09:00Z | CONTRIBUTOR | Hi all, I recently encountered an issue that look like this with accessor, but not sure. Here is a peace of code that reproduces the issue. Starting from a class with the core of the code and an accessor to implement the user API: ``` python import xarray class BaseEstimator(): def fit(self, this_ds, x=None): # Do something with this_ds: x = x**2 # and create a new array with results: da = xarray.DataArray(x).rename('fit_data') # Return results: return da
@xarray.register_dataset_accessor('my_accessor') class Foo: def init(self, obj): self.obj = obj self.added = list()
``` Now if we consider this workflow: ``` python ds = xarray.Dataset() ds['ext_data'] = xarray.DataArray(1.) my_estimator = BaseEstimator() ds = ds.my_accessor.fit(my_estimator, x=2.) print("Before clean:") print("xr.DataSet var :", list(ds.data_vars)) print("accessor.obj var:", list(ds.my_accessor.obj.data_vars)) print("\nAfter clean:") ds.my_accessor.clean() # This does nothing to ds but clean the accessor.objds = ds.my_accessor.clean() # Cleaning ok for both ds and accessor.objds_clean = ds.my_accessor.clean() # Cleaning ok on new ds, does nothing to ds as expected but clean in accessor.obj
print("xr.DataSet var :", list(ds.data_vars))
print("accessor.obj var :", list(ds.my_accessor.obj.data_vars))
print("Cleaned xr.DataSet var:", list(ds_clean.data_vars))
After clean: xr.DataSet var : ['ext_data', 'fit_data'] accessor.obj var : ['ext_data'] Cleaned xr.DataSet var: ['ext_data'] ``` The issue is clear here: the base space dataset has the 'fit_data' variable but not the accessor object: they've been "disconnected" and it's not apparent to users. So if users later proceed to run the "transform":
Sorry for this long post, I'm not sure it's relevant to this issue but it seems so to me. I don't see a solution to this from the accessor developer side, except for not "interfering" with the content of the accessed object. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525404631 | https://github.com/pydata/xarray/issues/3268#issuecomment-525404631 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTQwNDYzMQ== | dopplershift 221526 | 2019-08-27T17:32:32Z | 2019-08-27T17:32:32Z | CONTRIBUTOR | I don't mind needing to update our accessor code. My only request is don't have a version that suddenly breaks it so that we only work on the old version or the new version. 😉 |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525377722 | https://github.com/pydata/xarray/issues/3268#issuecomment-525377722 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTM3NzcyMg== | shoyer 1217238 | 2019-08-27T16:22:44Z | 2019-08-27T16:22:44Z | MEMBER | It isn't just methods that use Accessors are also not preserved when indexing a DataArray out of a Dataset (https://github.com/pydata/xarray/issues/3205), cc @djhoese. I had not contemplated the issue of circular references, which I agree is not ideal. If we had realized that when creating accessors in the first place we might have chosen a different design, but there are a number of users who rely upon it.
I like the look of this solution. It will still require users to update their code to avoid circular references (e.g., by removing their own |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525268978 | https://github.com/pydata/xarray/issues/3268#issuecomment-525268978 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI2ODk3OA== | fmaussion 10050469 | 2019-08-27T12:00:02Z | 2019-08-27T12:00:02Z | MEMBER |
Yes, although I never bothered to get this done (my library is quite niche and not mean to become widely used), but if we remove the caching mechanism in xarray, it would be one more incentive to make the switch.
Yes. In almost all use cases I know of this won't happen. Typically, the users have to create (or open) an xarray object that salem understands before calling the accessor anyway.
No. I didn't think about that before today ;-). But you are right: if users of salem's accessor change the coordinates after calling the accessor, then bad things might happen. Experience shows that this rarely happens (never happened to me), but I can see how this can fire back. Altogether, these are good arguments to remove the caching mechanism I believe. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525260148 | https://github.com/pydata/xarray/issues/3268#issuecomment-525260148 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI2MDE0OA== | crusaderky 6213168 | 2019-08-27T11:30:22Z | 2019-08-27T11:32:13Z | MEMBER | The circular reference issue could also be worked around in a user-friendly way by having the decorator automatically add methods to the decorated class, copying the design of ```python import weakref class C: def init(self, owner): self._owner = weakref.ref(owner) if hasattr(self, "post_init"): self.post_init()
``` This would also allow for shallow copies to change the pointer. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525257435 | https://github.com/pydata/xarray/issues/3268#issuecomment-525257435 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI1NzQzNQ== | crusaderky 6213168 | 2019-08-27T11:20:50Z | 2019-08-27T11:21:14Z | MEMBER |
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525256306 | https://github.com/pydata/xarray/issues/3268#issuecomment-525256306 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI1NjMwNg== | crusaderky 6213168 | 2019-08-27T11:16:48Z | 2019-08-27T11:16:48Z | MEMBER | @fmaussion could you change your accessor code to store its state in |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525252528 | https://github.com/pydata/xarray/issues/3268#issuecomment-525252528 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI1MjUyOA== | fmaussion 10050469 | 2019-08-27T11:03:47Z | 2019-08-27T11:04:10Z | MEMBER | Interesting, thanks! As an accessor maintainer, I can ensure that at least one accessor implementation is storing state ;-). But this state is based on the xarray object itself: for example, we derive georeferencing information and store the names of the coordinate variabless we know are going to be useful to us later. That is, every new call to Getting rid of the caching logic would mean some performance loss to us, yes, but I don't know if it's "worse" than the circular reference issue you describe or not. |
{ "total_count": 1, "+1": 0, "-1": 0, "laugh": 1, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 | |
525240363 | https://github.com/pydata/xarray/issues/3268#issuecomment-525240363 | https://api.github.com/repos/pydata/xarray/issues/3268 | MDEyOklzc3VlQ29tbWVudDUyNTI0MDM2Mw== | crusaderky 6213168 | 2019-08-27T10:24:38Z | 2019-08-27T10:24:38Z | MEMBER | Demonstation on the circular reference issue: ```python import gc import weakref import xarray class C: pass @xarray.register_dataset_accessor('foo') class Foo: def init(self, obj): self.obj = obj ds = xarray.Dataset() w = weakref.ref(ds) print("No accessor, in scope:", w() is not None) del ds print("No accessor, descoped:", w() is not None) ds = xarray.Dataset()
ds.foo
w = weakref.ref(ds)
print("with accessor, in scope:", w() is not None)
del ds
print("with accessor, descoped:", w() is not None)
gc.collect()
print("with accessor, after gc pass:", w() is not None)
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
Stateful user-defined accessors 485708282 |
Advanced export
JSON shape: default, array, newline-delimited, object
CREATE TABLE [issue_comments] ( [html_url] TEXT, [issue_url] TEXT, [id] INTEGER PRIMARY KEY, [node_id] TEXT, [user] INTEGER REFERENCES [users]([id]), [created_at] TEXT, [updated_at] TEXT, [author_association] TEXT, [body] TEXT, [reactions] TEXT, [performed_via_github_app] TEXT, [issue] INTEGER REFERENCES [issues]([id]) ); CREATE INDEX [idx_issue_comments_issue] ON [issue_comments] ([issue]); CREATE INDEX [idx_issue_comments_user] ON [issue_comments] ([user]);
user 5