<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 16, 2014 at 12:29 PM, Guido van Rossum <span dir="ltr"><<a href="mailto:guido@python.org" target="_blank">guido@python.org</a>></span> wrote:<br>




<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>TBH I think it's usually an anti-pattern when you have an API where the absence of a parameter is not equivalent to some default value. It makes wrapping such APIs awkward, e.g.<br>




<br>def logging_foo(*, arg1='something_other_than_spam', arg3=None, arg4=<what???>):<br>

</div>    <a href="http://loging.info" target="_blank">loging.info</a>('calling foo(arg1=%r, arg3=%r, arg4=%r)', arg1, arg3, arg4)<br></div>    return foo(arg1=arg1, arg3=arg3, arg4=arg4)<br></div><div class="gmail_extra">




<div><div><br></div></div></div></blockquote><div><br></div><div>I've had to do that before when writing decorators that take parameters, e.g:</div><div><br></div><div>def mydecorator(arg1,arg2=None):</div><div>    def _f(f):</div>



<div>        if arg2 is None: arg2 = f.something</div><div>        ...</div><div>        return f</div><div>    return _f</div><div><br></div><div>Which sucks when None is a valid value.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">



<div class="gmail_extra"><div><div><br>

<div class="gmail_quote">On Wed, Apr 16, 2014 at 10:09 AM, Yury Selivanov <span dir="ltr"><<a href="mailto:yselivanov.ml@gmail.com" target="_blank">yselivanov.ml@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">






Hello,<br>
<br>
There is a very common pattern for creating optional arguments<br>
when you can't use None:<br>
<br>
_optional = object()<br>
def foo(*, arg1='spam', arg3=None, arg4=_optional):<br>
    if arg4 is _optional:<br>
        # caller didn't pass *anything* for arg4<br>
    else:<br>
        # caller did pass some (maybe None) value for arg4<br>
<br>
It's a bit annoying to create this marker objects, and also,<br>
if you try to render a signature of such function, you'll get<br>
something like:<br>
<br>
"(*, arg1='spam', arg3=None, arg4=<object object at 0x104be7080>)"<br>
<br>
What if we add a standard marker for this use-case:<br>
functools.optional or inspect.Parameter.optional?<br>
<br>
<br>
Yury<br>
______________________________<u></u>_________________<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" target="_blank">https://mail.python.org/<u></u>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/<u></u>codeofconduct/</a><br>
</blockquote></div><br><br clear="all"><br></div></div><span><font color="#888888">-- <br>--Guido van Rossum (<a href="http://python.org/~guido" target="_blank">python.org/~guido</a>)
</font></span></div>
<br>_______________________________________________<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" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" target="_blank">http://python.org/psf/codeofconduct/</a><br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Ryan<div><div>If anybody ever asks me why I prefer C++ to C, my answer will be simple: "It's becauseslejfp23(@#Q*(E*EIdc-SEGFAULT. Wait, I don't think that was nul-terminated."</div>




</div><div><br></div></div>
</div></div>