Question regarding the __kwdefaults__ output being None

Peter Otten __peter__ at web.de
Fri Apr 19 08:23:48 EDT 2019


Arup Rakshit wrote:

> I have a very basic function.
> 
> def greet(name, msg = "Good morning!"):
>    """
>    This function greets to
>    the person with the
>    provided message.
> 
>    If message is not provided,
>    it defaults to "Good
>    morning!"
>    """
> 
>    print("Hello",name + ', ' + msg)
> 
> Now when I am calling __kwdefaults__ on the function I am getting None.
> 
> 3.7.3 (default, Mar 27 2019, 09:23:15)
> [Clang 10.0.1 (clang-1001.0.46.3)]
> Python Type "help", "copyright", "credits" or "license" for more
> information. from python_methods import greet
> greet("Kate")
> Hello Kate, Good morning!
> greet("Bruce","How do you do?")
> Hello Bruce, How do you do?
> print(greet.__kwdefaults__)
> None
> 
> What am I missing here? Should not I get {“msg”: “Good morning!”} ?

There are defaults for arguments that can be either positional or passed as 
a keyword -- and there are keyword-only arguments. __kwdefaults__ is used 
for keyword-only arguments, other defaults are stored in __defaults__:

>>> def f(a, b="kw", *, c="kwonly"): pass
... 
>>> f.__kwdefaults__
{'c': 'kwonly'}
>>> f.__defaults__
('kw',)





More information about the Python-list mailing list