gpt4 book ai didi

Python在类中传递回调函数

转载 作者:太空狗 更新时间:2023-10-30 00:17:28 24 4
gpt4 key购买 nike

我必须尝试从非基于类的编码风格转变为基于类的编码风格,但面临一个问题。 optimize() 函数采用回调函数 mycallback()。该代码在非基于类的方法中运行得非常好,但是当我将它移至基于类的方法时,我收到错误消息“mycallback() 恰好需要 3 个参数(给定 1 个)”。

在基于类的方法中传递回调函数的正确方法是什么?

(A) 非基于类的方法:

def mycallback(model, where):
pass

model = Model()
model.optimize(mycallback)

(B) 基于类的方法:

class A:
def __init__(self):
self.model = Model()

def solve(self):
# Try method 1:
self.model.optimize(self.mycallback()) <--- Error: mycallback() takes exactly 3 arguments (1 given)
# Try method 2:
# self.model.optimize(self.mycallback) <--- Error: Callback argument must be a function

def mycallback(self, model, where):
pass

虽然这是一个关于将回调函数传递给 Gurobi(优化求解器)内置函数的问题,但我认为这是一个更普遍的问题,关于如何将类中定义的回调函数传递给 Python 中的另一个函数。


方法 2 的错误:

   self.model.optimize(self.mycallback)  
File "model.pxi", line 458, in gurobipy.Model.optimize (../../src/python/gurobipy.c:34263)
gurobipy.GurobiError: Callback argument must be a function

看起来很可能是 Gurobi API 问题。想知道是否有任何 Gurobi 开发人员会回应。

最佳答案

通常,self.model.optimize(self.mycallback) 应该有效(注意:mycallback 后没有括号)。

如果代码序列化可调用对象,例如通过管道/套接字发送到另一个进程(即使在不同的机器上),它可能会失败:

from multiprocessing import Pool

class C:
def method(self, i):
return "called", i

if __name__=="__main__":
print(Pool().map(C().method, range(10)))

它适用于可选择方法的最新 Python 版本。

或者如果 model.optimize() 有错误并检查确切的函数类型而不是接受任何可调用函数,它可能会失败。

关于Python在类中传递回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22731161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com