[英]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)
如果您可以訪問funcA
和funcB
的代碼,那么您可以簡單地用@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.