<br><br><div class="gmail_quote">On Sun, Nov 23, 2008 at 3:16 PM, Gregory P. Smith <span dir="ltr">&lt;<a href="mailto:greg@krypto.org">greg@krypto.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br><div class="gmail_quote"><div class="Ih2E3d">On Sat, Nov 22, 2008 at 11:51 AM, Brett Cannon <span dir="ltr">&lt;<a href="mailto:brett@python.org" target="_blank">brett@python.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div>On Sat, Nov 22, 2008 at 06:29, Barry Warsaw &lt;<a href="mailto:barry@python.org" target="_blank">barry@python.org</a>&gt; wrote:<br>
&gt; -----BEGIN PGP SIGNED MESSAGE-----<br>
&gt; Hash: SHA1<br>
&gt;<br>
&gt; On Nov 22, 2008, at 4:05 AM, Martin v. L÷wis wrote:<br>
&gt;<br>
&gt;&gt; I just noticed that the Python 3 C API still contains PY_SSIZE_T_CLEAN.<br>
&gt;&gt;<br>
&gt;&gt; This macro was a transition mechanism, to allow extensions to use<br>
&gt;&gt; Py_ssize_t in PyArg_ParseTuple, while allowing other module continue<br>
&gt;&gt; to use int.<br>
&gt;&gt;<br>
&gt;&gt; In Python 3, I would like the mechanism, making Py_ssize_t the only<br>
&gt;&gt; valid data type for size in, say, s# parsers.<br>
&gt;&gt;<br>
&gt;&gt; Is it ok to still change that?<br>
&gt;<br>
&gt; Given that we just released the last planned candidate, I&#39;d say it was too<br>
&gt; late to change this for Python 3.0.<br>
&gt;<br>
<br>
</div>But we can at least document that the macro is a gone as soon as 3.0<br>
final is out the door.<br>
<font color="#888888"><br>
-Brett</font></blockquote></div><div><br>I&#39;ll commit the following update to the py3k docs if nobody objects.&nbsp; As it is now, the only mention of PY_SSIZE_T_CLEAR at all is in whatsnew/2.5.rst.&nbsp; This officially documents it and mentions that it is going away to be always on in the future.&nbsp; I&#39;m assuming in 3.1 but I just left it as &quot;a future version&quot; to not commit to that.&nbsp; At least the py3k docs encourage use of s* rather than s#.<br>

<br>-gps<br></div></div></blockquote><div><br>Wording fixed slightly and committed as r67361.<br>&nbsp;<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="gmail_quote"><div><br></div></div><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Index: Doc/extending/extending.rst</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">===================================================================</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">--- Doc/extending/extending.rst (revision 67360)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+++ Doc/extending/extending.rst (working copy)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">@@ -587,11 +587,16 @@</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;Some example calls::</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+&nbsp;&nbsp; #define PY_SSIZE_T_CLEAN&nbsp; /* Make &quot;s#&quot; use Py_ssize_t rather than int. */</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; #include &lt;Python.h&gt;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+::</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; int ok;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; int i, j;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; long k, l;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; const char *s;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">-&nbsp;&nbsp; int size;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; Py_ssize_t size;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ok = PyArg_ParseTuple(args, &quot;&quot;); /* No arguments */</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Python call: f() */</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Index: Doc/c-api/arg.rst</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">===================================================================</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">--- Doc/c-api/arg.rst&nbsp;&nbsp; (revision 67360)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+++ Doc/c-api/arg.rst&nbsp;&nbsp; (working copy)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">@@ -42,12 +42,19 @@</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; responsible** for calling ``PyBuffer_Release`` with the structure after it</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; has processed the data.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-``s#`` (string, Unicode or any read buffer compatible object) [const char \*, int]</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+``s#`` (string, Unicode or any read buffer compatible object) [const char \*, int or :ctype:`Py_ssize_t`]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; This variant on ``s*`` stores into two C variables, the first one a pointer</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; to a character string, the second one its length.&nbsp; All other read-buffer</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; compatible objects pass back a reference to the raw internal data</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; representation.&nbsp; Since this format doesn&#39;t allow writable buffer compatible</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">-&nbsp;&nbsp; objects like byte arrays, ``s*`` is to be preferred.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+&nbsp;&nbsp; objects like byte arrays, ``s*`` is to be preferred.&nbsp; The type of</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; the length argument (int or :ctype:`Py_ssize_t`) is controlled by</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+&nbsp;&nbsp; defining the macro :cmacro:`PY_SSIZE_T_CLEAN` before including</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; :file:`Python.h`.&nbsp; If the macro was defined, the output will be a</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+&nbsp;&nbsp; :ctype:`Py_ssize_t` rather than an int.</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; This behavior will change in a future Python version to only support</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">+&nbsp;&nbsp; :ctype:`Py_ssize_t` and drop int support.&nbsp; It is best to always</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">+&nbsp;&nbsp; define :cmacro:`PY_SSIZE_T_CLEAN`.</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;``y`` (bytes object) [const char \*]</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; This variant on ``s`` converts a Python bytes or bytearray object to a C</span><br style="font-family: courier new,monospace;"><br>
</blockquote></div><br>