<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 17, 2014 at 5:59 AM, Pauli Virtanen <span dir="ltr"><<a href="mailto:pav@iki.fi" target="_blank">pav@iki.fi</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Julian Taylor <jtaylor.debian <at> <a href="http://googlemail.com" target="_blank">googlemail.com</a>> writes:<br>


[clip]<br>
<div class="im">> - inconvenience in dealing with strings in python 3.<br>
><br>
> bytes are not strings in python3 which means ascii data is either a byte<br>
> array which can be inconvenient to deal with or 4 byte unicode which<br>
> wastes space.<br>
><br>
> A proposal to fix this would be to add a one or two byte dtype with a specific<br>
> encoding that behaves similar to bytes but converts to string when outputting<br>
> to python for comparisons etc.<br>
><br>
> For backward compatibility we *cannot* change S. Maybe we could change<br>
> the meaning of 'a' but it would be safer to add a new dtype, possibly<br>
> 'S' can be deprecated in favor of 'B' when we have a specific encoding dtype.<br>
><br>
> The main issue is probably: is it worth it and who does the work?<br>
<br>
</div>I don't think this is a good idea: the bytes vs. unicode separation in<br>
Python 3 exists for a good reason. If unicode is not needed, why not just<br>
use the bytes data type throughout the program?<br></blockquote><div><br></div><div>I've been playing around with porting a stack of analysis libraries to Python 3 and this is a very timely thread and comment.  What I discovered right away is that all the string data coming from binary HDF5 files show up (as expected) as 'S' type,, but that trying to make everything actually work in Python 3 without converting to 'U' is a big mess of whack-a-mole.  </div>

<div><br></div><div>Yes, it's possible to change my libraries to use bytestring literals everywhere, but the Python 3 user experience becomes horrible because to interact with the data all downstream applications need to use bytestring literals everywhere.  E.g. doing a simple filter like `string_array == 'foo'` doesn't work, and this will break all existing code when trying to run in Python 3.  And every time you try to print something it has this horrible "b" in front.  Ugly, and it just won't work well in the end.</div>

<div><br></div><div>Following the excellent advice at <a href="http://nedbatchelder.com/text/unipain.html">http://nedbatchelder.com/text/unipain.html</a>, I've come to the conclusion that the only way to support Python 3 is to bite the bullet and do the "unicode sandwich".  That is to say convert all external bytestring values to 'U' arrays for internal (and user) manipulation, and back to 'S' for delivery to files / network etc.  This is a pain and very inefficient, but at least the the Python 3 user experience is natural and pleasant.  I figure if you are manipulating anything less than ~Gb of text data then it won't be a disaster.</div>

<div><br></div><div>The upshot from this is that I would be very much in favor of solutions that address the inefficiency issue of using 4 bytes / character in the common use-case of pure-ASCII strings.  Right now this is the single biggest issue I see for migrating to Python 3.  Otherwise making the code python 2 / 3 compatible wasn't too difficult.</div>

<div><br></div><div>- Tom</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
(Also, assuming that ASCII is in general good for text-format data is<br>
quite US-centric.)<br>
<div class="im"><br>
Christopher Barker wrote:<br>
><br>
> How do you spell the dtype that 'S' give you????<br>
><br>
<br>
</div>'S' is bytes.<br>
<br>
dtype='S', dtype=bytes, and dtype=np.bytes_ are all equivalent.<br>
<span class=""><font color="#888888"><br>
--<br>
Pauli Virtanen<br>
</font></span><div class=""><div class="h5"><br>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div><br></div></div>