“关键字参数”与常规参数有何不同?所有的参数不能被传递为name=value而不是使用位置语法吗?


当前回答

位置参数

它们前面没有关键词。顺序很重要!

func(1,2,3, "foo")

关键字参数

他们在前面有关键词。它们可以是任何顺序!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

您还应该知道,如果您使用默认参数而忽略了插入关键字,那么顺序将会很重要!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

其他回答

使用Python 3,你可以同时拥有必需的和非必需的关键字参数:


可选:(为参数'b'定义的默认值)

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

必需(没有为参数'b'定义默认值):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

这可以帮助在你有许多相似的参数,特别是如果他们是相同类型的情况下,在这种情况下,我更喜欢使用命名参数或我创建一个自定义类,如果参数属于一起。

使用关键字参数与普通参数是一样的,只是顺序不重要。例如,下面两个函数调用是相同的:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

位置参数

它们前面没有关键词。顺序很重要!

func(1,2,3, "foo")

关键字参数

他们在前面有关键词。它们可以是任何顺序!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

您还应该知道,如果您使用默认参数而忽略了插入关键字,那么顺序将会很重要!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

我很惊讶没有人提到你可以混合位置参数和关键字参数,使用*args和**kwargs来做这样的鬼鬼祟祟的事情:

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

这允许您使用任意关键字参数,这些参数可能包含您不想在前面定义的键。

我正在寻找一个使用类型注释的默认kwargs的示例:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

例子:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}