2016-10-10 42 views
1

我有一種情況,如:傳播參數來裝飾它結合了其他裝飾

@decorator_one(1) 
@foo 
@bar 
def my_decorated_func(): 
    pass 

我試圖凝結成是這樣的:

@my_custom_decorator(1) 
def my_decorated_func(): 
    pass 

這是簡單的,如果我有一個做裝飾沒有(1)選項:

def my_custom_decorator(f): 
    @decorator_one 
    @foo 
    @bar 
    def wrapped(): 
     pass 
    return wrapped 

但是我不確定如何公關將參數傳播給第一個包裝器。

在這種情況下,我很自在地假設,如果我將1傳遞給my_custom_decorator,它將始終只是decorator_one的arg。

回答

4

@decorator_one(1)表示存在可返回裝飾器的可調用對象;稱它爲裝飾者工廠decorator_one(1)返回應用於該函數的裝飾器。

上的爭論只是通過從自己的裝飾廠:

def my_custom_decorator(*args, **kwargs): # the factory 
    def decorator(f):      # the decorator 
     @decorator_one(*args, **kwargs) 
     @foo 
     @bar 
     def wrapped(): 
      pass 
     return wrapped 
    return decorator 

我以前*args, **kwargs對任意參數傳遞給包裹裝飾廠decorator_one(),但你也可以使用顯式命名PARAMATERS。

0

是的,你需要一個裝飾工廠。

我找到了解決方案使用一類更有吸引力,因爲它的工廠和裝飾分離:

class my_custom_decorator(object): 

    __init__(self, *args, **kwargs): # the factory 
     self.args = args 
     self.kwargs = kwargs 

    __call__(self, f): # the decorator 
     @decorator_one(*self.args, **self.kwargs) 
     @foo 
     @bar 
     def wrapped(): 
      pass 

     return wrapped