匿名函数/关闭问题
Anonymous function / Closure issue
我想创建一个 class Objective
并实现调用函数。线索是,在初始化 Objective class 时,传递了一个名为 function
的变量,它可以是数学函数字符串或 python 函数本身。 __init__
现在的任务是找出输入是什么(字符串或可调用函数)并声明 variable/function func
,即 [=17= 的 return ].
现在的代码看起来有点像这样:
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__
(and 是的,我知道,eval
的实现也不是 100% 正确的,但为了简单起见,我是这样写的)。我的问题是,如何在 __init__
函数的 if
语句中声明函数 func
?我希望我能解释清楚我的问题。
添加任何实例变量的方式,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())
我想创建一个 class Objective
并实现调用函数。线索是,在初始化 Objective class 时,传递了一个名为 function
的变量,它可以是数学函数字符串或 python 函数本身。 __init__
现在的任务是找出输入是什么(字符串或可调用函数)并声明 variable/function func
,即 [=17= 的 return ].
现在的代码看起来有点像这样:
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__
(and 是的,我知道,eval
的实现也不是 100% 正确的,但为了简单起见,我是这样写的)。我的问题是,如何在 __init__
函数的 if
语句中声明函数 func
?我希望我能解释清楚我的问题。
添加任何实例变量的方式,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())