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

Andrew McCollum mccollum at fas.harvard.edu
Wed Apr 19 20:42:21 CEST 2006


On 4/17/06, Guido van Rossum <guido at python.org> 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.

I don't know if this counts as "not using *args or **kwds", but why can't
this simply be done with a decorator? Here's a (tested) example:
"""
class KeywordError(TypeError):
 pass
 
def require_keywords(*keywords):
 def check_keywords(f):
 def new_f(*args, **kwds):
 
 for k in keywords:
 if k not in kwds:
 raise KeywordError("%s() requires the keyword "
 "argument '%s'" % (f.func_name, k))
 
 return f(*args, **kwds)
 
 new_f.func_name = f.func_name
 new_f.func_doc = f.func_doc
 new_f.func_defaults = f.func_defaults
 return new_f
 
 return check_keywords
@require_keywords('font', 'size', 'color')
def write_text(s, font=None, size=None, color=None):
 pass
 
@require_keywords('paramA')
def example(paramA, paramB=10):
 print paramA, paramB
"""
Here's what happens when you call these functions:
"""
>>> example(paramA=5)
5 10
>>> example(paramB=5)
KeywordError: example() requires the keyword argument 'paramA'
>>> example(5, 10)
KeywordError: example() requires the keyword argument 'paramA'
>>> example(5, paramA=5)
TypeError: example() got multiple values for keyword argument 'paramA'
"""
As you can see, this method still prevents double-passing the arguments.
The major disadvantage that I can see is that the function signature of the
decorated function becomes (*args, **kwds). By the way, this is my first
post to this list, so hello everybody.
	-Andrew McCollum


More information about the Python-3000 mailing list

AltStyle によって変換されたページ (->オリジナル) /