Is it explicitly specified?

TeroV teroV at nowhere.invalid
Sun Feb 3 12:35:42 CET 2008

Jorge Godoy wrote:
> mario ruggier wrote:
>> Is there any way to tell between whether a keyword arg has been explicitly
>> specified (to the same value as the default for it) or not... For example:
>> def func(key=None):
>>     do something with key
>> But the following two usages give same results:
>> func()
>> func(key=None)
>> It may sometimes be useful to make use of the conceptual difference
>> between these two cases, that is that in one case the user did not specify
>> any key and in the other the user explicitly specified the key to be None.
>> Is there any way to tell this difference from within the called function?
>> And if so, would there be any strong reasons to not rely on this
>> difference? Would it be maybe a little abusive of what a keyword arg
>> actually is?
> If you change the idiom you use to:
>>>> def myfunc(**kwargs):
> ...     something = kwargs.get('something', None)
> ...     print something
> ... 
>>>> myfunc()
> None
>>>> myfunc(something='Something')
> Something
> Then you can test if 'something' is in kwargs dict or not.  If it isn't,
> then you used the default value.  If it is, then the user
> supplied 'something' to you, no matter what its value is.

Exactly, and if you use idiom func(*args, **kwargs) you can distinguish 
all the usage cases:

 >>> def func(*args, **kwargs):
...  print(args, kwargs)
 >>> func()
() {}
 >>> func(key='alabama')
() {'key': 'alabama'}
 >>> func('alabama')
('alabama',) {}

More information about the Python-list mailing list