在Python中,我可以显式地列出一个函数所接受的只有关键字的参数。
def foo(arg, *, option_a=False, option_b=False):
return another_fn(arg, option_a=option_a, option_b=option_b)
虽然调用另一个函数的语法有点啰嗦,但在函数调用中,我确实可以对命名的参数进行很好的自动补全。
我可以在函数调用中通过使用 **kwargs
:
def foo(arg, **kwargs):
return another_fn(arg, **kargs)
但是我在编辑器中失去了自动完成功能(而且功能签名也不那么清晰)。
如何才能两全其美?我想写一个明确的函数签名,但仍然得到一个 kwargs
dict在函数体中。
这是一个可能的使用场景 locals()
:
def foo(arg, arg2=None):
return another_fn(**locals())
如果你需要的话,你也可以拆开包装。self
:
class bar:
def foo(self, arg):
kwargs = locals()
kwargs.pop('self')
return another_fn(**kwargs)
注意事项:如果你在调用之前在方法中定义了任何局部变量 locals()
它们最终会出现在输出中,你必须将它们过滤掉。
def foo(self, arg=None):
baz = 'Oops'
kwargs = locals() # {'self': <bar at 0x0000>, 'arg': None, 'baz': 'Oops'}
return another_fn(**kwargs)
简单的解决方案是,只需调用 locals()
在你做其他事情之前,为了安全起见,先复制一份,并记得清理好 self
的实例方法中。
class bar:
def foo(self, arg=None):
kwargs = locals().copy() # {'self': <bar at 0x0000>, 'arg': None}
kwargs.pop('self')
baz = 'Oops'
return another_fn(**kwargs)
希望能帮到你!