Python 作为kwargs传递,作为args读取-是特殊功能还是临时功能?

Python 作为kwargs传递,作为args读取-是特殊功能还是临时功能?,python,python-2.7,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', { 'us

有时,将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。如果我们的客户知道协议{必要的“关键字”参数,例如用户、密码用于登录()作者、msg用于编写消息()},那么我们的pythonic代码可能是简短、优雅和安全的


它是一种特殊的(有文档记录的)特性还是随机特性?

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})

他们都是完全合法的,做同样的事。也就是说,它们都传递相同的参数。

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})

他们都是完全合法的,做同样的事。也就是说,它们都传递相同的参数。

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})

他们都是完全合法的,做同样的事。也就是说,它们都传递相同的参数。

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})

他们都是完全合法的,做同样的事。也就是说,它们都传递相同的参数。

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

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


除此之外,我不确定我是否理解您所说的“随机特性”的确切含义……

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

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


除此之外,我不确定我是否理解您所说的“随机特性”的确切含义……

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

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


除此之外,我不确定我是否理解您所说的“随机特性”的确切含义……

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

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



除此之外,我不确定我是否理解您所说的“随机功能”的确切含义?…

这显然是个坏主意,而且不安全。@iGuanaut我们可以通过在函数名中添加常量前缀来确保安全。例如,客户端调用login,我们添加前缀msg_u并调用msg_ulogin函数。出于原则,不要这样使用
globals()
。至少有一个专门的字典将操作映射到函数。首先也是最重要的是,五分钟的修复可能太晚了五分钟。所以,这不应该是实现的方式。一般来说,一眼就知道
globals()
中当前有什么内容要困难得多。然而,如果您有一个
dispatcher
字典将操作映射到函数,那么您可以快速浏览一下哪些操作可用,以及每个操作将调用什么。对我来说,这样看起来更优雅,可读性更强。老实说,我最关心的不仅仅是安全性,还有可读性。我只是说我会怎么做;我还是会用字典。这样,将来必须显式地添加新actuon(不仅要将其添加到文件中,还要手动将其添加到dispatcher字典中);它避免了事故,提高了可读性。这只是我的观点:)我并不是说你错了;我只是想和你们分享我的观点。这显然是个坏主意,而且不安全。@iGuanaut我们可以通过在函数名中添加一个常量前缀来确保安全。例如,客户端调用login,我们添加前缀msg_u并调用msg_ulogin函数。出于原则,不要这样使用
globals()
。至少有一个专门的字典将操作映射到函数。首先也是最重要的是,五分钟的修复可能太晚了五分钟。所以,这不应该是实现的方式。一般来说,一眼就知道
globals()
中当前有什么内容要困难得多。然而,如果您有一个
dispatcher
字典将操作映射到函数,那么您可以使用qui