<div dir="ltr"><a class="gmail_plusreply" id="plusReplyChip-0" href="mailto:mertz@gnosis.cx" tabindex="-1">@David Mertz</a><div> I think I can't explain well my ideas ^^. I'll try to be really detailed so I'm not sure I'm actually saying what I'm thinking.<br></div><div><br></div><div>Let's consider the idea of that Vector class this way :</div><div>Vectors are list of a defined type (may be immutable ?) and adds sugar syntaxing for vectorized operations.</div><div><br></div><div>Based on this small and not complete enough definition, we should be able to apply any function to that vector.</div><div>I identify two ways functions are used with  vectors : it's either applied on the vector as an iterable/list, or on the elements of this vector.</div><div>Thus, we need to be have different notations for those two uses. To keep it coherent with  Python, if a functions is applied on the vector as an iterable,</div><div>the vector is given as a parameter :</div><div><br></div><div>>>> len(v)  # Number of elements in the Vector `v`</div><div><br></div><div>If we want to apply a function on each element of the list, we should then use another notations. So far, several have been proposed. <br></div><div>In the following example showing the different notations, we use the generic way so we can apply it to user-defined functions :</div><div><br></div><div>>>> # Compute the length of each element of the Vector `v`</div><div>>>> v.apply(len)<br></div><div>>>> v @ len<br></div><div><br></div><div>Another example with parameters</div><div>>>> # Replace all "a" by "b"</div><div>>>> v.apply(lambda s: s.replace("a", "b"))</div><div>>>> v @ (lambda s: s.replace("a", "b"))</div><div><br></div><div>My personal opinion is that the two notations feel good. One is standard, the other is not but is less verbose and it's a good point.</div><div><br></div><div>Now that I detailed everything in my brain and by mail, I guess we are just saying the same thing !</div><div><br></div><div>There's something I didn't mention on purpose, it's the use of : `v.lower()`</div><div>I think having special cases of how vectors works is not a good idea : it's confusing.</div><div>If we want the user to be able to use user-defined functions we need a notation. Having something different for some</div><div>of the functions feels weird to me. And obviously, if the user can't use its own functions, this whole thing is pretty useless.</div><div><br></div><div>Tell me if I got anything wrong.</div><div><br></div><div>Nb : I found a way to simplify my previous example using lambda instead of partial. <br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le dim. 3 févr. 2019 à 21:34, David Mertz <<a href="mailto:mertz@gnosis.cx">mertz@gnosis.cx</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">On Sun, Feb 3, 2019 at 3:16 PM Ronald Oussoren <<a href="mailto:ronaldoussoren@mac.com" target="_blank">ronaldoussoren@mac.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><div>The @ operator is meant for matrix multiplication (see PEP 465) and is already used for that in NumPy. IMHO just that is a good enough reason for not using @ as an elementwise application operator (ignoring if having an such an operator is a good idea in the first place).</div></div></div></blockquote><div><br></div><div>Co-opting operators is pretty common in Python.  For example, the `.__div__()` operator spelled '/' is most often used for some kind of numeric division.  Some variations on that, for example vectorized in NumPy.  And different numeric types operate a bit differently.  The name of the magic method obvious suggests division.</div><div><br></div><div>And yet, in the standard library we have pathlib which we can use like this (from the module documentation):</div><div><pre style="overflow:auto hidden;padding:5px;background-color:rgb(238,255,204);color:rgb(51,51,51);line-height:18.528px;border:1px solid rgb(170,204,153);font-family:monospace,sans-serif;font-size:15.44px;border-radius:3px"><span class="gmail-m_6847096720516527619gmail-gp" style="color:rgb(198,93,9);font-weight:bold">>>> </span><span class="gmail-m_6847096720516527619gmail-n">p</span> <span class="gmail-m_6847096720516527619gmail-o" style="color:rgb(102,102,102)">=</span> <span class="gmail-m_6847096720516527619gmail-n">Path</span><span class="gmail-m_6847096720516527619gmail-p">(</span><span class="gmail-m_6847096720516527619gmail-s1" style="color:rgb(64,112,160)">'/etc'</span><span class="gmail-m_6847096720516527619gmail-p">)</span>
<span class="gmail-m_6847096720516527619gmail-gp" style="color:rgb(198,93,9);font-weight:bold">>>> </span><span class="gmail-m_6847096720516527619gmail-n">q</span> <span class="gmail-m_6847096720516527619gmail-o" style="color:rgb(102,102,102)">=</span> <span class="gmail-m_6847096720516527619gmail-n">p</span> <span class="gmail-m_6847096720516527619gmail-o" style="color:rgb(102,102,102)">/</span> <span class="gmail-m_6847096720516527619gmail-s1" style="color:rgb(64,112,160)">'init.d'</span> <span class="gmail-m_6847096720516527619gmail-o" style="color:rgb(102,102,102)">/</span> <span class="gmail-m_6847096720516527619gmail-s1" style="color:rgb(64,112,160)">'reboot'</span></pre></div><div>That use is reasonable and iconic, even if it is nothing like division.</div><div><br></div><div>The `.__mod__()` operator spelled '%' means something very different in relation to a float or int object versus a string object.  I.e. modulo division versus string interpolation.</div><div><br></div><div>I've even seen documentation of some library that coopts `.__matmul__()` to do something with email addresses.  It's not a library I use, just something I once saw the documentation on, so I'm not certain of details.  But you can imagine that e.g. :</div><div><br></div></div><blockquote style="margin:0px 0px 0px 40px;border:medium none;padding:0px"><div class="gmail_quote"><div><font face="monospace, monospace">email = user @ domain</font></div></div></blockquote><div class="gmail_quote"><div><br></div><div>Could be helpful and reasonable (exact behavior and purpose could vary, but it's "something about email" iconically).</div><div><br></div><div>In other words, I'm not opposed to using the @ operator in my stringpy.Vector class out of purity about the meaning of operators.  I just am not convinced that it actually adds anything that is not easier without it.</div><div> </div></div>-- <br><div dir="ltr" class="gmail-m_6847096720516527619gmail_signature">Keeping medicines from the bloodstreams of the sick; food <br>from the bellies of the hungry; books from the hands of the <br>uneducated; technology from the underdeveloped; and putting <br>advocates of freedom in prisons.  Intellectual property is<br>to the 21st century what the slave trade was to the 16th.<br></div></div>
</blockquote></div>