How to convert string to function reference in python
我有一个类,它通过用户指定的函数转换一些值。对函数的引用在构造函数中传递,并另存为属性。我想能够泡菜或复制课堂。在uuGetState_uuu()方法中,我将字典条目转换为字符串,以确保酸洗或复制的安全。但是,在uu setstate_uu()方法中,我想将字符串转换回函数引用,这样新类可以转换值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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? |
传递的函数引用可以是任何函数,因此涉及具有固定函数引用集的字典的解决方案不够实用/灵活。我会像下面那样使用它。
1 2 3 4 5 | from copy import deepcopy import numpy as np my_transformer = transformer(values=[0,1], transform_fn=np.exp) my_transformer.transform() |
号
此输出:数组([1.,2.71828183])
1 2 | new_transformer = deepcopy(my_transformer) new_transformer.transform() |
这就给了我:typeerror:"str"对象不可调用,如预期的那样。
您可以使用
例如,如果您知道函数在
1 2 3 4 5 6 7 8 | 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' |
这可以扩展到其他模块/作用域中。
如果要在当前范围内搜索,可以执行以下操作(从这里扩展):
1 2 3 4 5 6 7 8 9 10 | 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.' |
号
要搜索子模块/导入的模块,可以根据类型迭代ATTR(可能是递归的,但请注意,