提问人:zeniapy 提问时间:3/7/2019 最后编辑:martineauzeniapy 更新时间:3/7/2019 访问量:35
匿名功能/闭合问题
Anonymous function / Closure issue
问:
我想创建一个具有已实现的调用函数的类。线索是,在初始化 Objective 类时,会移交一个调用的变量,该变量可以是数学函数字符串,也可以是 python 函数本身。现在的任务是找出输入是什么(字符串或可调用函数)并声明变量/函数,这是 的返回。
现在的代码看起来有点像这样:Objective
function
__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__
eval
func
if
__init__
答:
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)
请注意,在定义中不需要 .另请注意,您尚未在任何地方使用匿名功能。您已使用普通函数定义。self
func
最后,(即使你可能不应该这样做),你需要进入可用的命名空间,所以,一些大意是:x
eval
return eval(function, locals())
评论
0赞
zeniapy
3/7/2019
实际上,我使用的是 asteval 而不是 eval。但是,由于这需要另一个导入并且不是问题的直接部分,因此我使用 eval() 对其进行了简化。但是,仍然感谢您的留言!
评论
__init__
中起作用”这根本不是真的。你从哪里得到这个想法?