作为kwargs传递,读作args - 一个特殊的或临时的特征?

时间:2015-02-17 19:28:17

标签: python python-2.7

有时将 kwargs 传递给接收 args 的函数会很方便。

例如:

def login( user, password ):
    ...

def write_message( author, to_user, msg ):
    ...

def http_response( action, params ):
    return globals()[ action ]( **params )

# client calls 
# http_response( 'login', { 'user': "sergzach", 'password': "PASS123" } )

在此示意图示例中,我们从客户端接收信息并调用其名称等于在params中传递的变量 action 的函数。如果我们的客户知道协议{必要'关键字'参数,例如用户,密码用于登录()作者,to_user,msg 用于< strong> write_message()}然后我们的pythonic代码可以简短,优雅和安全。

是特殊(记录)还是随机功能?

2 个答案:

答案 0 :(得分:2)

Python区分参数参数

参数是您在函数定义中列出的内容:

def foo(bar, baz=default, **quux):
    pass

参数是您调用它时传递给函数的内容:

result = foo(bar, baz, **quux)

鉴于上述函数定义,Python允许任何这些调用:

foo(bar, baz, quux1=quux1, quux2=quux2)
foo(*(bar, baz), quux1=quux1, quux2=quux2)
foo(**{'bar': bar, 'baz': baz, 'quux1': quux1, 'quux2':quux2})

他们都完全合法并且做同样的事情。也就是说,它们都传递相同的论点。

答案 1 :(得分:1)

您的示例保证可以在python中运行。在python中,您始终可以选择将命名参数作为关键字参数传递。

正如评论中已经指出的那样,这种方法可能不安全(通过用户提供的名称调用函数)。因此,如果这样做,请格外小心(评论中还包括一些好的安全建议)。

除此之外,我不确定我明白你的意思是&#34;随机功能&#34;?.. ..