2013-05-11 2 views
1

사용자 지정 함수를 통해 일부 값을 변환하는 클래스가 있습니다. 함수에 대한 참조는 생성자에서 전달되고 특성으로 저장됩니다. 나는 피클하거나 수업을 복사 할 수 있기를 원합니다. __ getstate __() 메서드에서 필독 또는 복사를 위해 안전하게 사전 항목을 문자열로 변환합니다. 그러나 __ setstate __() 메서드에서 문자열을 함수 참조로 다시 변환하려고합니다. 따라서 새 클래스가 값을 변환 할 수 있습니다.파이썬에서 문자열을 함수 참조로 변환하는 방법

class transformer(object): 
    def __init__(self, values=[1], transform_fn=np.sum): 
     self.values = deepcopy(values) 
     self.transform_fn = transform_fn 
    def transform(self): 
     return self.transform_fn(self.values) 
    def __getstate__(self): 
     obj_dict = self.__dict__.copy() 
     # convert function reference to string 
     obj_dict['transform_fn'] = str(self.transform_fn) 
     return obj_dict 
    def __setstate__(self, obj_dict): 
     self.__dict__.update(obj_dict) 
     # how to convert back from string to function reference? 

전달되는 함수 참조는 모든 함수가 될 수 있으므로 고정 된 함수 참조 집합이있는 사전을 포함하는 솔루션은 실제/유연성이 충분하지 않습니다. 나는 다음과 같이 사용할 것이다.

from copy import deepcopy 
import numpy as np 

my_transformer = transformer(values=[0,1], transform_fn=np.exp) 
my_transformer.transform() 

이 출력 : 배열 ([1, 2.71828183])는

new_transformer = deepcopy(my_transformer) 
new_transformer.transform() 

이 날을 준다 : 형식 오류를 예상대로 'STR'객체가 호출 아니다.

답변

2

dir을 사용하여 지정된 범위의 이름에 액세스 한 다음 getattr을 사용하여 검색 할 수 있습니다. 당신이 알고있는 경우

예를 들어, 함수는 numpy에 :이 다른 모듈/범위에보고하도록 확장 할 수

import numpy 

attrs = [x for x in dir(numpy) if '__' not in x] # I like to ignore private vars 

if obj_dict['transform_fn'] in attrs: 
    fn = getattr(numpy, obj_dict['transform_fn']) 
else: 
    print 'uhoh' 

. 현재 범위에서 검색하려면

, 당신은이 (here에서 연장) 다음을 수행 할 수

import sys 

this = sys.modules[__name__] 

attrs = dir(this) 

if obj_dict['transform_fn'] in attrs: 
    fn = getattr(this, obj_dict['transform_fn']) 
else: 
    print 'Damn, well that sucks.' 

당신은 유형에 따라 바인드합니다를 반복 할 수 서브 모듈/수입 모듈을 검색하려면 (잠재적으로 재귀, 그러나 thisthis의 attr입니다.

+0

매력처럼 작동합니다. 정말 고마워. – worldcitizen

관련 문제