如何解决在函数python中触发默认关键字arg
在某些特殊情况下是否可以触发函数的默认 keywork 参数? 特别是在这个例子中:
def funcA(a,data='dataset1'):
... # function code
def funcB(a,b,c,data='dataset42'):
... # function code
def func_global(a,data):
funcA(a,data=data)
funcB(a,data=data)
# standard use,funcA and funcB use dataset5
func_global(1,2,3,data='dataset5')
# desired use : funcA and funcB use the dataset from their default kwarg
func_global(1,data='default') # this obvIoUsly wont work as will call the dataset called 'default'
# what I want to avoid because I have a lot of functions (A,B,C,...),and I don't want to duplicate:
def func_global(a,data):
if data == 'default':
funcA(a)
funcB(a,c)
else:
funcA(a,data=data)
funcB(a,data=data)
还有一个限制:我不能改变 funcA 或 funcB。 如果您有任何建议如何避免重复,非常感谢
解决方法
您可以使用装饰器:
def default_data(func):
def f(*args,**kwargs):
if 'data' in kwargs and kwargs['data'] == 'default':
del kwargs['data']
return func(*args,**kwargs)
return f
现在你需要装饰你的函数并简化func_global
funcA = default_data(funcA)
funcB = default_data(funcB)
def func_global(a,b,c,data):
funcA(a,data=data)
funcB(a,data=data)
如果您可以访问 funcA
和 funcB
的代码,那么您可以简单地用 @default_data
装饰它们:
@default_data
def funcA(a,data='dataset1'):
... # function code
@default_data
def funcB(a,data='dataset42'):
... # function code
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。