在函数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)

如果您可以访问 funcAfuncB 的代码,那么您可以简单地用 @default_data 装饰它们:

@default_data
def funcA(a,data='dataset1'):
    ... # function code

@default_data
def funcB(a,data='dataset42'):
    ... # function code