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
어떻게 든 테스트 및 트레인 데이터 집합을 함수에 전달해야하지만 이러한 매개 변수는 전달되지 않습니다. –
당신이 원하는 것을 더 잘 이해할 수 있도록 장식되지 않은 파이프 라인을 작성할 수 있습니까? 더 따뜻하게 꾸밀 수 있습니까? –