<div dir="ltr">typo... meant of course foo(*([0]*300))<div><br></div><div>Andrea</div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 6, 2018 at 9:57 AM Andrea Griffini <<a href="mailto:agriff@tin.it">agriff@tin.it</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">With Python 2.7.15 what fails is a call with explicit arguments (e.g. `foo(0,0,0 ... 0,0)`), not the function definition.<div>Calling with `foo([0]*300)` instead works.<div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 6, 2018 at 7:18 AM Stephen McDowell <<a href="mailto:sjm324@cornell.edu" target="_blank">sjm324@cornell.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div>Hello Python Gurus,</div><div><br></div><div>TL;DR: 3.7 released functions having greater than 255 arguments.  Despite explicit checks for this in 2.x, no such limit is actually imposed -- why?<br></div><div><br></div>In the 3.7 release notes "Other Language Changes" section (<a href="https://docs.python.org/3.7/whatsnew/3.7.html#other-language-changes" target="_blank">https://docs.python.org/3.7/whatsnew/3.7.html#other-language-changes</a>), the first bullet point denotes<br><br>> More than 255 arguments can now be passed to a function, and a function can
now have more than 255 parameters. (Contributed by Serhiy Storchaka in
<a class="m_8320562914340110524m_3893921890404308651gmail-reference m_8320562914340110524m_3893921890404308651external" href="https://bugs.python.org/issue12844" target="_blank">bpo-12844</a> and <a class="m_8320562914340110524m_3893921890404308651gmail-reference m_8320562914340110524m_3893921890404308651external" href="https://bugs.python.org/issue18896" target="_blank">bpo-18896</a>.)<br><br></div>Now lets get something straight: unless I want to exclusively support Python 3.7 or higher, I must make sure I obey the <255 rule.  Use *args // **kwargs, etc.  I'm totally ok with that, 2020 is already here in my mind ;)<br></div><div><br></div><div>Curiosity is the reason I'm reaching out.  Upon further investigation and some discussion with like-minded Python enthusiasts, the code being patched by Serhiy Storchaka is present in e.g., Python 2.7 (<a href="https://github.com/python/cpython/blob/2.7/Python/ast.c#L2013-L2016" target="_blank">https://github.com/python/cpython/blob/2.7/Python/ast.c#L2013-L2016</a>)<br><br><span style="font-family:monospace,monospace">    if (nargs + nkeywords + ngens > 255) {<br>      ast_error(n, "more than 255 arguments");<br>      return NULL;<br>    }</span></div><div><br></div><div>Despite that code, as demonstrated with the supplemental output in the post script, <b>no 2.x versions fail with >255 arguments</b>.  In contrast, 3.x where x<7 all do fail (as expected) with a <span style="font-family:monospace,monospace">SyntaxError</span>.  To test this, I tried every minor release of python (excluding v1, arbitrarily choosing the latest patch release of a minor version) with the following snippet via the <span style="font-family:monospace,monospace">-c</span> flag</div><div><br></div><div><span style="font-family:monospace,monospace">    /path/to/pythonX.Y -c 'exec("def foo(" + ", ".join(["a" + str(i) for i in range(1, 300)]) + "): pass")'</span></div><div><br></div><div>Which tries to construct a function</div><div><br></div><div><span style="font-family:monospace,monospace">    def foo(a0, a1, ..., a299): pass</span></div><div><br></div><div>I've looked at the C code for a while and it is entirely non-obvious what would lead to python <b>2</b> <i>allowing</i> >255 arguments.  Anybody happen to know how / why the python <b>2</b> versions <b>succeed</b>?</div><div><br></div><div>Thank you for reading, this is not a problem, just a burning desire for closure (even if anecdotal) as to how this can be.  I deeply love python, and am not complaining!  I stumbled across this and found it truly confounding, and thought the gurus here may happen to recall what changed in 3.x that lead the the error condition actually being asserted :)</div><div><br></div><div>Sincerely,</div><div><br></div><div>Stephen McDowell<br></div><div><br></div><div>P.S. On a Fedora 25 box using GCC 6.4.1, I lovingly scripted the installation of all the python versions just to see if it truly was a 2.x / 3.x divide.  The results of running `<span style="font-family:monospace,monospace">python -V</span>` followed by the `<span style="font-family:monospace,monospace">python -c 'exec("def foo...")'</span>` described above, with some extra prints for clarity are as follows (script hackily thrown together in ~30minutes not included, so as not to make your eyes bleed):</div><div><br></div><div><span style="font-family:monospace,monospace">********************************************************************************<br>Python 2.0.1<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.1.3<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.2.3<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.3.7<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.4.6<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.5.6<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.6.9<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 2.7.15<br>==> Greater than 255 Arguments supported<br>********************************************************************************<br>Python 3.0.1<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.1.5<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.2.6<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.3.7<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.4.9<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.5.6<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.6.6<br>Traceback (most recent call last):<br>  File "<string>", line 1, in <module><br>  File "<string>", line 1<br>SyntaxError: more than 255 arguments<br>********************************************************************************<br>Python 3.7.0<br>==> Greater than 255 Arguments supported</span></div><div><br></div><div>P.P.S. Seriously, I LOVE PYTHON <3  It was so easy to download, configure, build, and install each of these versions, and run the test!  Thank you :)<br> </div></div>
_______________________________________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/agriff%40tin.it" rel="noreferrer" target="_blank">https://mail.python.org/mailman/options/python-dev/agriff%40tin.it</a><br>
</blockquote></div>
</blockquote></div>