On Wed, Apr 16, 2014 at 9:45 PM, Yury Selivanov email@example.com:
On 2014-04-16, 1:29 PM, Guido van Rossum 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)
Agree, wrapping is hard, but you can always use **kwargs.
The pattern is sometimes useful for decorators (as Ryan Gonzalez shows in this thread). But basically, you need this when 'None' is a legitimate value for some optional argument, and you want users to pass explicitly.
For instance, see inspect.Signature.replace method: http://hg.python.org/cpython/file/e4ee0b15cc4f/Lib/inspect.py#l2193
I'm not saying it's a very common thing to do, but sometimes you need this, and having the need of doing some ad hoc hacks is slightly annoying.
...but it would be yet another thing to learn. Plus, being it uncommon you would easily forget what's the "right way to do it" and likely come up with the usual object() hack anyway.