Python:按名称和kwargs传递参数

Cod*_*ist 28 python arguments function pass-by-name kwargs

在python中我们可以这样做:

def myFun1(one = '1', two = '2'):
    ...
Run Code Online (Sandbox Code Playgroud)

然后我们可以调用函数并按名称传递参数:

myFun1(two = 'two', one = 'one')
Run Code Online (Sandbox Code Playgroud)

此外,我们可以这样做:

def myFun2(**kwargs):
    print kwargs.get('one', 'nothing here')

myFun2(one='one')
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否可以将两种方法结合起来:

def myFun3(name, lname, **other_info):
    ...

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')
Run Code Online (Sandbox Code Playgroud)

一般来说,我们可以做什么组合?

谢谢,对不起我的愚蠢问题.

Gar*_*tty 29

一般的想法是:

def func(arg1, arg2, ..., kwarg1=default, kwarg2=default, ..., *args, **kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

您可以根据需要使用尽可能多的人.在***将"吸收"任何剩余价值,未列入.

无法通过关键字给出位置参数(不带默认值),非默认参数不能遵循默认参数.

注意Python 3还增加了通过以下方式指定仅限关键字参数的功能*:

def func(arg1, arg2, *args, kwonlyarg=default):
    ...
Run Code Online (Sandbox Code Playgroud)

您也可以使用*alone(def func(a1, a2, *, kw=d):),这意味着不会捕获任何参数,但之后的任何内容都只是关键字.

所以,如果你在3.x中,你可以产生你想要的行为:

def myFun3(*, name, lname, **other_info):
    ...
Run Code Online (Sandbox Code Playgroud)

哪个允许使用namelname仅作为关键字调用.

请注意,这是一个不寻常的界面,可能会让用户烦恼 - 我只会在非常具体的用例中使用它.

在2.x中,您需要通过解析手动完成此操作**kwargs.