簡體   English   中英

在 function python 中觸發默認關鍵字 arg

[英]trigger default keyword arg in function python

在某些特殊情況下是否可以觸發 function 的默認 keywork 參數? 特別是在這個例子中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM