<div dir="ltr"><div>sure! and having those workarounds if you really need them is great.<br><br></div>it’s just really frustrating that so many of you are stuck with 2.7 or even less without more reason than “sysadmin won’t install a SCL”.<br></div><br><div class="gmail_quote"><div dir="ltr">Yann Kaiser <<a href="mailto:kaiser.yann@gmail.com">kaiser.yann@gmail.com</a>> schrieb am Sa., 20. Juni 2015 um 20:28 Uhr:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Definitely agree with wanting to move on and focus on Python 3.<div><br></div><div>I design my stuff with Python 3 first in mind, but reality tells me I need to keep supporting Python 2 users, even if that means uglifying front-page examples with things such as sigtools.modifiers.kwoargs. The existence of this thread and of some of the emails in the "signature documentation" thread only serves as proof that I'd confuse too many by keeping "kwoargs" & co a side-note.</div><div><br></div><div>Developing on Python 3.4 is great, things like chained tracebacks are fantastic. If I can do it on Python 3, I will. But what if I want to deploy to GAE? Stuck with 2.7. So are many users.</div><div><br></div><div>It's ugly, it sucks, but so far it is out of my hands and necessary.</div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, 20 Jun 2015 at 20:13 Philipp A. <<a href="mailto:flying-sheep@web.de" target="_blank">flying-sheep@web.de</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><p style="margin:1.2em 0px!important">OK, i think it’s time to finally switch to python 3 instead of writing more horrible crutches:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%"><span style="color:rgb(153,153,136);font-style:italic"># coding: utf-8</span>
<span style="color:rgb(51,51,51);font-weight:bold">from</span> __future__ <span style="color:rgb(51,51,51);font-weight:bold">import</span> absolute_import, division, print_function, unicode_literals
<span style="color:rgb(51,51,51);font-weight:bold">from</span> builtins <span style="color:rgb(51,51,51);font-weight:bold">import</span> *

<span style="color:rgb(51,51,51);font-weight:bold">import</span> trollius
<span style="color:rgb(51,51,51);font-weight:bold">from</span> trollius <span style="color:rgb(51,51,51);font-weight:bold">import</span> From, Return

<span style="color:rgb(51,51,51);font-weight:bold">from</span> other <span style="color:rgb(51,51,51);font-weight:bold">import</span> stuff

<span>@trollius.coroutine</span>
<span>@modifiers.kwoargs('b')</span>
<span><span style="color:rgb(51,51,51);font-weight:bold">def</span> <span style="color:rgb(153,0,0);font-weight:bold">awesome_stuff</span><span>(a, b=<span style="color:rgb(0,128,128)">5</span>)</span>:</span>
    res = (<span style="color:rgb(51,51,51);font-weight:bold">yield</span> From(stuff()))
    <span style="color:rgb(51,51,51);font-weight:bold">raise</span> Return(res)
</code></pre>
<p style="margin:1.2em 0px!important">vs.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%"><span style="color:rgb(51,51,51);font-weight:bold">import</span> asyncio

<span style="color:rgb(51,51,51);font-weight:bold">from</span> other <span style="color:rgb(51,51,51);font-weight:bold">import</span> stuff

<span>@asyncio.coroutine</span>
<span><span style="color:rgb(51,51,51);font-weight:bold">def</span> <span style="color:rgb(153,0,0);font-weight:bold">awesome_stuff</span><span>(a, *, b=<span style="color:rgb(0,128,128)">5</span>)</span>:</span>
    res = (<span style="color:rgb(51,51,51);font-weight:bold">yield</span> <span style="color:rgb(51,51,51);font-weight:bold">from</span> stuff())
    <span style="color:rgb(51,51,51);font-weight:bold">return</span> res
</code></pre>
<p style="margin:1.2em 0px!important">or soon:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre-wrap;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248) none repeat scroll 0% 0%"><span style="color:rgb(51,51,51);font-weight:bold">from</span> other <span style="color:rgb(51,51,51);font-weight:bold">import</span> stuff

async <span><span style="color:rgb(51,51,51);font-weight:bold">def</span> <span style="color:rgb(153,0,0);font-weight:bold">awesome_stuff</span><span>(a, *, b=<span style="color:rgb(0,128,128)">5</span>)</span>:</span>
    res = await stuff()
    <span style="color:rgb(51,51,51);font-weight:bold">return</span> res
</code></pre></div></div><div dir="ltr"><div>
<p style="margin:1.2em 0px!important">Yann Kaiser <a href="http://mailto:kaiser.yann@gmail.com" target="_blank">kaiser.yann@gmail.com</a> schrieb am Sa., 20. Juni 2015 um 19:52 Uhr:</p>
<p style="margin:1.2em 0px!important"></p></div></div><div dir="ltr"><div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, 17 Jun 2015 at 21:33 Nathaniel Smith <<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">there's really no good way to accomplish kw only args in py2. It can be done, but it's very cumbersome; not like range or print or whatever where you can just import something from six or add some parentheses.</p></blockquote></div></div><div dir="ltr"><div class="gmail_quote"><div>As you correctly point out, it can't be done without friction.</div><div><br></div><div>I've attempted backporting kw-only parameters through decorators:</div><div><br></div><div>from sigtools import modifiers</div><div><br></div><div>@modifiers.kwoargs('kwop')</div><div>def func(abc, kwop):</div><div>    ...</div><div><br></div><div>@modifiers.autokwoargs</div><div>def func(abc, kwop=False):</div><div>    ...</div><div><br></div><div><a href="http://sigtools.readthedocs.org/en/latest/#sigtools.modifiers.kwoargs" target="_blank">http://sigtools.readthedocs.org/en/latest/#sigtools.modifiers.kwoargs</a> </div></div></div></blockquote></div></div></div><div dir="ltr"><div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a></blockquote></div></div></div><div dir="ltr"><div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote><p></p></div><p style="margin:1.2em 0px!important"></p>
<div title="MDH:PGRpdj48ZGl2PjxkaXY+T0ssIGkgdGhpbmsgaXTigJlzIHRpbWUgdG8gZmluYWxseSBzd2l0Y2gg
dG8gcHl0aG9uIDMgaW5zdGVhZCBvZiB3cml0aW5nIG1vcmUgaG9ycmlibGUgY3J1dGNoZXM6PGJy
PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgcHl0aG9uPGJyPjwvZGl2PjxkaXY+IyBjb2Rp
bmc6IHV0Zi04PGJyPjwvZGl2PjxkaXY+ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9p
bXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbiwgdW5pY29kZV9saXRlcmFsczxicj5mcm9t
IGJ1aWx0aW5zIGltcG9ydCAqPGJyPjwvZGl2PjxkaXY+PGJyPmltcG9ydCB0cm9sbGl1czxicj5m
cm9tIHRyb2xsaXVzIGltcG9ydCBGcm9tLCBSZXR1cm48YnI+PGJyPjwvZGl2PjxkaXY+ZnJvbSBv
dGhlciBpbXBvcnQgc3R1ZmY8YnI+PC9kaXY+PGRpdj48YnI+QHRyb2xsaXVzLmNvcm91dGluZTxi
cj5AbW9kaWZpZXJzLmt3b2FyZ3MoJ2InKTxicj48L2Rpdj48ZGl2PmRlZiBhd2Vzb21lX3N0dWZm
KGEsIGI9NSk6PGJyPjwvZGl2PiZuYnNwOyZuYnNwOyZuYnNwOyByZXMgPSAoeWllbGQgRnJvbShz
dHVmZigpKSk8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJhaXNlIFJldHVybihyZXMpPGJyPmBgYDxi
cj48YnI+PC9kaXY+dnMuPGJyPjxicj5gYGBweXRob248ZGl2PmltcG9ydCBhc3luY2lvPGJyPjxi
cj5mcm9tIG90aGVyIGltcG9ydCBzdHVmZjxicj48YnI+QGFzeW5jaW8uY29yb3V0aW5lPGJyPjwv
ZGl2PjxkaXY+ZGVmIGF3ZXNvbWVfc3R1ZmYoYSwgKiwgYj01KTo8YnI+PC9kaXY+Jm5ic3A7Jm5i
c3A7Jm5ic3A7IHJlcyA9ICh5aWVsZCBmcm9tIHN0dWZmKCkpPGJyPiZuYnNwOyZuYnNwOyZuYnNw
OyByZXR1cm4gcmVzPGJyPmBgYDxicj48YnI+PC9kaXY+b3Igc29vbjo8YnI+PGJyPmBgYHB5dGhv
bjxicj5mcm9tIG90aGVyIGltcG9ydCBzdHVmZjxicj48YnI+YXN5bmMgZGVmIGF3ZXNvbWVfc3R1
ZmYoYSwgKiwgYj01KTo8YnI+wqDCoMKgIHJlcyA9IGF3YWl0IHN0dWZmKCk8YnI+wqDCoMKgIHJl
dHVybiByZXM8YnI+YGBgPGJyPjxicj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9
Imx0ciI+WWFubiBLYWlzZXIgJmx0O2thaXNlci55YW5uQGdtYWlsLmNvbSZndDsgc2NocmllYiBh
bSBTYS4sIDIwLiBKdW5pIDIwMTUgdW0gMTk6NTImbmJzcDtVaHI6PGJyPjwvZGl2PjxibG9ja3F1
b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1s
ZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXg7Ij48ZGl2IGRpcj0ibHRyIj48ZGl2
IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciI+T24gV2VkLCAxNyBKdW4gMjAxNSBh
dCAyMTozMyBOYXRoYW5pZWwgU21pdGggJmx0OzxhIGhyZWY9Im1haWx0bzpuanNAcG9ib3guY29t
IiB0YXJnZXQ9Il9ibGFuayI+bmpzQHBvYm94LmNvbTwvYT4mZ3Q7IHdyb3RlOjxicj48L2Rpdj48
YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhleDti
b3JkZXItbGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij48cCBkaXI9Imx0ciI+
dGhlcmUncyByZWFsbHkgbm8gZ29vZCB3YXkgdG8gYWNjb21wbGlzaCBrdyBvbmx5IGFyZ3MgaW4g
cHkyLiBJdCBjYW4gYmUgZG9uZSwgYnV0IGl0J3MgdmVyeSBjdW1iZXJzb21lOyBub3QgbGlrZSBy
YW5nZSBvciBwcmludCBvciB3aGF0ZXZlciB3aGVyZSB5b3UgY2FuIGp1c3QgaW1wb3J0IHNvbWV0
aGluZyBmcm9tIHNpeCBvciBhZGQgc29tZSBwYXJlbnRoZXNlcy48L3A+PC9ibG9ja3F1b3RlPjwv
ZGl2PjwvZGl2PjxkaXYgZGlyPSJsdHIiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2PkFz
IHlvdSBjb3JyZWN0bHkgcG9pbnQgb3V0LCBpdCBjYW4ndCBiZSBkb25lIHdpdGhvdXQgZnJpY3Rp
b24uPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JJ3ZlIGF0dGVtcHRlZCBiYWNrcG9ydGluZyBr
dy1vbmx5IHBhcmFtZXRlcnMgdGhyb3VnaCBkZWNvcmF0b3JzOjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+ZnJvbSBzaWd0b29scyBpbXBvcnQgbW9kaWZpZXJzPC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5AbW9kaWZpZXJzLmt3b2FyZ3MoJ2t3b3AnKTwvZGl2PjxkaXY+ZGVmIGZ1bmMoYWJjLCBr
d29wKTo8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgLi4uPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj5AbW9kaWZpZXJzLmF1dG9rd29hcmdzPC9kaXY+PGRpdj5kZWYgZnVuYyhhYmMsIGt3b3A9RmFs
c2UpOjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAuLi48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PjxhIGhyZWY9Imh0dHA6Ly9zaWd0b29scy5yZWFkdGhlZG9jcy5vcmcvZW4vbGF0ZXN0LyNzaWd0
b29scy5tb2RpZmllcnMua3dvYXJncyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zaWd0b29scy5y
ZWFkdGhlZG9jcy48d2JyPm9yZy9lbi9sYXRlc3QvI3NpZ3Rvb2xzLjx3YnI+bW9kaWZpZXJzLmt3
b2FyZ3M8L2E+Jm5ic3A7PC9kaXY+PC9kaXY+PC9kaXY+Cl9fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXzx3YnI+X19fX19fX19fX19fX19fX188YnI+ClB5dGhvbi1pZGVhcyBtYWlsaW5nIGxp
c3Q8YnI+CjxhIGhyZWY9Im1haWx0bzpQeXRob24taWRlYXNAcHl0aG9uLm9yZyIgdGFyZ2V0PSJf
YmxhbmsiPlB5dGhvbi1pZGVhc0BweXRob24ub3JnPC9hPjxicj4KPGEgaHJlZj0iaHR0cHM6Ly9t
YWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9weXRob24taWRlYXMiIHJlbD0ibm9yZWZl
cnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYTx3YnI+
bi9saXN0aW5mby9weXRob24taWRlYXM8L2E+PGJyPgpDb2RlIG9mIENvbmR1Y3Q6IDxhIGhyZWY9
Imh0dHA6Ly9weXRob24ub3JnL3BzZi9jb2Rlb2Zjb25kdWN0LyIgcmVsPSJub3JlZmVycmVyIiB0
YXJnZXQ9Il9ibGFuayI+aHR0cDovL3B5dGhvbi5vcmcvcHNmL2NvZGVvZmNvPHdicj5uZHVjdC88
L2E+PC9ibG9ja3F1b3RlPjwvZGl2Pg==" style="min-height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>
</blockquote></div>
</blockquote></div>