【问题标题】:Anonymous function / Closure issue匿名函数/闭包问题
【发布时间】:2019-03-07 09:13:39
【问题描述】:

我想创建一个类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

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

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

【问题讨论】:

  • "函数func的定义只适用于__init__"这根本不是真的。你是从哪里得到这个想法的?
  • 哦,我可能忘了提一个细节。在“init”中至关重要,因为我只想声明“Objective”类,然后调用它。

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


【解决方案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)

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

最后,(即使您可能不应该这样做),您需要将x 放入eval 可用的命名空间中,因此,效果如下:

return eval(function, locals())

【讨论】:

  • 其实我用的是asteval而不是eval。但是,由于这需要另一个导入并且不是问题的直接部分,因此我使用 eval() 对其进行了简化。不过,还是感谢您的留言!
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2011-06-22
相关资源
最近更新 更多