匿名功能/关闭问题

时间:2019-03-07 09:13:40

标签: python python-3.x closures anonymous-function

我想创建一个带有已实现的调用函数的类Objective。提示是,在初始化Objective类时,将传递一个名为function的变量,该变量可以是数学函数字符串或python函数本身。 __init__现在的任务是找出输入是什么(字符串或可调用函数)并声明变量/函数func,这是__call__的返回值。 现在的代码看起来像这样:

class Objective():
    def __init__(self, function):
        if isinstance(function, str):
            def func(self,x):
               return eval(function,x)

        elif callable(function):
            self.func = function

    def __call__(self, x):
        return self.func(x)

声明可能看起来像这样:

def calc1(x):
    return x+1
f = Objective(calc1)
f(1) --> f = 2

OR

f2 = Objective("x+1")
f2(1) --> f2 = 2

现在,正如您中某些人可能已经注意到的那样,如果输入是字符串,则该代码将不起作用,因为函数func的定义仅在__init__中起作用(并且是的,我知道eval的实现也不是100%正确,但为简单起见,我是这样写的)。我的问题是,如何在func函数的if语句中声明函数__init__?我希望我可以理解我的问题。

1 个答案:

答案 0 :(得分:2)

添加任何实例变量self.func = func的方式:

class Objective():
    def __init__(self, function):
        if isinstance(function, str):
            def func(x): # no need for self
               return eval(function, locals())
            self.func = func # here

        elif callable(function):
            self.func = function

    def __call__(self, x):
        return self.func(x)

请注意,您在self的定义中不需要func。还要注意,您没有在任何地方使用匿名函数。您已经使用了普通的函数定义。

最后,(即使您可能不应该这样做),也需要将x放入eval可用的命名空间中,因此,会产生以下作用:

return eval(function, locals())