我不得不尝试从非基于类的编码风格转变为基于类的编码风格,但面临一个问题。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的问题。不知道是否有任何古罗比开发人员会回应。
似乎如果从对象中移除回调,那么它就会工作。您可以将其用作解决方法,直到可以在类中使用回调为止。也就是说,从类内调用这一行。。。
…在课堂之外的这个函数。
一点也不优雅,但希望有一个开发人员加入进来。
一般来说,
self.model.optimize(self.mycallback)
应该可以工作(注意:在mycallback
之后没有paren)。如果代码序列化可调用,例如通过管道/套接字发送到另一个进程(即使在不同的计算机上),则可能会失败:
它适用于最新的Python版本,其中的方法是可拾取的。
或者,如果
model.optimize()
有一个bug并检查确切的函数类型,而不是接受任何可调用的函数类型,那么它可能会失败。相关问题 更多 >
编程相关推荐