匿名功能/闭合问题

Anonymous function / Closure issue

提问人:zeniapy 提问时间:3/7/2019 最后编辑:martineauzeniapy 更新时间:3/7/2019 访问量:35

问:

我想创建一个具有已实现的调用函数的类。线索是,在初始化 Objective 类时,会移交一个调用的变量,该变量可以是数学函数字符串,也可以是 python 函数本身。现在的任务是找出输入是什么(字符串或可调用函数)并声明变量/函数,这是 的返回。 现在的代码看起来有点像这样:Objectivefunction__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

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

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

python-3.x 闭包 anonymous-function

评论

1赞 Aran-Fey 3/7/2019
“函数 func 的定义仅在 __init__ 中起作用”这根本不是真的。你从哪里得到这个想法?
0赞 zeniapy 3/7/2019
哦,我可能忘了提一个细节。在“init”中至关重要,因为我只想声明类“Objective”,然后调用它。

答:

2赞 juanpa.arrivillaga 3/7/2019 #1

添加任何实例变量的方式: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)

请注意,在定义中不需要 .另请注意,您尚未在任何地方使用匿名功能。您已使用普通函数定义。selffunc

最后,(即使你可能不应该这样做),你需要进入可用的命名空间,所以,一些大意是:xeval

return eval(function, locals())

评论

0赞 zeniapy 3/7/2019
实际上,我使用的是 asteval 而不是 eval。但是,由于这需要另一个导入并且不是问题的直接部分,因此我使用 eval() 对其进行了简化。但是,仍然感谢您的留言!