如何在python中将字符串转换为函数引用

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"对象不可调用,如预期的那样。


您可以使用dir访问给定范围中的名称,然后使用getattr检索这些名称。

例如,如果您知道函数在numpy中:

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(可能是递归的,但请注意,thisthis的ATTR)。