wai*_*ani 1 python google-app-engine pickle
以下是我的尝试:
deferred.defer(class1().method1, class2.method2, arg)
deferred.defer(class1().method1, class2.method2(), arg)
Run Code Online (Sandbox Code Playgroud)
这两个都失败了,错误:
Can't pickle <type 'instancemethod'>: it's not found as __builtin__.instancemethod
Run Code Online (Sandbox Code Playgroud)
在另一篇关于如何挑选实例方法的文章中,提出了Steven Bethard的解决方案:http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods (在页面底部)
代码已丢失其格式,我无法成功使用代码来解决我的延迟问题.
要使用的功能deferred.defer必须是这个可直接导入的全局功能.这是因为Deferred处理程序几乎肯定会在不同的解释器实例中工作,因此必须由它导入有问题的函数.
如果class1在您的代码中引用实际的类名,解决该问题的最简单方法是将对其方法的调用包装在global函数中并将其传递给defer:
def deferred_method_call(*args, **kwargs):
class1.method1(*args, **kwargs)
deferred.defer(deferred_method_call, ...)
Run Code Online (Sandbox Code Playgroud)
另一方面,如果class1只是变量的名称,则指向实际的类,您可能希望将其作为参数传递给函数:
def deferred_method_call(class_, *args, **kwargs):
class_.method1(*args, **kwargs)
deferred.defer(deferred_method_call, class1, ...)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为类对象(实例type)是可选择的,可以作为参数传递给defered函数.