Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在类中传递回调函数_Python_Python 2.7_Gurobi - Fatal编程技术网

Python在类中传递回调函数

Python在类中传递回调函数,python,python-2.7,gurobi,Python,Python 2.7,Gurobi,我必须尝试从非基于类的编码风格转变为基于类的编码风格,但面临一个问题。optimize()函数接受回调函数mycallback()。该代码在非基于类的方法中工作得非常好,但当我将其移动到基于类的方法时,我得到了一个错误“mycallback()正好接受3个参数(给定1个)” 在基于类的方法中,传递回调函数的正确方法是什么 (A) 非基于类的方法: def mycallback(model, where): pass model = Model() model.optimize(myca

我必须尝试从非基于类的编码风格转变为基于类的编码风格,但面临一个问题。optimize()函数接受回调函数mycallback()。该代码在非基于类的方法中工作得非常好,但当我将其移动到基于类的方法时,我得到了一个错误“mycallback()正好接受3个参数(给定1个)”

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

(A) 非基于类的方法:

def mycallback(model, where):
    pass

model = Model()
model.optimize(mycallback)
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
(B) 基于类的方法:

def mycallback(model, where):
    pass

model = Model()
model.optimize(mycallback)
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 API的问题。不知道是否有Gurobi开发人员会响应。

一般来说,
self.model.optimize(self.mycallback)
应该可以工作(注意:在
mycallback
之后没有参数)

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

它适用于最新的Python版本,其中方法是可选择的


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

如果您从对象中删除回调,那么它会起作用。您可以将其用作解决方法,直到您可以在类中使用回调。也就是说,从类内调用此行

def solve(self):
    self.model.optimize(mycallback)
…在类外调用此函数

def mycallback(self, model, where):     
    pass

一点也不优雅,但希望有一位开发者加入进来

这个问题在gurobi
9.1中仍然存在。我发现一个简单的解决方法是将回调放在类中的方法中,例如:

def solve(self):
    self.model.update()
       def lazyCallback(model, where):
       ...
    self.model.optimize(lazyCallback)

为什么甚至有三个参数,而您所做的只是传递
您不需要调用
self.mycallback()
,将其作为
self.model.optimize(self.mycallback)
传递。请发布使用方法2时看到的完整回溯错误消息。