Функция декорированного объекта недоступна для выбора: это не тот же объект, что

#python #multiprocessing #pickle

#питон #многопроцессорная обработка #соленый огурец

Вопрос:

Вообще говоря, у меня есть метод класса, который оформлен, и мне нужно, чтобы он был замаринован (на самом деле я использую multiprocessing для вызова этой оформленной функции), но, как показано ниже, в коде есть ошибка с сообщением Can't pickle lt;function Test.test at 0x7f94b0156b80gt;: it's not the same object as __main__.Test.test .

 import pickle def dump(data, fpath, protocol=2):  fdir = os.path.dirname(fpath)  if not os.path.exists(fdir):  os.makedirs(fdir)  with open(fpath, 'wb') as f:  pickle.dump(data, f) def D(f):  def wrapper(self):  dump(f, '/tmp/a.dump')  return wrapper   class Test():  @D  def test():  print('test') aaa = Test() aaa.test()  

Сообщение об ошибке:

 PicklingError Traceback (most recent call last) /tmp/ipykernel_40891/4137513423.py in lt;modulegt;  16 print('test')  17 aaa = Test() ---gt; 18 aaa.test()  /tmp/ipykernel_40891/4137513423.py in wrapper(self)  8 def D(f):  9 def wrapper(self): ---gt; 10 dump(f, '/tmp/a.dump')  11 return wrapper  12   /tmp/ipykernel_40891/4137513423.py in dump(data, fpath, protocol)  5 os.makedirs(fdir)  6 with open(fpath, 'wb') as f: ----gt; 7 pickle.dump(data, f)  8 def D(f):  9 def wrapper(self):  PicklingError: Can't pickle lt;function Test.test at 0x7f94b0156b80gt;: it's not the same object as __main__.Test.test  

Комментарии:

1. Сообщение об исключении довольно ясно говорит о том, что не работает в вашем примере. Короче говоря, функции маринуются по названию. Поэтому Test.test необходимо проверить, когда файл рассола будет перезагружен, если он больше не является исходной функцией (из-за декоратора), восстановление рассола не будет работать. Может быть, вам следует привести пример вашей проблемы с многопроцессорной обработкой? Это может иметь реальное решение. Ваш текущий пример кода на самом деле не может быть исправлен.