2017-11-10 2 views
1

python에서 매개 변수 사용 여부에 관계없이 데코레이터 사용과 관련된 많은 질문이 있지만 내 경우는 약간 다릅니다.런타임에 전달되는 매개 변수가있는 장식 자

일반 질문

내가 필요로하는 함수 자체 외에 몇 가지 매개 변수를 받아들이는 장식 (그리고이 인수와 kwargs로를 기능). 그러나 이러한 매개 변수는 데코 레이팅 된 함수가 선언 된 후에 계산됩니다.

내 특정 경우 나는 기계 학습에 대한 pd.DataFrame를 처리하는 함수를 작성했습니다

, 그들은 입력 등의 DF를 얻고 출력으로 DF를 반환합니다. 많은 경우에 한 DF가 아니라 여러 개의 교육 및 테스트 세트를 연결하여 호출해야합니다. 동기 부여는 코드 중복을 싫어하고 대안은 모든 단계를 두 번 호출하는 것입니다 (각 집합에 대해 한 번). 또한 사전 처리 기능의 작성자는 사용자가 종종 한 번에 2 세트를 사용하기를 원한다는 사실에 신경 쓰지 않아야합니다.

코드는 현재처럼 보이는 : 나는

내가 기차를 전달하여 하나 DF에 정의 된 함수를 호출 할 수 있도록이 코드의 클라이언트를하고자 원하는 것은

def train_and_test(preprocess): 
    def preprocess_wrapper(**kwargs): 
    def concat(train, test): 
     train['is_train'] = True 
     test['is_train'] = False 
     return pd.concat([train, test]) 

    def split(full): 
     train = full[full['is_train']] 
     test = full[~full['is_train']] 
     train = train.drop('is_train', axis=1) 
     test = test.drop('is_train', axis=1) 
     assert len(full) == (len(train) + len(test)) 
     return train, test 

    train = kwargs['train'] 
    test = kwargs['test'] 
    full = concat(train, test) 
    processed = preprocess(full) 
    return split(processed) 

return preprocess_wrapper 

@train_and_test # I would like to pass train and test as arguments here but these are loaded by client code 
def my_preprocessor(df): 
    preprocessed = do_something_smart(df) 
    return preprocessed 

및 장식 세트에 테스트 세트. 이 같은 것 :

train, test = pd.read_csv('data/train.csv'), pd.read_csv('data/test.csv') 

train, test = preprocess(train, test) # In reality preprocess signature expects one DF but user can now treat it like it accepted 2 
+0

어떻게 든 테스트 및 트레인 데이터 집합을 함수에 전달해야하지만 이러한 매개 변수는 전달되지 않습니다. –

+0

당신이 원하는 것을 더 잘 이해할 수 있도록 장식되지 않은 파이프 라인을 작성할 수 있습니까? 더 따뜻하게 꾸밀 수 있습니까? –

답변

0

우리는 더 깊게 갈 필요가 있습니다!

데코레이터는 함수에서 작동하는 함수입니다.

글쎄, 왜 함수에서 작동하는 함수를 반환하는 함수를 작성하지 않으시겠습니까?

def paramizer(*args): 
    def normal_decorator(f): 
     ...stuff that uses the decorator args to customize behavior... 
     def wrapper(): 
      ...stuff decorating f... 
      return f() 
     return wrapper 
    return normal_decorator 

@paramizer(arg1, arg2) #=> returns a customized decorator and applies it to function 
def function() 
+0

'arg1'과'arg2'는 런타임에만 알려져 있습니다. 이 작업은 ('f = paramizer (train, test) (myfunc)'런타임에 명시 적으로 꾸며 내지 않는 한) 작동하지 않습니다. –