We were discussing on slack about set_probe behavior. I am recaping the points here in case we want to make a decision about it.
Context:
Me and @magland were mentioning that we have been confused about this method. Basically, it returns a new recording with the attached probe instead (as we expected) of setting the probe in the current recording. To achieve the latter, you need to use the in_place keyword.
Now, @alejoe91 mentioned some technical difficulties that are relevant. Basically, for most probe structures, the method can't modify state unless the following condition is met:
|
# create recording : channel slice or clone or self |
|
if in_place: |
|
if not np.array_equal(new_channel_ids, self.get_channel_ids()): |
|
raise Exception("set_probe(inplace=True) must have all channel indices") |
|
sub_recording = self |
|
else: |
|
if np.array_equal(new_channel_ids, self.get_channel_ids()): |
|
sub_recording = self.clone() |
|
else: |
|
sub_recording = self.channel_slice(new_channel_ids) |
So, a true setter method would not be as general.
Then @samuelgarcia mentioned that, in his view, set_probe is following the logic of set_index in pandas with the in_place logic. He believes this is just a matter of documentation and not semantics.
I disagree with that argument for three reasons:
- Even if pandas uses set it is still a bad name. Set methods are the fundamental mutator method, I don't know think they should be added in a fluent interface anyway.
- Pandas has some problems on their own on that regard. See the
SettingWithCopyWarning in stackoverflow and tutorials.
in_place works in whacky ways in Pandas, mantainers have expressed their desire to deprecate the keyword and I don't think we should build on that.
My own proposal would be to make the current set_probe method work like a true setter and fail when this is not possible. We could have another method then that works to build a probe independent of the structure so this always return a new recorder object. That is, in my view, is another method that should work in a fluent interface way. @magland proposed recording.create_new_recording_with_probe(probe=probe) which works very well to me.
Any other suggestions or experiences?
It could be that this is very clear than most people and mine and Jeremy's troubles are statistical flukes.
We were discussing on slack about
set_probebehavior. I am recaping the points here in case we want to make a decision about it.Context:
Me and @magland were mentioning that we have been confused about this method. Basically, it returns a new recording with the attached probe instead (as we expected) of setting the probe in the current recording. To achieve the latter, you need to use the
in_placekeyword.Now, @alejoe91 mentioned some technical difficulties that are relevant. Basically, for most probe structures, the method can't modify state unless the following condition is met:
spikeinterface/src/spikeinterface/core/baserecordingsnippets.py
Lines 176 to 185 in 3291976
So, a
truesetter method would not be as general.Then @samuelgarcia mentioned that, in his view,
set_probeis following the logic ofset_indexin pandas with thein_placelogic. He believes this is just a matter of documentation and not semantics.I disagree with that argument for three reasons:
SettingWithCopyWarningin stackoverflow and tutorials.in_placeworks in whacky ways in Pandas, mantainers have expressed their desire to deprecate the keyword and I don't think we should build on that.My own proposal would be to make the current
set_probemethod work like a true setter and fail when this is not possible. We could have another method then that works to build a probe independent of the structure so this always return a new recorder object. That is, in my view, is another method that should work in a fluent interface way. @magland proposedrecording.create_new_recording_with_probe(probe=probe)which works very well to me.Any other suggestions or experiences?
It could be that this is very clear than most people and mine and Jeremy's troubles are statistical flukes.