当函数包含函数未使用的参数时,请在函数中使用kwargs

2024-05-23 06:59:50 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下功能:

def sub1(a,b,foo="bar"):
    print(a+b)
    print(foo)

def main(*args,**kwargs):
    a,b = args
    sub1(a,b,**kwargs)

我能行

main(2,3) #5, bar
main(2,3,foo="baz") #5, baz

这很好用

但是假设我解析了一个额外的关键字参数,比如

main(2,3,qux="baz") #TypeError: sub1() got an unexpected keyword argument 'qux'

我们为什么要这样做?假设我有一个附加函数,它与sub1共享一些参数,但也有一些不同的参数

def sub2(foo,qux="fred"):
    print(foo)
    print(f"Hello {qux}")

那就不用做了

def main(*args,**sub1kwargs,**sub2kwargs):
   sub1(**sub1kwargs)
   sub2(**sub2kwargs)

我们可以只解析相同的kwargs,函数只需要它所需要的:

def main(*args,**kwargs):
    sub1(**kwargs)
    sub2(**kwargs)

当然,我们可以在将参数解析为sub1(或者在sub1中使用foo = kwargs.get("foo","bar))之前循环参数列表,但是我想知道,我们是否可以避免这样做,并且只有一个kwargs


Tags: 函数参数foomaindefbarargsbaz
2条回答

"Explicit is better than implicit."

传递匿名kwargs真的没有什么好处。函数应该尽可能地命名它们的关键字参数。而调用方(如main)不会通过保存代码的奇数字节来提高质量或可读性。根据需要处理/过滤KWARG。或者

def main(*args, foo="bar", qux="baz"):
    sub1(*args, foo=foo)
    sub2(qux=qux)

def main(*args, **kwargs):
    sub1(*args, foo=kwargs.get("foo"))
    sub2(qux=kwargs.get("qux"))

将完成工作并易于理解

当然,您可以定义如下函数(doNOT):

def sub1(a, b, **kwargs):
    print(a+b)
    print(kwargs.get("foo", "bar"))

这将允许调用者传递将被忽略的随机KWARG,但这使调用者更难找到此函数真正需要的KWARG

您可以这样做,只需将kwargs添加到sub1,它将自动解析您提供的任何命名参数,其余参数将放入kwargs中:

def sub1(a, b, foo="bar", **kwargs):

这样,您仍然可以使用或不使用foo调用sub1,但也可以使用或不使用其他参数来调用它,而不会导致错误

main(1, 2, foo="hello")
  > 1, 2, "hello"
main(1, 2, qux="hello")
  > 1, 2, "bar"

相关问题 更多 >

    热门问题