将显式关键字参数和**kwargs相结合

问题描述 投票:1回答:1

在Python中,我可以显式地列出一个函数所接受的只有关键字的参数。

def foo(arg, *, option_a=False, option_b=False):
    return another_fn(arg, option_a=option_a, option_b=option_b)

虽然调用另一个函数的语法有点啰嗦,但在函数调用中,我确实可以对命名的参数进行很好的自动补全。

Autocomplete on named arguments in vscode

我可以在函数调用中通过使用 **kwargs:

def foo(arg, **kwargs):
    return another_fn(arg, **kargs)

但是我在编辑器中失去了自动完成功能(而且功能签名也不那么清晰)。

No autocomplete with kwargs

如何才能两全其美?我想写一个明确的函数签名,但仍然得到一个 kwargs dict在函数体中。

python python-3.x kwargs
1个回答
0
投票

这是一个可能的使用场景 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)

希望能帮到你!

© www.soinside.com 2019 - 2024. All rights reserved.