On Wed, Apr 16, 2014 at 10:29 AM, Guido van Rossum firstname.lastname@example.org wrote:
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.
def logging_foo(*, arg1='something_other_than_spam', arg3=None, arg4=<what???>): loging.info('calling foo(arg1=%r, arg3=%r, arg4=%r)', arg1, arg3, arg4) return foo(arg1=arg1, arg3=arg3, arg4=arg4)
Wrapping the APIs in such a tightly coupled way is already awkward, since if the argspec (e.g. the default) changes, so must your wrapper. *args/**kwargs are better when possible.
On Wed, Apr 16, 2014 at 10:09 AM, Yury Selivanov email@example.com wrote:
There is a very common pattern for creating optional arguments when you can't use None:
_optional = object() def foo(*, arg1='spam', arg3=None, arg4=_optional): if arg4 is _optional: # caller didn't pass *anything* for arg4 else: # caller did pass some (maybe None) value for arg4
It's a bit annoying to create this marker objects, and also, if you try to render a signature of such function, you'll get something like:
"(*, arg1='spam', arg3=None, arg4=<object object at 0x104be7080>)"
What if we add a standard marker for this use-case: functools.optional or inspect.Parameter.optional?
Yury _______________________________________________ Python-ideas mailing list Pythonfirstname.lastname@example.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/
-- --Guido van Rossum (python.org/~guido)
Python-ideas mailing list Pythonemail@example.com https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/