为什么我要在 Python 中传递动态函数时遇到问题



我将动态地将一个函数传递给另一个类,如下所示

class simulator(object):
def __init__(self, fn_):
print(self.test(fn_))

def test(self, fn):
return  fn(self, 20)

class t(object):
s = 'def get_fitness(x, y):n return x+y'
exec(s)
def fnGetFitness(self,genes):
return get_fitness(genes, 10)
simulator(fnGetFitness)

t()

但我在下面遇到错误:

File "N:/Job/GA/mine/dyn.py", line 25, in fnGetFitness
return get_fitness(genes, 10)
NameError: name 'get_fitness' is not defined

我想它与范围有关,但我无法处理它 有人对此吗?

编辑:

这是一个更简单的代码,显示了问题:

class t(object):
def __init__(self):
exec('def get_fitness(x, y):n return x+y')
print(get_fitness(2,3))
t()

exec无关。您正在执行的操作等效于(删除了安全性(:

class t(object):
def get_fitness(x,y):
return x+y

但是您的方法定义在类级别,而不是在simulator类上。

simulator(fnGetFitness)调用fnGetFitnesst类上下文之外,因此它不知道您的新函数。

这不起作用(也get_fitness应该装饰为@staticmethod,因为它没有self参数(

有效的方法是在全局级别动态(或不(定义函数,以便类可以调用它

s = 'def get_fitness(x, y):n return x+y'
exec(s)
class t(object):
def fnGetFitness(self,genes):
return get_fitness(genes, 10)
simulator(fnGetFitness)
t()

修复了它,但老实说我对目的感到困惑(我已经花了一段时间来弄清楚如何从您的代码运行某些东西(

编辑:一个更简单且以某种方式不同(和exec相关(的代码已发布在评论中:

class t(object):
def __init__(self):
exec('def get_fitness(x, y):n return x+y')
print(get_fitness(2,3))
t()

这引起了NameError: name 'get_fitness' is not defined

现在这与exec有关.当解析__init__时,get_fitness是未知的,因为解析器没有将其视为局部变量,即使在执行时,它也是由exec在字典中设置locals()(相关:为什么"ord"在这里被视为未赋值的变量?

解决方法是在局部变量中获取函数,如下所示:

class t(object):
def __init__(self):
exec('def get_fitness(x, y):n return x+y')
print(locals()["get_fitness"](2,3))
t()

这工作和打印5

相关内容

  • 没有找到相关文章

最新更新