如何在GAE上将类方法作为deferred.defer的参数传递

时间:2012-06-28 11:58:22

标签: python google-app-engine pickle

以下是我的尝试:

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(在页面底部)

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

1 个答案:

答案 0 :(得分:5)

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

如果代码中的class1引用了实际的类名,解决问题的最简单方法是将对其方法的调用包装在global函数中并将其传递给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的实例)是可选择的,可以作为参数传递给defer ed函数。