Python 组合显式关键字参数和**kwargs

Python 组合显式关键字参数和**kwargs,python,python-3.x,keyword-argument,Python,Python 3.x,Keyword Argument,在Python中,我可以显式列出函数接受的仅关键字参数: def foo(arg,*,选项a=False,选项b=False): 返回另一个\u fn(arg,option\u a=option\u a,option\u b=option\u b) 虽然调用另一个函数的语法有点冗长,但我确实在函数调用中获得了很好的自动完成功能: 我可以使用**kwargs消除函数调用中的冗余: def foo(arg,**kwargs): 返回另一个\u fn(arg,**kargs) 但随后我在编辑器中

在Python中,我可以显式列出函数接受的仅关键字参数:

def foo(arg,*,选项a=False,选项b=False):
返回另一个\u fn(arg,option\u a=option\u a,option\u b=option\u b)
虽然调用另一个函数的语法有点冗长,但我确实在函数调用中获得了很好的自动完成功能:

我可以使用
**kwargs
消除函数调用中的冗余:

def foo(arg,**kwargs):
返回另一个\u fn(arg,**kargs)
但随后我在编辑器中丢失了自动完成功能(并且有一个不太清晰的函数签名):


我怎样才能两全其美?我想写一个显式函数签名,但仍然在函数体中得到一个
kwargs
dict。

这是一个可能的使用场景:

def foo(arg,arg2=None):
返回另一个函数(**locals())
如果需要,您还可以解包
self

类栏:
def foo(自身,参数):
kwargs=本地人()
kwargs.pop('self'))
返回另一个_fn(**kwargs)
警告:如果在调用
locals()
之前在方法中定义了任何局部变量,它们将最终出现在输出中,您必须将它们过滤掉

def foo(self,arg=None):
baz='Oops'
kwargs=locals()
返回另一个_fn(**kwargs)
简单的解决方案是,在执行任何其他操作之前,只需调用
locals()
,为安全起见,制作一份副本,并记住在实例方法中清理
self

类栏:
def foo(自身,参数=无):
kwargs=locals().copy()#{'self':,'arg':None}
kwargs.pop('self'))
baz='Oops'
返回另一个_fn(**kwargs)

希望这有帮助

当有任意数量的关键字参数要传递给函数时,最好使用
**kwargs
。在您的例子中,只有两个关键字参数需要传递。因此,使用
option\u a=False,option\u b=True
,这在本例中更为清楚。@Ch3steR假设我有十个关键字参数,需要将它们全部传递给另一个使用相同关键字参数的函数。您可以看到样板文件是如何展开的,而不是
**kwargs
locals()
非常挑剔,远远超过了乍一看的明显程度。例如,它在调试器中的行为不同。它在函数中的行为也不同于在类或模块范围中的行为,它与理解有着令人惊讶的交互,它与
super()
有着奇怪的交互,它通常包括闭包变量,除了在一个特殊情况下涉及访问类主体中的闭包变量。有些,但不是全部,通过始终使用
locals().copy()
立即复制dict,可以避免这些问题。特别是,通过这种方式可以避免与调试器的不良交互。但是,我仍然不建议使用
locals()
。在OP的问题中,这些边缘情况不适用。任何能给OP提供他们想要的解决方案的东西都会很挑剔,因为它会涉及到一些内省。根据他们的具体需要(例如,他们的
foo()
)的上下文是什么),他们最好使用一种不需要显式创建这些包装器方法的方法。调试器交互与几乎所有代码都相关,这甚至不是奇怪交互的完整列表。