2012-06-28 1 views
1

Вот мои попытки:Как вы передаете метод класса, как пары из deferred.defer на GAE

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 

В другом посте о том, как было предложено решение Стивена Бетарда: http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods (в нижней части страницы)

Код потерял свое форматирование, и я не смог успешно использовать co де, чтобы решить мою отложенную проблему.

+0

Вы не должны называть класс. try 'class1.method1' – aschmid00

ответ

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), могут быть переданы в качестве аргументов для defer ed функций.

+0

Что делать, если я собираюсь использовать экземпляр класса, в котором я сейчас? Например, '' ' класс Foo(): Защита бита(): deferred.defer (defer_function, самость) defer_function (класс): class.method1() ' '' Но это приведет к непривычному экземпляру –

 Смежные вопросы

  • Нет связанных вопросов^_^