微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在函数python中触发默认关键字arg

如何解决在函数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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。