[Python-3000] Cleaning up argument list parsing (was Re: More wishful thinking)

Ian Bicking ianb at colorstudy.com
Tue Apr 18 02:53:03 CEST 2006


Guido van Rossum wrote:
> Here's a related but more complicated wish: define a function in such
> a way that certain parameters *must* be passed as keywords, *without*
> using *args or **kwds. This may require a new syntactic crutch.

Perhaps:

   def func(x, *args=(), foo=1): ...

Well, that doesn't really relate at all to what = means in that 
position.  "def func(x, *None, foo=1)"?  "def func(x, **, foo=1)"... oh, 
well why not just "def func(x, &optional foo=1)".

Maybe related is a way of telling if the keyword was passed at all.  In 
other words, a replacement for:

   sentinal = []
   def func(x, y=sentinal):
       if y is sentinal:
           # calculate from x

Or, without any danger of a misused sentinal:

   def func(x, *args, **kw):
       if args:
           assert not kw
           assert len(args) == 1
           y = args[0]
       elif kw:
           y = kw.pop('y')
           assert not kw
       else:
           # calculate from x

But the second gives a ruined signature, and a proper implementation has 
error messages that aren't assertion errors, and so would take much 
longer to write.  But I can't even think of stupid syntax for the 
latter; or I guess I can't think of useful semantics.  The best I can 
think of (ignoring syntax):

   def func(x, [y=sentinal]):
       try:
           y
       except NameError:
           # calculate from x

... which is annoying, but maybe better than the alternatives.  Well, 
I'm not sure if it is actually better than just using a sentinal, which 
generally works just fine.

-- 
Ian Bicking  /  ianb at colorstudy.com  /  http://blog.ianbicking.org


More information about the Python-3000 mailing list