2

这是我的尝试:

deferred.defer(class1().method1, class2.method2, arg)
deferred.defer(class1().method1, class2.method2(), arg)

这两个都失败并出现错误:

Can't pickle <type 'instancemethod'>: it's not found as __builtin__.instancemethod

在另一篇关于如何腌制实例方法的帖子中,建议了 Steven Bethard 的解决方案:http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods 朝向页面底部)

代码失去了格式,我无法成功地使用代码来解决我的延迟问题。

4

1 回答 1

5

要使用的函数deferred.defer必须是这个可直接导入的全局函数。这是因为 Deferred 处理程序几乎肯定会在不同的解释器实例中工作,因此相关函数必须由它导入。

如果class1在您的代码中引用实际的类名,则解决问题的最简单方法是将对其方法的调用包装在全局函数中并将其传递给defer

def deferred_method_call(*args, **kwargs):
    class1.method1(*args, **kwargs)

deferred.defer(deferred_method_call, ...)

另一方面,如果class1只是您指向实际类的变量名称,您可能希望将其作为参数传递给您的函数:

def deferred_method_call(class_, *args, **kwargs):
    class_.method1(*args, **kwargs)

deferred.defer(deferred_method_call, class1, ...)

这是有效的,因为类对象(的实例type)是可挑选的,并且可以作为参数传递给defered 函数。

于 2012-06-28T13:32:41.280 回答