触发函数中的默认关键字参数 python

trigger default keyword arg in function python

在某些特殊情况下是否可以触发函数的默认键参数? 特别是在这个例子中:

def funcA(a, data='dataset1'):
    ... # function code
def funcB(a, b, c, data='dataset42'):
    ... # function code

def func_global(a, b, c, data):
   funcA(a, data=data)
   funcB(a, b, c, 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,2,3, 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, b, c, data):
   if data == 'default':
       funcA(a)
       funcB(a, b, c)
   else:
       funcA(a, data=data)
       funcB(a, b, c, 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, b, c, data=data)

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

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

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