假设我有以下功能:
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
"Explicit is better than implicit."
传递匿名
kwargs
真的没有什么好处。函数应该尽可能地命名它们的关键字参数。而调用方(如main
)不会通过保存代码的奇数字节来提高质量或可读性。根据需要处理/过滤KWARG。或者或
将完成工作并易于理解
当然,您可以定义如下函数(doNOT):
这将允许调用者传递将被忽略的随机KWARG,但这使调用者更难找到此函数真正需要的KWARG
您可以这样做,只需将kwargs添加到sub1,它将自动解析您提供的任何命名参数,其余参数将放入kwargs中:
这样,您仍然可以使用或不使用foo调用sub1,但也可以使用或不使用其他参数来调用它,而不会导致错误
相关问题 更多 >
编程相关推荐