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